天天看點

經典Hash一緻性算法

memcached的分布式是什麼意思?

下面假設memcached伺服器有node1~node3三台,應用程式要儲存鍵名為”tokyo”、”kanagawa”、”chiba”、”saitama”、”gunma”的資料。

經典Hash一緻性算法

首先向memcached中添加“tokyo”。将“tokyo”傳給用戶端程式庫後,用戶端實作的算法就會根據”鍵”來決定儲存資料的memcached伺服器。伺服器標明後,即指令它儲存”tokyo”及其值。

經典Hash一緻性算法

同樣,”kanagawa”、”chiba”、”saitama”、”gunma”都是先選擇伺服器再儲存。接下來擷取儲存的資料。擷取時也要将要擷取的鍵”tokyo”傳遞給函數庫。函數庫通過與資料儲存時相同的算法,根據“鍵”選擇伺服器。使用的算法相同,就能選中與儲存時相同的伺服器,然後發送get指令。隻要資料沒有因為某些原因被删除,就能獲得儲存的值。

經典Hash一緻性算法

這樣,将不同的鍵儲存到不同的伺服器上,就實作了memcached的分布式。memcached伺服器增多後,鍵就會分散,即使一台memcached伺服器發生故障無法連接配接,也不會影響其他的緩存,系統依然能繼續運作。

根據餘數計算分散

Memcached的分布式方法簡單來說,就是“根據伺服器台數的餘數進行分散”。求得鍵的整數哈希值,再除以伺服器台數,根據其餘數來選擇伺服器。

餘數計算的方法簡單,資料的分散性也相當優秀,但也有其缺點。那就是當添加或移除伺服器時,緩存重組的代價相當巨大。添加伺服器後,餘數就會産生巨變,這樣就無法擷取與儲存時相同的伺服器,進而影響緩存的命中率。

一緻性hash(Consistent Hashing)

一緻性hash(Consistent Hashing)如下所示:首先求出memcached伺服器(節點)的哈希值,并将其配置到0~232的圓(continuum)上。然後用同樣的方法求出存儲資料的鍵的哈希值,并映射到圓上。然後從資料映射到的位置開始順時針查找,将資料儲存到找到的第一個伺服器上。如果超過232仍然找不到伺服器,就會儲存到第一台memcached伺服器上。

經典Hash一緻性算法

從上圖的狀态中添加一台memcached伺服器。餘數分布式算法由于儲存鍵的伺服器會發生巨大變化而影響緩存的命中率,但一緻性hash(Consistent Hashing)中,隻有在continuum上增加伺服器的地點逆時針方向的第一台伺服器上的鍵會受到影響。

經典Hash一緻性算法

是以,一緻性hash(Consistent Hashing)最大限度地抑制了鍵的重新分布。而且,有的一緻性hash(Consistent Hashing)的實作方法還采用了虛拟節點的思想。使用一般的hash函數的話,伺服器的映射地點的分布非常不均勻。是以,使用虛拟節點的思想,為每個實體節點(伺服器)在continuum上配置設定100~200個點。這樣就能抑制分布不均勻,最大限度地減小伺服器增減時的緩存重新分布。

通過下文中介紹的使用一緻性hash(Consistent Hashing)算法的memcached用戶端函數庫進行測試的結果是,由伺服器台數(n)和增加的伺服器台數(m)計算增加伺服器後的命中率計算公式如下:(1 n/(n+m)) * 100

繼續閱讀