首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

海量資料分散式搜尋架構:一致性 Hash + Solr 實戰教學

     編輯:MySQL 資料庫相關知識

面對單機資料庫容量與效能瓶頸,橫向擴展(Sharding)是低成本解決方案。本文深入解析一致性 Hash 算法原理,並示範如何結合 Solr 建立分散式搜尋叢集。

為何需要分片?

  • 單機儲存/計算上限(CPU、記憶體、磁碟 I/O)
  • 橫向擴展:廉價機器叢集 > 昂貴單機垂直擴展
  • 業務增長不可預測,需彈性增減節點

傳統取模分片的致命缺陷

-- 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 級時,遷移成本極高(數小時~數天),且遷移期間原叢集負載飆升。

一致性 Hash 核心原理

1. 虛擬環構建

建構 2^32 (約 42 億) 個虛擬節點環,每台實體機器透過 Hash(IP/Hostname)映射到環上多個位置。

2. 資料映射

資料 Key 經相同 Hash 函數映射到環上,順時針尋找最近的節點儲存。

3. 節點變動影響範圍最小化

  • 新增節點:僅影響順時針方向至下一節點之間的資料
  • 移除節點:僅影響該節點負責的資料遷移至下一節點
  • 其他節點資料完全不動

虛擬節點機制解決資料傾斜

實體節點少時,Hash 分佈不均導致熱點。解法:每台實體機器虛擬化為多個虛擬節點(如 1a,1b,1c...),均勻分佈於環上。

架構整合:自管分片 Solr 叢集

放棄 SolrCloud + ZooKeeper(寫入延遲高),改用自管一致性 Hash 分片:

                    ┌─────────────┐
   寫入請求 ───────▶│  分片管理層  │──▶ 一致性 Hash 路由 ▶ 目標 Solr 寫入節點
                    └─────────────┘
                           │
                    ┌──────┴──────┐
                    ▼             ▼
             ┌────────────┐ ┌────────────┐
             │ 索引建立節點│ │ 索引備份節點│
             └────────────┘ └────────────┘
                    │             │
                    ▼             ▼
             ┌────────────┐ ┌────────────┐
             │  查詢讀取節點│ │  查詢讀取節點│  (讀寫分離)
             └────────────┘ └────────────┘

關鍵組件職責

角色職責
分片管理層維護一致性 Hash 環、路由計算、節點健康檢查、擴縮容協調
寫入/建立節點接收索引建立/更新請求、寫入 InnoDB/Solr 索引
備份節點同步索引備份、故障快速恢復
讀取節點專責查詢服務、隔離寫入負載
叢集管理監控節點狀態、告警、自動容錯切換

業務擴展策略

按業務域劃分獨立叢集:用戶叢集、微博叢集、商品叢集... 各自獨立擴展,互不干擾。

實作關鍵點提醒

  • Hash 函數選擇:MD5、MurmurHash、CRC32,需客戶端/伺服器端一致
  • 虛擬節點數:建議每實體節點 100-200 個虛擬節點
  • 資料遷移:擴容時啟動背景遷移任務,採雙寫+驗證模式確保一致性
  • 查詢聚合:跨分片查詢由分片管理層發散並合併結果(MapReduce 模式)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved