分布式緩存一致性hash算法理解
今天閱讀了一下大型網絡技術架構這本蘇中的分布式緩存一致性hash算法這一節,針對大型分布式系統來說,緩存在該系統中必不可少,分布式集群環境中,會出現添加緩存節點的需求,這樣需要保障緩存服務器中對緩存的命中率,就有很大的要求了:
采用普通方法,將key值進行取hash後對分布式緩存機器數目進行取余,以集群3臺分布式緩存為例子:
對於數據進行取hash值然後對3其進行取余,余數為0則進入node 0,余數位1則進入node1,余數位2則進入node2.
如果增加一個節點則對4進行取余,則會將node0中的部分,node1中的部分,node2中的部分分割到node3中,則出現了命中率為75%
如果增加2個節點的話則對5進行取余,則只有3/5的機器被命中
普通方法的設計會導致當你的節點添加的數目越多,導致你的命中率越低導致對數據庫的操作壓力就越大
采用一致性Hash算法:
構造一個0~2^32的整數環,然後將節點的名稱比如說node0對其進行取hash值將其分布在該店上,
然後將key值取hash值後進行比較:
舉例:node0的hash值為432323232;node1 hash值為879798098,則如果key1的hash值為559798098,則其大於node0的hashi值,則順時針旋轉,找到了node1則將其存放在node1中的緩存中。
擴容後,將三個變成4個
在node2和node0中插入一個node3,則導致node2到node1中中原先存放在node1中的數據分成兩半,node2-node3部分存放在node3中,node3和node1的存放在node1中,則可以看出node0-node2以及node0-node1中這段沒有改變。則也是75%但是還有問題就是node2和node0的負載數是node2的一倍,所以還是得出現解決辦法
引用虛擬的方式:將一個物理分布式緩存服務器分層n個虛擬機,分布在這個圓環周圍,由於hash散列的不規則性,他會分布於不同的區域,見下圖,如果再次插入新服務器之後,他會在器分布的虛擬機器上不規則的分布於各個點中,則會比較均勻的分布在各個環中,這樣影響的可以將上面的問題解決了。
根據該書說明,在實踐中,一臺物理服務器虛擬成150個虛擬服務器節點合適。
分布式緩存一致性hash算法理解