面對單機資料庫容量與效能瓶頸,橫向擴展(Sharding)是低成本解決方案。本文深入解析一致性 Hash 算法原理,並示範如何結合 Solr 建立分散式搜尋叢集。
-- 9 筆資料,2 節點:id % 2
-- 節點 1: 1,3,5,7,9 | 節點 2: 2,4,6,8
-- 擴充至 3 節點:id % 3
-- 節點 1: 1,4,7 | 節點 2: 2,5,8 | 節點 3: 3,6,9
-- 結果:幾乎所有資料都需遷移!
資料量達億級/TB 級時,遷移成本極高(數小時~數天),且遷移期間原叢集負載飆升。
建構 2^32 (約 42 億) 個虛擬節點環,每台實體機器透過 Hash(IP/Hostname)映射到環上多個位置。
資料 Key 經相同 Hash 函數映射到環上,順時針尋找最近的節點儲存。
實體節點少時,Hash 分佈不均導致熱點。解法:每台實體機器虛擬化為多個虛擬節點(如 1a,1b,1c...),均勻分佈於環上。
放棄 SolrCloud + ZooKeeper(寫入延遲高),改用自管一致性 Hash 分片:
┌─────────────┐
寫入請求 ───────▶│ 分片管理層 │──▶ 一致性 Hash 路由 ▶ 目標 Solr 寫入節點
└─────────────┘
│
┌──────┴──────┐
▼ ▼
┌────────────┐ ┌────────────┐
│ 索引建立節點│ │ 索引備份節點│
└────────────┘ └────────────┘
│ │
▼ ▼
┌────────────┐ ┌────────────┐
│ 查詢讀取節點│ │ 查詢讀取節點│ (讀寫分離)
└────────────┘ └────────────┘
| 角色 | 職責 |
|---|---|
| 分片管理層 | 維護一致性 Hash 環、路由計算、節點健康檢查、擴縮容協調 |
| 寫入/建立節點 | 接收索引建立/更新請求、寫入 InnoDB/Solr 索引 |
| 備份節點 | 同步索引備份、故障快速恢復 |
| 讀取節點 | 專責查詢服務、隔離寫入負載 |
| 叢集管理 | 監控節點狀態、告警、自動容錯切換 |
按業務域劃分獨立叢集:用戶叢集、微博叢集、商品叢集... 各自獨立擴展,互不干擾。
MD5、MurmurHash、CRC32,需客戶端/伺服器端一致