1. 程式人生 > >分散式系統中的一致性hash初探

分散式系統中的一致性hash初探

  在分散式式系統中,為了分散訪問壓力,每個模組需要由多個節點組成叢集,共同來提供服務,客戶端根據一定的負載均衡策略來訪問叢集的各個節點,由此引入了一些問題,如在訪問壓力增大的情況需要要增加節點,或是叢集其中的一個節點突然掛掉,如何將原有節點上的請求壓力重新負載到新的節點叢集上。

  我們常用的負載均衡策略有隨機(加權)、輪詢,最小連線數、最短響應時間,雜湊,以及我們今天要說的一致性hash。

一、一致性hash與其他負載均衡策略的對比

  首先我們來分析下一致性hash相對前面幾種負載均衡策略的優勢,

  輪詢:各個伺服器的效能可能不一致,該策略將節點視為等同,與實際中複雜的環境不符。加權輪詢為輪詢的一個改進策略,每個節點會有權重屬性,但是因為權重的設定難以做到隨實際情況變化,仍有一定的不足

  隨機:與輪詢類似,根據不同的隨機演算法隨機訪問各個節點,可通過加權做一定擴充套件。

  最小響應時間:通過記錄每次請求所需的時間,得出平均的響應時間,然後根據響應時間選擇最小的響應時間。該策略能較好地反應伺服器的狀態,但是由於是平均響應時間的關係,時間上有些滯後,無法滿足快速響應的要求。因此在此基礎之上,會有一些改進版本的策略,如只計算最近若干次的平均時間的策略等

  最小連線數:把請求分配給活動連線數最小的後端伺服器。它通過活動來估計伺服器的負載。比較智慧,但需要維護後端伺服器的連線列表。

  最小併發數:客戶端的每一次請求服務在伺服器停留的時間可能會有較大的差異,隨著工作時間加長,如果採用簡單的輪循或隨機均衡演算法,每一臺伺服器上的連線程序可能會產生較大的不同,並沒有達到真正的負載均衡。最小併發數的策略則是記錄了當前時刻,每個備選節點正在處理的事務數,然後選擇併發數最小的節點。該策略能夠快速地反應伺服器的當前狀況,較為合理地將負責分配均勻,適用於對當前系統負載較為敏感的場景。

  雜湊:上面幾種負載均衡方式在對於後端來說,有個重要的問題是若是一系列業務的多個請求,會被負載到幾個節點上,不利於統一處理,而相同業務都負載到同一節點還有利於提高快取命中率,便於維護長連線等,常見的hash有hash取模根據業務的需要,將對應屬性取得hash值,然後除以節點個數,取餘數分佈到不同對應編號的節點上。但是有個缺點是在增減節點的時候,需將所有的請求重新計算負載節點,較為耗費資源。

  

二、一致性hash的背景

  一致性雜湊演算法(Consistent Hashing)在1997年由麻省理工學院提出的一種分散式雜湊(DHT)實現演算法,設計目標是為了解決因特網中的熱點(Hot spot)問題。

三、一致性hash的演算法實現概要

  先構造一個長度為232的整數環(這個環被稱為一致性Hash環),根據節點名稱的Hash值(其分佈為[0, 232-1])將伺服器節點放置在這個Hash環上,然後根據資料的Key值計算得到其Hash值(其分佈也為[0, 232-1]),接著在Hash環上順時針查詢距離這個Key值的Hash值最近的伺服器節點,完成Key到伺服器的對映查詢。