標籤:
在分布式系統中,如果某業務可以由多個相同的節點處理,很容易想到用HASH的方式將業務請求分散到這些節點處理,比如memecache緩衝等分 布式叢集應用,如果只是簡單的使用,不涉及使用者使用者狀態等資訊,則可以直接採用模數演算法。正常情況下,模數演算法好像也不錯,但是一旦增加節點或者其中一個 節點上宕機的話,命中率將會急劇降低,所以模數演算法在這種情況下弊端很明顯,為此,在1997年由麻省理工學院提出的一種分布式雜湊(DHT)實現演算法。 具體的演算法介紹我這裡不多少了,需要瞭解的可以參見本文:http://www.cnblogs.com/haippy/archive/2011/12/10/2282943.html
下面貼一個用PHP對其進行的簡單實現
class Hash{ //落點集合,可以緩衝起來 private $_locations = array(); //虛擬節點數量 private $virtualNodeNum = 24; //維護的另一種節點和虛擬節點對應關係,方便刪除 private $_nodes; //將字串轉成數字 private function _hash($str) { return sprintf(‘%u‘, crc32($str)); } /** * 尋找字串所在的機器位置 * @param $str * @return bool|mixed */ public function getLocation($str) { if(empty($this->_locations)){ return false; }else{ $position = $this->_hash($str); //預設取第一個節點 $node = current($this->_locations); foreach($this->_locations as $k=>$v){ //如果當前的位置,小於或等於節點群組中的一個節點,那麼當前位置對應該節點 if($position <= $k){ $node = $v; break; } } return $node; } } /** * 添加一個節點 * @param $node */ public function addNode($node) { //產生虛擬節點 for($i=0;$i<$this->virtualNodeNum;$i++){ $tmp = $this->_hash($node.$i); $this->_locations[$tmp] = $node; $this->_nodes[$node][] = $tmp; } //對節點排序 ksort($this->_locations,SORT_NUMERIC); } /** * 刪除一個節點 * @param $node */ public function deleteNode($node) { foreach($this->_nodes[$node] as $v){ unset($this->_locations[$v]); } }}
PHP 一致性雜湊演算法的一種簡單實現