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

  在分佈式式系統中,爲了分散訪問壓力,每一個模塊須要由多個節點組成集羣,共同來提供服務,客戶端根據必定的負載均衡策略來訪問集羣的各個節點,由此引入了一些問題,如在訪問壓力增大的狀況須要要增長節點,或是集羣其中的一個節點忽然掛掉,如何將原有節點上的請求壓力從新負載到新的節點集羣上。算法

  咱們經常使用的負載均衡策略有隨機(加權)、輪詢,最小鏈接數、最短響應時間,哈希,以及咱們今天要說的一致性hash。後端

1、一致性hash與其餘負載均衡策略的對比緩存

  首先咱們來分析下一致性hash相對前面幾種負載均衡策略的優點,服務器

  輪詢:各個服務器的性能可能不一致,該策略將節點視爲等同,與實際中複雜的環境不符。加權輪詢爲輪詢的一個改進策略,每一個節點會有權重屬性,可是由於權重的設置難以作到隨實際狀況變化,仍有必定的不足併發

  隨機:與輪詢相似,根據不一樣的隨機算法隨機訪問各個節點,可經過加權作必定擴展。負載均衡

  最小響應時間:經過記錄每次請求所需的時間,得出平均的響應時間,而後根據響應時間選擇最小的響應時間。該策略能較好地反應服務器的狀態,可是因爲是平均響應時間的關係,時間上有些滯後,沒法知足快速響應的要求。所以在此基礎之上,會有一些改進版本的策略,如只計算最近若干次的平均時間的策略等分佈式

  最小鏈接數:把請求分配給活動鏈接數最小的後端服務器。它經過活動來估計服務器的負載。比較智能,但須要維護後端服務器的鏈接列表。性能

  最小併發數:客戶端的每一次請求服務在服務器停留的時間可能會有較大的差別,隨着工做時間加長,若是採用簡單的輪循或隨機均衡算法,每一臺服務器上的鏈接進程可能會產生較大的不一樣,並無達到真正的負載均衡。最小併發數的策略則是記錄了當前時刻,每一個備選節點正在處理的事務數,而後選擇併發數最小的節點。該策略可以快速地反應服務器的當前情況,較爲合理地將負責分配均勻,適用於對當前系統負載較爲敏感的場景。設計

  哈希:上面幾種負載均衡方式在對於後端來講,有個重要的問題是如果一系列業務的多個請求,會被負載到幾個節點上,不利於統一處理,而相同業務都負載到同一節點還有利於提升緩存命中率,便於維護長鏈接等,常見的hash有hash取模根據業務的須要,將對應屬性取得hash值,而後除以節點個數,取餘數分佈到不一樣對應編號的節點上。可是有個缺點是在增減節點的時候,需將全部的請求從新計算負載節點,較爲耗費資源。進程

  

2、一致性hash的背景

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

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

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

相關文章
相關標籤/搜索