雜湊演算法是根據hash值將不同的value對映到相應的位置的過程。
那麼在分布式中,【比如memcached】,需要將不同的快取物件按照相應的hash演算法對映到相應的機器上去,那麼當新增一台機器或者是其中某一台機器宕機之後,如果按照最原始的key%n的形式來做hash的話,需要將快取清空,然後重新將內容對映到所有的機器上,這樣的代價是巨大的。
於是粗線了一致性雜湊。簡單來說,一致性雜湊將整個雜湊值空間組織成乙個虛擬的圓環,如假設某雜湊函式h的值空間為0~2^32-1,如下圖所示:
整個空間按順時針方向組織。0和232-1在零點中方向重合。
下一步將伺服器使用h
【hash演算法】進行雜湊(
具體可以選擇伺服器的ip或主機名作為關鍵字進行雜湊),對映到雜湊環上的某個位置,這裡假設將三颱伺服器使用ip位址雜湊後在環空間的位置如下:
伺服器布置好之後,就要對映資料了。
使用如下演算法對映資料到相應伺服器:將資料key使用相同的函式h【hash演算法】計算出雜湊值h【根據h確定此資料在環上的位置】。從此位置沿環順時針「行走」,第一台遇到的伺服器就是其應該對映到的伺服器。
例如我們有a、b、c、d四個資料物件,經過雜湊計算後,在環空間上的位置如下:
根據一致性雜湊演算法,資料a會被定為到server 1上,d被定為到server 3上,而b、c分別被定為到server 2上。
------------------------------------------混個混個----------------------------------------------
上面是講一致性雜湊的伺服器布置和key-value的對映過程。
下面說一致性雜湊的擴充套件性和容錯性。
現假設server 3宕機了:
可以看到此時a、c、b不會受到影響,只有d節點被重定位到server 2【這在分布式中是很好定位的,比如說server3宕機了,那麼根據一致性雜湊算反,查詢的時候,會發現d在server2上,但是在server3剛剛宕機的時候,server2上並沒有d,此時應用會把資料快取到server2上,此時,d就被hash到server2上了
】。下面考慮另外一種情況,如果我們在系統中增加一台伺服器memcached server 4:
此時,b不會去server2查詢資料了,而會在server4上查詢,如果b此時不存在於server4上,那麼會快取從資料庫取回來的b在server4上。而server2上的資料,會因為時間太久沒有被訪問或者是因為超時而被memcached清理掉了。綜上所述,一致性雜湊演算法對於節點的增減都只需重定位環空間中的一小部分資料,具有較好的容錯性和可擴充套件性。
一致性雜湊的缺點
當然,萬物都是有兩面性的。
一致性雜湊演算法在服務節點太少時,容易因為節點分部不均勻而造成資料傾斜問題。例如我們的系統中有兩台伺服器,其環分布如下:
那麼此時資料大部分會存到server1中,而2中會因為距離1太近而有很少的資料。為了解決這種資料傾斜問題,一致性雜湊演算法引入了虛擬節點機制,即對每乙個服務節點計算多個雜湊【具體可以這麼做:根據伺服器的名字或者是ip計算節點hash的時候,可以加上編號,然後再計算雜湊值】,在每個計算的結果位置都放置乙個服務節點,稱為虛擬節點。這樣,資料再被儲存的時候,就不會因為伺服器在環上的間距太大而導致「資料傾斜」了。
至於memcached 的分布式,則完全由客戶端實現。這種分布式是memcached最大的特點。
目前一致性雜湊是分布式的標準配置。
分布式 一致性雜湊演算法
一致性雜湊演算法,作為分布式計算的資料分配參考,比傳統的取模,劃段都好很多 傳統雜湊取模,在資料需要遷移時代價巨大,因此需要優化。一致性雜湊 將雜湊值看作乙個環,順時針將雜湊值接近節點的物件存到對應節點,通過這種演算法做資料分布,在增減節點的時候,可以大大減少資料的遷移規模。此時,可能會出現乙個問題...
分布式一致性雜湊分析
現在實際應用中,我們使用redis作為我們的快取伺服器,假如現在我們的使用三颱redis伺服器用來作為快取 redis01,redis02,redis03 現在我們需要把我們的資料均勻的存放到三個redis伺服器上 對於redis伺服器來說,並沒有實現分布式集群,所謂的redis的分布式集群是指由客...
分布式與一致性雜湊
一致性雜湊演算法 一致性雜湊演算法主要用來解決分布式的問題。我們定義乙個圓環 0 2 32 1 我們根據一定的雜湊函式計算出資料的key然後利用hash結構儲存相應的val或這key val,如果 出現了hash衝突我們可以採用鏈位址法或者線性探測法加以解決,我們可以保證最大效率的 查詢到這個key...