日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一致性hash算法虚拟节点_Hash算法和一致性Hash算法

發(fā)布時間:2025/4/5 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一致性hash算法虚拟节点_Hash算法和一致性Hash算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Hash算法

Hash 算法在路由算法應(yīng)用中,為了保證數(shù)據(jù)均勻的分布,例如有 3 個桶,分別是 0 號桶, 1 號桶和 2 號桶;現(xiàn)在有 12 個球,怎么樣才能讓 12 個球平均分布到 3 個桶中呢?使用 Hash 算法的做法是,將 12 個球從 0 開始編號,得到這樣的一個序列: 0,1,2,3,4,5,6,7,8,9,10,11 。將這個序列中的每個值模3,不管數(shù)字是什么,得到的結(jié)果都是 0,1,2 ,不會超過 3 ,將結(jié)果為 0 的數(shù)字放入 0 號桶,結(jié)果為 1 的數(shù)子放入 1 號桶,結(jié)果為 2 的數(shù)字放入2號桶,12個球就均勻的分布到 3 個桶中, 0,3,6,9,12 號球放入 0 號桶, 1,4,7,10 號球放入 1 號桶, 2,5,8,11 號球放入 2 號桶。

一致性Hash算法

一致性 Hash 算法在 1997 年由麻省理工學院提出的一種分布式哈希 (DHT) 實現(xiàn)算法,設(shè)計目標是為了解決因特網(wǎng)中的熱點 (Hot Spot) 問題,初衷和 CARP 十分相似。一致性 Hash 修正了 CARP 使用的簡單哈希算法帶來的問題,使得分布式哈希 (DHT) 可以在 P2P 環(huán)境中真正得到應(yīng)用。

一致性 Hash 算法也是使用取模的方法,只是,剛才描述的取模法是對服務(wù)器的數(shù)量進行取模,而一致性Hash算法是對 2^32 取模,什么意思呢?簡單來說,一致性 Hash 算法將整個哈希值空間組織成一個虛擬的圓環(huán),如假設(shè)某哈希函數(shù)H的值空間為 0-2^32-1 (即哈希值是一個32位無符號整形)。整個空間按 順時針方向組織 ,圓環(huán)的正上方的點代表 0,0 點右側(cè)的第一個點代表 1 ,以此類推, 2、3、4、5、6 ……直到 2^32-1 ,也就是說 0 點左側(cè)的第一個點代表 2^32-1 , 0 和 2^32-1 在零點中方向重合,我們把這個由 2^32 個點組成的圓環(huán)稱為 Hash環(huán)

特性定義

一致性 Hash 算法提出了在動態(tài)變化的 Cache 環(huán)境中,判定哈希算法好壞的四個定義:

1、平衡性(Balance):平衡性是指哈希的結(jié)果能夠盡可能分布在所有的緩沖 (Cache) 中去,這樣可以使得所有的緩沖空間得到利用。很多哈希算法都能夠滿足這一條件。

2、單調(diào)性(Monotonicity):單調(diào)性是指如果已經(jīng)有一些內(nèi)容通過哈希分派到了相應(yīng)的緩沖中,又有新的緩沖加入到系統(tǒng)中。哈希的結(jié)果應(yīng)該能夠保證原有已分配的內(nèi)容可以被映射到原有的或者新的緩沖中去,而不會映射到舊的緩沖集合中的其他緩沖區(qū)。

3、分散性(Spread):在分布式環(huán)境中,終端有可能看不到所有的緩沖,而只能看到其中的一部分。當終端希望通過哈希過程將內(nèi)容映射到緩沖上去,由于不同終端所見的緩沖范圍有可能不同,從而導致哈希的結(jié)果不一致,最終的結(jié)果是相同的內(nèi)容被不同的終端映射到不同的緩沖區(qū)中。這種情況顯然是應(yīng)該避免的,因為它導致相同內(nèi)容被存儲到不同緩沖中去,降低了系統(tǒng)存儲的效率。分散性的定義就是上述情況發(fā)生的嚴重程度。好的哈希算法應(yīng)該能夠盡量避免不一致的情況發(fā)生,也就是盡量降低分散性。

4、負載(Load):負載問題實際上是從另一個角度看待分散性問題。既然不同的終端可能將相同的內(nèi)容映射到不同的緩沖區(qū)中,那么對于一個特定的緩沖區(qū)而言,也可能被不同的用戶映射到不同的內(nèi)容。與分散性一樣,這種情況也是應(yīng)當避免的,因此好的哈希算法應(yīng)能夠盡量降低緩沖的負荷。

下一步將各個服務(wù)器使用Hash進行一個哈希,具體可以選擇 服務(wù)器的IP或主機名 作為 關(guān)鍵字 進行哈希,這樣每臺機器就能確定其在哈希環(huán)上的位置,這里假設(shè)將上文中四臺服務(wù)器使用IP地址哈希后在環(huán)空間的位置如下:

接下來使用如下算法定位數(shù)據(jù)訪問到相應(yīng)服務(wù)器:將數(shù)據(jù) key 使用相同的函數(shù) Hash 計算出哈希值,并確定此數(shù)據(jù)在環(huán)上的位置,從此位置沿環(huán)順時針“行走”,第一臺遇到的服務(wù)器就是其應(yīng)該定位到的服務(wù)器!

例如我們有 Object A 、 Object B 、 Object C 、 Object D 四個數(shù)據(jù)對象,經(jīng)過哈希計算后,在環(huán)空間上的位置如下:

根據(jù)一致性 Hash 算法,數(shù)據(jù) A 會被定為到 Node A 上, B 被定為到 Node B 上, C 被定為到 Node C 上, D 被定為到 Node D 上。

容錯和可擴展

現(xiàn)假設(shè) Node C 不幸宕機,可以看到此時對象 A、B、D 不會受到影響,只有 C 對象被重定位到 Node D 。一般的,在一致性 Hash 算法中,如果一臺服務(wù)器不可用,則受影響的數(shù)據(jù)僅僅是此服務(wù)器到其環(huán)空間中前一臺服務(wù)器(即沿著逆時針方向行走遇到的第一臺服務(wù)器)之間數(shù)據(jù),其它不會受到影響,如下所示:

下面考慮另外一種情況,如果在系統(tǒng)中增加一臺服務(wù)器 Node X ,如下圖所示:

此時對象 Object A、B、D 不受影響,只有對象 C 需要重定位到新的 Node X !一般的,在一致性 Hash 算法中,如果增加一臺服務(wù)器,則受影響的數(shù)據(jù)僅僅是新服務(wù)器到其環(huán)空間中前一臺服務(wù)器(即沿著逆時針方向行走遇到的第一臺服務(wù)器)之間數(shù)據(jù),其它數(shù)據(jù)也不會受到影響。

綜上所述,一致性 Hash 算法對于節(jié)點的增減都只需重定位環(huán)空間中的一小部分數(shù)據(jù),具有較好的容錯性和可擴展性。

Hash環(huán)的數(shù)據(jù)傾斜問題

一致性 Hash 算法在 服務(wù)節(jié)點太少時 ,容易因為節(jié)點分部不均勻而造成 數(shù)據(jù)傾斜 (被緩存的對象大部分集中緩存在某一臺服務(wù)器上)問題,例如系統(tǒng)中只有兩臺服務(wù)器,其環(huán)分布如下:

此時必然造成大量數(shù)據(jù)集中到 Node A 上,而只有極少量會定位到 Node B 上。為了解決這種數(shù)據(jù)傾斜問題,一致性 Hash 算法引入了虛擬節(jié)點機制,即對每一個服務(wù)節(jié)點計算多個哈希,每個計算結(jié)果位置都放置一個此服務(wù)節(jié)點,稱為虛擬節(jié)點。具體做法可以在 服務(wù)器IP 或 主機名 的后面增加編號來實現(xiàn)。

例如上面的情況,可以為每臺服務(wù)器計算三個虛擬節(jié)點,于是可以分別計算 “ Node A#1 ”、“ Node A#2 ”、“ Node A#3 ”、“ Node B#1 ”、“ Node B#2 ”、“ Node B#3 ”的哈希值,于是形成六個虛擬節(jié)點:

同時數(shù)據(jù)定位算法不變,只是多了一步虛擬節(jié)點到實際節(jié)點的映射,例如定位到“ Node A#1 ”、“ Node A#2 ”、“ Node A#3” 三個虛擬節(jié)點的數(shù)據(jù)均定位到 Node A 上。這樣就解決了服務(wù)節(jié)點少時數(shù)據(jù)傾斜的問題。在實際應(yīng)用中,通常將虛擬節(jié)點數(shù)設(shè)置為 32 甚至更大,因此即使很少的服務(wù)節(jié)點也能做到相對均勻的數(shù)據(jù)分布。

總結(jié)

以上是生活随笔為你收集整理的一致性hash算法虚拟节点_Hash算法和一致性Hash算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。