memcached一致性雜湊演算法

2021-08-09 05:14:32 字數 2112 閱讀 6563

根據餘數計算分散

根據伺服器台數的餘數進行分散:求得鍵的整數雜湊值,再除以伺服器台數,根據其餘數來選擇伺服器。

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

eg. 由 n 臺伺服器變為 n-1 臺——每 n*(n-1) 個數中,求餘相同的數只有 n 個數字。所以命中率在伺服器 down 的短期內急劇下降至 n/(n*(n-1)) = 1/(n-1)。

consistent hashing

首先求出 memcached 伺服器(節點)的雜湊值,並將其配置到 0~2^32 的圓(continuum)上。然後用同樣的方法求出儲存資料的鍵的雜湊值,並對映到圓上。然後從資料對映到的位置開始順時針查詢,將資料儲存到找到的第乙個伺服器上。如果超過 2^32 仍然找不到伺服器,就會儲存到第一台 memcached 伺服器上。

如果新增一台 memcached 伺服器,餘數分布式演算法由於儲存鍵的伺服器會發生巨大變化。而影響快取的命中率,但 consistent hashing 中,只有在增加伺服器的地點逆時針方向的第一台伺服器上的鍵會受到影響。

因此,consistent hashing 最大限度地抑制了鍵的重新分布。而且,有的 consistent hashing 的實現方法還採用了虛擬節點的思想。使用一般的 hash 函式的話,伺服器的對映地點的分布非常不均勻。

因此,使用虛擬節點的思想,為每個物理節點(伺服器)分配 100~200個點。這樣就能抑制分布不均勻,最大限度地減小伺服器增減時的快取重新分布。

/** 

* get a list of targets for the resource, in order of precedence.

* up to $requestedcount targets are returned, less if there are fewer in total.

* *@param string $resource

*@param int $requestedcount the length of the list to return

*@return array list of targets

*@comment 查詢當前的資源對應的節點,

* 節點為空則返回空,節點只有乙個則返回該節點,

* 對當前資源進行hash,對所有的位置進行排序,在有序的位置列上尋找當前資源的位置

* 當全部沒有找到的時候,將資源的位置確定為有序位置的第乙個(形成乙個環)

* 返回所找到的節點

*/public

function

lookuplist

($resource, $requestedcount)

// only collect the first instance of any target

if ($collect && !in_array($value, $results))

// return when enough results, or list exhausted

if (count($results) == $requestedcount || count($results) == $this->_targetcount)

} // loop to start - search values below the resourceposition

foreach ($this->_positiontotarget as

$key => $value)

// return when enough results, or list exhausted

if (count($results) == $requestedcount || count($results) == $this->_targetcount)

} // return results after iterating through both "parts"

return

$results;

}

flexihash

一致性雜湊

直接貼出一篇介紹的很清楚的博文。關鍵字一致性雜湊 平衡性,單調性,分散性,負載 其實說白了,就是解決把請求分散到不同的機器上運算,怎麼做分散的平均,機器少一台多一台,或者壞掉一台,成很好的自適應和拓展。最簡單的實現分布式演算法,取模嘛,但是它就上述的一些問題,所以不算好的雜湊函式。一致性雜湊演算法,...

一致性雜湊

from 學習分布式,一致性雜湊是最最基礎的知識,所以要理解好.那什麼是一致性雜湊呢?what 1.平衡性是指 hash的結果應該平均分配到各個節點,這樣從演算法上就解決了負載均衡問題.2.單調性是指 在新增或者刪減節點時,同乙個key訪問到的值總是一樣的.3.分散性是指 資料應該分散的存放在 分布...

一致性雜湊

一致性 雜湊演算法在1997年由 麻省理工學院提出 參見擴充套件閱讀 1 設計目標是為了解決網際網路中的熱點 hot spot 問題,初衷和 carp十分類似。一致性雜湊修正了carp使用的簡單雜湊演算法帶來的問題,使得dht可以在p2p環境中真正得到應用。雜湊演算法 編輯 一致性雜湊提出了在動態變...