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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

分布式一致性hash算法

發布時間:2024/9/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分布式一致性hash算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

寫在前面
??在學習Redis的集群內容時,看到這么一句話:Redis并沒有使用一致性hash算法,而是引入哈希槽的概念。而分布式緩存Memcached則是使用分布式一致性hash算法來實現分布式存儲。所以就專門學習了一下

什么是分布式?什么是一致性?什么是哈希?
??1)分布式(distributed)是指在多臺不同的服務器中部署不同的服務模塊,通過遠程調用協同工作,對外提供服務。“分布式一致性hash算法”中的“分布式”就是指緩存數據的分布性。

??集中式將一個系統的所有服務模塊部署到了不同的服務器上,構成一個集群,通過負載均衡設備對外提供服務。集中式部署就像茶水間同時有多個飲水機提供服務,服務冗余部署。分布式部署則將系統拆分成不同的服務模塊,然后將不同的服務模塊部署在不同的服務器上。

??2)一致性Wiki的定義:

??Consistent hashing is a special kind of hashing such that when a hash table is resized, only K/n keys need to be remapped on average, where K is the number of keys, and n is the number of slots. In contrast, in most traditional hash tables, a change in the number of array slots causes nearly all keys to be remapped because the mapping between the keys and the slots is defined by a modular operation.

??大概意思就是“一致性哈希是一種特殊的哈希算法,提供了這樣的一個哈希表,當重新調整大小的時候,平均只有部分(k/n)key需要重新映射哈希槽,而不像傳統哈希表那樣幾乎所有key需要需要重新映射哈希槽”。一致性hash能保證在分布式環境中,對key進行哈希的結果或者說key與節點之間的映射關系不會受節點的增加和刪除而產生重大的變化。

??3)hash,俗稱“哈希”,也叫散列,是一種將任意長度的消息(數據)壓縮到某一固定長度的消息摘要(數據)的算法。常見的hash算法有MD5,SHA等。hash算法具有幾個重要的特性:不可逆性(即從hash值反推出原消息是不可能的)、抗沖突性(即給定消息M1,不存在另一個消息M2,使得Hash(M1)=Hash(M2))和分布均勻性(即hash的結果是均勻分布的)。Memcached中,存取數據時都要進行哈希映射。正是這幾個特性,保證了memcached緩存中key值得唯一性。

分布式一致性hash算法使用背景
??我們已經知道,memcached的分布式主要在于客戶端的分布式算法。memcached客戶端就像一個網絡中的路由,經過特定的算法將數據分散的存在到memcached服務端的機器上,又從分散的memcached服務端的機器上提取數據。實際中,常見的存儲和提取數據的算法有取模算法和本文分析的一致性hash算法。

??取模算法算法的原理是:

hash(key)%N
1
??其中key 代表數據的鍵,N 代表memcached服務器的數量。取模的結果就是memcached客戶端要定位的memcached服務器。取模算法很明顯,結果受N的影響,當服務器數量N增加或者減少的時候,原先的緩存數據定位幾乎失效,緩存數據定位失效意味著要到數據庫重新查詢,這對于高并發的系統來說是致命的。于是,人們提出了一致性hash算法,最終目的是實現在移除、添加一個memcached服務器時對已經存在的緩存數據的定位影響盡可能的降到最小。

環形hash空間
??通常,一個緩存數據的key經過hash后會得到一個32位的值,也就是0~2^32 - 1數值范圍。我們可以把這個數值范圍抽象成一個首尾相連環形的空間,我們稱這個空間為環形hash空間。如下圖所示:

映射key、server節點到環形hash空間
??有了環形hash空間之后,緩存數據的key經過hash后得到的值就映射到了環形hash空間。假設有key1、key2、key3、key4,經過hash后,映射到環形hash空間如下圖所示。同理,我們可以把memcached服務器抽象成網絡上的節點經過hash后映射到環形hash空間。假設有server1(可以是服務器的某些唯一標志信息,如ip等)、server2、server3

映射key到server節點
??現在緩存key和server節點都經過一致性hash算法映射到了環形hash空間,現在就可以將緩存key和server節點的關系進行映射了。順時針沿著環形hash空間,從某個緩存key開始,直到遇到一個server節點,那么該緩存key就存儲到這個server節點上。如圖:

??了解了key、server節點、hash空間之間的映射關系之后,已經清楚了緩存數據是怎樣分布的存儲到memcached服務器了。查找緩存數據的時候,也采用同樣的映射方法來定位。

刪除server節點
??當在server集群中刪除server2節點時,受影響的也僅是server1~server2之間的緩存數據Key3,這部分數據需要重新到數據庫查找再次映射到server3節點上。如下圖所示:

添加server節點
??現在我們已經知道memcached存儲和訪問數據的策略了。那么當在server集群中增加一個server節點時,對數據訪問的命中率又有什么影響呢。如下圖,在server1和server2節點之間增加一個節點server4

??從上圖可以看出,增加server4節點后,原有的緩存數據分布中,僅有server1和server4節點之間的數據進行了重新分布,這部分數據需要重新到數據庫查找再次映射到新添加的server4節點上。盡管不能命中的緩存數據仍然存在,但相對于取模算法,已經是最大限度地抑制了hash鍵的重新分布。

虛擬節點的引入
??我們已經知道,添加和刪除節點都會影響緩存數據的分布。盡管hash算法具有分布均勻的特性,但是當集群中server數量很少時,他們可能在環中的分布并不是特別均勻,進而導致緩存數據不能均勻分布到所有的server上。

??為解決這個問題,需要使用虛擬節點的思想:為每個物理節點(server)在環上分配100~200個點,這樣環上的節點較多,就能抑制分布不均勻。當為cache定位目標server時,如果定位到虛擬節點上,就表示cache真正的存儲位置是在該虛擬節點代表的實際物理server上。另外,如果每個實際server節點的負載能力不同,可以賦予不同的權重,根據權重分配不同數量的虛擬節點。

??虛擬節點的hash計算可以采用對應節點的 IP 地址加數字后綴的方式。例如假設 serverA 的 IP 地址為 127.0.0.1 。

??引入虛擬節點前,計算serverA 的 hash 值:

hash(“127.0.0.1”);
1
??引入虛擬節點后,計算虛擬節點serverA1 和 serverA2 的 hash 值:

hash(“127.0.0.1#1”);
hash(“127.0.0.1#2”);
1
2
一致性hash算法與取模算法的比較
??取模算法的方法簡單,數據的分散性也可以,但其主要缺點是當添加或移除server節點時,緩存重新映射的代價相當巨大。添加或移除server節點時,余數就會產生巨變,這樣就無法定位與存儲時相同的server節點,從而影響緩存的命中率。

??而一致性hash算法則最大限度的減少了server節點變化帶來的影響,當節點變化時,只影響一個server節點的部分數據,且hash算法能夠保證需要重新分布的緩存數據能映射到新的server節點中。
---------------------
原文:https://blog.csdn.net/u011489043/article/details/78944985

總結

以上是生活随笔為你收集整理的分布式一致性hash算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。