memcache的一致性hash演算法

2021-06-19 02:25:46 字數 2558 閱讀 4600

此文是在網上看到別人寫memcache一致性hashi演算法後進行編寫的,感覺寫的很好,所以就再錄過來:

現在一般的演算法就是乙個hash值演算法,對伺服器個數進行取餘來進行hash值的計算,假如你有n個cache,那麼對於object的對映,你會通過hash(object)%n來進行對映對應的伺服器上,但是當伺服器當掉,那麼你原來的儲存資料會失效,且hash演算法會進行修改,同理增加一台也會修改演算法,原來的資料也會失效,這對系統來說是災難性的,可對對資料庫的訪問造成壓力。有什麼方法能對這個場景進行優化呢,那就是一致性的hash演算法。

hash演算法:衡量乙個hash演算法的重要指標就是單調性,所謂單調性就是說:如果已經有物件存到到快取伺服器上,那麼當快取伺服器有變動時,應該能保證已經快取的物件能儲存到新的快取物件中,而不是快取到原來的快取物件或舊的快取物件中。很容易看到上面的hash(object)%n是不能保證這個要求的。

consistent hash演算法原理:consistent hashing 是一種 hash 演算法,簡單的說,在移除 / 新增乙個 cache 時,它能夠盡可能小的改變已存在 key 對映關係,盡可能的滿足單調性的要求。下面就來按照 5 個步驟簡單講講 consistent hashing 演算法的基本原理。

1考慮通常的 hash 演算法都是將 value 對映到乙個 32 為的 key 值,也即是 0~2^32-1 次方的數值空間;我們可以將這個空間想象成乙個首( 0 )尾( 2^32-1 )相接的圓環,如下面圖 1 所示的那樣。

圖1:環形hash空間

2.把物件對映到hash空間,接下來將4個物件object1-object4,通過hash演算法計算出key值將其分布在環上,其圖如下:

3把cache對映到hash空間

consistent hash的演算法思想就是把物件和cache對映到同乙個hash空間,並且使用相同的hash演算法。假設有a,b,c3臺cache,那麼對映結果如下圖上所示(以對應的hash值進行排列)

說到這裡順便說下cache的hash演算法,一般以cache的ip或者是機器名做hash的輸入。

4把物件對映到cache上

現在已經將cache和物件通過同乙個hash演算法對映到同乙個hash空間了,現在考慮的是如何將物件和cache進行對映。

在這個環形空間中,如果以乙個物件的key為出發點,按順時針出發直到遇到第乙個cache,那麼這個物件就放入到這個cache上,由於hash值時固定的,那麼找到的cache也是唯一的,這樣就找到了對映的方法。

按照上面的例子key1--->cachea  key4--->cacheb  key2,key3--->cachec

5考察cache的變動

考慮b掛掉了,那麼依據上面的對映方法,只有沿著b逆時針方向直到遇到第乙個cache之間的物件會有影響,也就是原來存數到b的物件會儲存到c,因此這裡只有object4發生了變化。

增加cache:假如在object2和object3之間新增一台cached,那麼沿著cached逆時針方向直到遇到第乙個cache之間的物件將會存放到d中,對此只是object2受到影響。

虛擬節點

考量hash演算法的另乙個重要指標是:平衡性:即盡可能的使對物件均勻的分布在cache節點上。

當cache比較少時,物件不能均勻的分布到cache上,就如上面的object2,object3,object4都分布在了c上,而object1只分布在a上了,為了使分布平衡,我們引入了虛擬節點:虛擬節點實際上是hash空間的複製品,乙個實際節點對應多個虛擬節點,虛擬節點在hash空間中以hash值進行排列。

仍以僅部署 cache a 和 cache c 的情況為例,在圖 4 中我們已經看到, cache 分布並不均勻。現在我們引入虛擬節點,並設定「複製個數」為 2 ,這就意味著一共會存在 4 個「虛擬節點」, cache a1, cache a2 代表了 cache a ; cache c1, cache c2 代表了 cache c ;假設一種比較理想的情況,參見圖 6 。

因此物件 object1 和 object2 都被對映到了 cache a 上,而 object3 和 object4 對映到了 cache c 上;平衡性有了很大提高。引入「虛擬節點」後,對映關係就從 轉換到了 。查詢物體所在 cache 時的對映關係如圖 7 所示。

強一致性 弱一致性 最終一致性

這種方式在es等分布式系統中也有體現,可以設定主shard提交即返回成功,或者需要replica shard提交成功再返回。提到分布式架構就一定繞不開 一致性 問題,而 一致性 其實又包含了資料一致性和事務一致性兩種情況,本文主要討論資料一致性 事務一致性指acid 複製是導致出現資料一致性問題的唯...

memcache一致性hash的php實現方法

最近在看一些分布式方面的文章,所以就用php實現一致性hash來練練手,以前一般用的是最原始的hash取模做 分布式,當生產過程中新增或刪除一台memcache都會造成資料的全部失效,一致性hash就是為了解決這個問題,把失效資料降到最低,相關資料可以 google一下!php實現效率有一定的缺失,...

一致性hash演算法在memcache集群中的應用

memcache是乙個分布式的快取系統,但是本身沒有提供集群功能,在大型應用的情況下容易成為瓶頸。在設計分布式memcache系統的時候,我們需要讓key的分布均衡,並且在增加cache server後,cache的遷移做到最少。常規的方式比如hash取模的方式,以hash k mod n的演算法來...