對於分布式快取來說,當乙個節點接收到請求,如果該節點並沒有儲存快取值,那麼它面臨的難題是,從誰那獲取資料?自己,還是節點1, 2, 3, 4… 。假設包括自己在內一共有 10 個節點,當乙個節點接收到請求時,隨機選擇乙個節點,由該節點從資料來源獲取資料。
假設第一次隨機選取了節點 1 ,節點 1 從資料來源獲取到資料的同時快取該資料;那第二次,只有 1/10 的可能性再次選擇節點 1, 有 9/10 的概率選擇了其他節點,如果選擇了其他節點,就意味著需要再一次從資料來源獲取資料,一般來說,這個操作是很耗時的。這樣做,一是快取效率低,二是各個節點上儲存著相同的資料,浪費了大量的儲存空間。
那有什麼辦法,對於給定的 key,每一次都選擇同乙個節點呢?使用 hash 演算法也能夠做到這一點。那把 key 的每乙個字元的 ascii 碼加起來,再除以 10 取餘數可以嗎?當然可以,這可以認為是自定義的 hash 演算法。
從上面的圖可以看到,任意乙個節點任意時刻請求查詢鍵tom
對應的值,都會分配給節點 2,有效地解決了上述的問題。
簡單求取 hash 值解決了快取效能的問題,但是沒有考慮節點數量變化的場景。假設,移除了其中一台節點,只剩下 9 個,那麼之前hash(key) % 10
變成了hash(key) % 9
,也就意味著幾乎快取值對應的節點都發生了改變。即幾乎所有的快取值都失效了。節點在接收到對應的請求時,均需要重新去資料來源獲取資料,容易引起快取雪崩
。
快取雪崩:快取在同一時刻全部失效,造成瞬時db請求量大、壓力驟增,引起雪崩。常因為快取伺服器宕機,或快取設定了相同的過期時間引起。那如何解決這個問題呢?一致性雜湊演算法可以。
一致性雜湊演算法將 key 對映到 2^32 的空間中,將這個數字首尾相連,形成乙個環。
環上有 peer2,peer4,peer6 三個節點,key11
,key2
,key27
均對映到 peer2,key23
對映到 peer4。此時,如果新增節點/機器 peer8,假設它新增位置如圖所示,那麼只有key27
從 peer2 調整到 peer8,其餘的對映均沒有發生改變。
也就是說,一致性雜湊演算法,在新增/刪除節點時,只需要重新定位該節點附近的一小部分資料,而不需要重新定位所有的節點,這就解決了上述的問題。
如果伺服器的節點過少,容易引起 key 的傾斜。例如上面例子中的 peer2,peer4,peer6 分布在環的上半部分,下半部分是空的。那麼對映到環下半部分的 key 都會被分配給 peer2,key 過度向 peer2 傾斜,快取節點間負載不均。
為了解決這個問題,引入了虛擬節點的概念,乙個真實節點對應多個虛擬節點。
假設 1 個真實節點對應 3 個虛擬節點,那麼 peer1 對應的虛擬節點是 peer1-1、 peer1-2、 peer1-3(通常以新增編號的方式實現),其餘節點也以相同的方式操作。
虛擬節點擴充了節點的數量,解決了節點較少的情況下資料容易傾斜的問題。而且代價非常小,只需要增加乙個字典(map)維護真實節點與虛擬節點的對映關係即可。
一致性雜湊
直接貼出一篇介紹的很清楚的博文。關鍵字一致性雜湊 平衡性,單調性,分散性,負載 其實說白了,就是解決把請求分散到不同的機器上運算,怎麼做分散的平均,機器少一台多一台,或者壞掉一台,成很好的自適應和拓展。最簡單的實現分布式演算法,取模嘛,但是它就上述的一些問題,所以不算好的雜湊函式。一致性雜湊演算法,...
一致性雜湊
from 學習分布式,一致性雜湊是最最基礎的知識,所以要理解好.那什麼是一致性雜湊呢?what 1.平衡性是指 hash的結果應該平均分配到各個節點,這樣從演算法上就解決了負載均衡問題.2.單調性是指 在新增或者刪減節點時,同乙個key訪問到的值總是一樣的.3.分散性是指 資料應該分散的存放在 分布...
一致性雜湊
一致性 雜湊演算法在1997年由 麻省理工學院提出 參見擴充套件閱讀 1 設計目標是為了解決網際網路中的熱點 hot spot 問題,初衷和 carp十分類似。一致性雜湊修正了carp使用的簡單雜湊演算法帶來的問題,使得dht可以在p2p環境中真正得到應用。雜湊演算法 編輯 一致性雜湊提出了在動態變...