當我們在資料庫中儲存海量資料時,由於單錶資料存在上限,所以不得不分庫分表儲存。假設我們有2000w條資料,而單錶上限為500w,我們部署了4臺資料庫伺服器來儲存這些資料,當我們需要查詢某一條資料時,我們對四個資料庫進行逐個查詢,顯然這樣做效率太低。因此我們可以使用雜湊演算法,建立資料與資料庫伺服器之間的對映關係,儲存資料時,將資料某屬性(盡量保證唯一性)進行雜湊,結果模4,用來選擇將該條資料儲存在哪台伺服器上。這樣當查詢資料時,使用相同的雜湊演算法,就可直接定位到該資料儲存的伺服器,而不必對每個伺服器進行查詢,只需在某一伺服器查詢。
上述雜湊已經解決了分布式儲存資料查詢效率的問題。
但是,當對系統中伺服器數量進行增加或減少時,由原來的4變為5或3,這將導致之前建立的對映關係大規模失效,因為在儲存時模4,而在查詢時因伺服器數量變化需模3或5。因此每當伺服器增加或減少時,我們需要對所以資料重新建立對映,重新儲存。顯然代價是巨大的。而一致性雜湊有效的解決了這一問題。
在上面進行雜湊運算時,我們對結果模資料庫伺服器的數量,而一致性雜湊再取模時模2^32(整形最大值),一致性雜湊演算法將結果取值範圍組織成乙個虛擬的環,整個空間按順時針組織,具體如下:
(1)一開始,分別對4臺伺服器各自的ip進行雜湊,確定每一台伺服器在該環中的位置,結果如下:
(2)將資料使用相同的雜湊演算法計算出雜湊值,確定每條資料在環中的位置,從該位置順時針前進,遇到的第一台伺服器就是該資料應該被儲存到的伺服器。如下:
當系統中新加入伺服器時,如圖:
根據相同的雜湊演算法確定新增伺服器的位置,圖中servere。可以看出,此時並不影響servera serverb serverd,只是原本儲存於serverc上的位於serverb和servere之間的資料(如data5)需要從新儲存到servere。
當系統中伺服器數量減少時:
我們只需將原本儲存在serverb中的資料(如data2)儲存到serverc即可,而不影響severa serverd以及serverc中原本的資料。
總結:與未使用一致性雜湊演算法相比,一致性雜湊演算法避免了系統中節點數目發生變化時所有資料重新載入的問題,減少了不必要的消耗。總之一致性雜湊大大減少了分布式系統中節點數量改變時需重新載入的資料總量。
參考:
一致性雜湊
直接貼出一篇介紹的很清楚的博文。關鍵字一致性雜湊 平衡性,單調性,分散性,負載 其實說白了,就是解決把請求分散到不同的機器上運算,怎麼做分散的平均,機器少一台多一台,或者壞掉一台,成很好的自適應和拓展。最簡單的實現分布式演算法,取模嘛,但是它就上述的一些問題,所以不算好的雜湊函式。一致性雜湊演算法,...
一致性雜湊
from 學習分布式,一致性雜湊是最最基礎的知識,所以要理解好.那什麼是一致性雜湊呢?what 1.平衡性是指 hash的結果應該平均分配到各個節點,這樣從演算法上就解決了負載均衡問題.2.單調性是指 在新增或者刪減節點時,同乙個key訪問到的值總是一樣的.3.分散性是指 資料應該分散的存放在 分布...
一致性雜湊
一致性 雜湊演算法在1997年由 麻省理工學院提出 參見擴充套件閱讀 1 設計目標是為了解決網際網路中的熱點 hot spot 問題,初衷和 carp十分類似。一致性雜湊修正了carp使用的簡單雜湊演算法帶來的問題,使得dht可以在p2p環境中真正得到應用。雜湊演算法 編輯 一致性雜湊提出了在動態變...