Memcached一致性詳解

前言

      今天聽了浩田講的memcached,非常的清晰,但是對於哈希環的問題,覺得有必要自己在總結一下,其實這篇博客早就該寫了,一直被各種事情耽擱,廢話不說了,讓我們看看一致性哈希算法到底是什麼

 

內存分配機制

Slab Allocator

memcache使用了Slab Allocator的內存分配機制:相當於內存池機制,實現從操作系統分配一大塊內存,然後memcached自己管理這塊內存,負責分配與回收。

基本原理:按照預先規定的大小,將分配的內存分割成特定長度的塊

 

一、首先,想一般的內存池一樣,從操作系統分配到一大塊內存。

二、將分配的內存分割成各種尺寸的塊(chunk),並把尺寸相同的塊分成組(chunk集合),chunk的大小按照一定比例逐漸遞增(也就是浩田說的增長因子)

 

 

 

 

memcache的存儲涉及到Slab,page,chunk三個概念

 

  1. chunk:爲固定大小的內存空間,默認爲96Byte;
  2. page:分配給Slab的內存空間,默認爲1MB.然後在將1MB切分成chunk
  3. slab:同樣大小的chunk組稱爲slab

 

例如:如果要存的數據大小爲100,那麼這個數據就會被讓如112byte的slab裏邊

 

Slab Allocator存在的問題

         還拿上邊的例子舉例,100的放到了112的chunk中,但是還有12byte沒有用上,那麼這12字節的空間就浪費了

 

 

餘數Hash算法

      字符串對應的HashCose是50,服務器的數目是5,取餘數得0,那麼就將這個值放到0號服務器中,浩田今天講的是宕機的情況,其實還有一種情況,那就是當你要添加服務器的時候,道理是一樣的,會發現命中率急速下降,得不到數據,我們就要重新去數據庫裏查找,如果數據量非常龐大,那麼數據訪問的壓力就會集中到了數據庫身上,數據庫負載不了的時候,就會宕機

 

一致性Hash算法

 

       具體算法過程爲:先構造一個長度爲232的整數環(這個環被稱爲一致性Hash環),根據節點名稱的Hash值(其分佈爲[0, 232-1])將緩存服務器節點放置在這個Hash環上,然後根據需要緩存的數據的Key值計算得到其Hash值(其分佈也爲[0, 232-1]),然後在Hash環上順時針查找距離這個Key值的Hash值最近的服務器節點,完成Key到服務器的映射查找。

      下圖所示,我設置了四個節點,分別位於環上的4個位置,然後key值根據其HashCode,算出圓環上的位置,位置固定下來以後,key值就會順時針去尋找離他最近的一個Node,把數據存到這個Node中的memcache服務器中。

 

如果我們在這個圓環上增加一個節點會怎樣呢?如下圖所示,只有紅色星星的位置到Node5之間的數據收到了影響,別的地方命中率是沒有變化的,可以發現,我們佈置的node越多,受影響的概率越小

 

 

總結

關於memcache還有許多要學習的地方,隨着學習的深入,在做另外的總結,今天浩田的分享,也給了我很多的靈感,不光是技術方面,演講方面還是ppt的製作方面都會學習到了新的東西,謝謝浩田。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章