萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

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

為何需要水平擴展?

單機資料庫儲存上限受限於硬體,當資料量從 200 萬激增至 600 萬時,垂直擴展(升級硬體)成本指數級上升。水平擴展採用多台廉價伺服器分攤負載,擴充彈性大、成本可控。

傳統取模分片的痛點

以 ID % N 路由資料至 N 台機器。當新增機器(N→N+1),絕大多數資料的取模結果改變,觸發大規模資料遷移。億級資料遷移耗時數小時至數天,期間來源庫負載飆升,服務極易不可用。

一致性 Hash:最小化遷移範圍

核心原理

  1. 構建 232 個虛擬節點組成環狀空間(約 42 億節點,足夠支援極大叢集)。
  2. 機器節點以 IP 或 Hostname 經 Hash 映射至環上。
  3. 資料 Key 同樣 Hash 映射至環,順時針尋找最近的機器節點儲存。

優勢:新增/移除機器時,僅影響鄰近節點的資料,遷移量約為 1/(N+1),大幅降低擴縮容成本。

虛擬節點解決資料傾斜

實體機器較少時,Hash 分布不均會導致熱點。引入虛擬節點(如每台實體機對應 3 個虛擬節點 1a,1b,1c),使節點在環上分布更均勻,資料負載更平衡。

自建 Solr 分散式架構(棄用 SolrCloud)

實測 SolrCloud 寫入 20 筆資料需數十秒,效能不符預期。改為自管分片:

  • 寫入節點:依一致性 Hash 路由索引建立/更新,支援備份節點熱備。
  • 讀取節點:讀寫分離,專司查詢,避免寫入鎖定影響搜尋效能。
  • 叢集管理節點:監控節點健康、故障轉移、告警。

業務增長時,可依資料類型(用戶、微博等)劃分獨立叢集,各自套用上述架構。

關鍵程式碼片段(Python 示意)

import hashlib, bisect

class ConsistentHash:
    def __init__(self, nodes=None, replicas=100):
        self.replicas = replicas
        self.ring = {}
        self.sorted_keys = []
        if nodes:
            for node in nodes:
                self.add_node(node)

    def _hash(self, key):
        return int(hashlib.md5(key.encode()).hexdigest(), 16) % (2**32)

    def add_node(self, node):
        for i in range(self.replicas):
            key = self._hash(f"{node}#{i}")
            self.ring[key] = node
            self.sorted_keys.append(key)
        self.sorted_keys.sort()

    def get_node(self, key):
        if not self.ring: return None
        hash_val = self._hash(key)
        idx = bisect.bisect(self.sorted_keys, hash_val) % len(self.sorted_keys)
        return self.ring[self.sorted_keys[idx]]
copyright © 萬盛學電腦網 all rights reserved