分布式系統中的一致性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到服務器的映射查找。
分布式系統中的一致性hash初探