一致性哈希算法的php實現與分析-算法

<?php
/*
* 一致性哈希算法
* 過程:
* 1,抽象一個圓,然後把服務器節點按一定算法得到整數有序順時針放到圓上,圓環用2^32 個點來進行均勻切割。
* hash函數的結果應該均勻分佈在[0,2^32-1]區間
* 2,由於服務器少,在圓上分佈不均勻會造成數據傾斜,所以我們使用虛擬節點代替服務器的節點,一個服務器生成32個虛擬節點,或者更多。
* 3,數據要存到服務器上,通過同樣的算法得到整數,在圓上順時針跟節點對比,如果剛好大於或者等於,那麼就保存在這臺服務器上,
* 如果走完一圈也沒找到,就落入第一個節點。

* 參數是:服務器IP,數據。
* 需要的操作是:添加服務器,刪除服務器,添加數據(服務器在這

class A{
public $server;
public $node;

/我們需要得到的散列值是一個正整數,所以我們可以使用times33或者crc32來獲得/
public function hashing($str){
    return sprintf('%u',crc32($str));
}

/添加服務器/
public function addServer($server){
    if(!isset($this->server[$server])){
        $this->addNode($server);
    }
}

/添加虛擬節點/
public function addNode($server){
    /每個添加32個虛擬節點,服務器少你可以添加更多,分佈相對均勻以防數據傾斜/
    for($i=0;$i<32;$i++){
        $key_node=$this->hashing($server.$i);
        $this->server[$server][]=$key_node;
        $this->node[$key_node]=$server;
    }
    /變成有序的整數數組/
    ksort($this->node,SORT_NUMERIC);
}

/刪除服務器/
public function dropServer($server){
    foreach($this->server[$server] as $v){
        unset($this->node[$v]);
    }
    unset($this->server[$server]);
}

/調度服務器/
public function getServer($str){
    $key_str=$this->hashing($str);
    /第一個節點/
    $server=current($this->node);
    foreach($this->node as $k=>$v){
        if($k>=$key_str){
            $server=$v;
            break;
        }
    }
    reset($this->node);
    return $server;
}

}

$s=new A();
$s->addServer('192.168.1.2:12341');
$s->addServer('192.168.1.3:12342');
$s->addServer('192.168.1.4:12343');
$s->addServer('192.168.1.5:12344');
$s->addServer('192.168.1.6:12345');

echo $s->getServer('我存在哪裏呢');
/結果192.168.1.3:12342/

/刪除這臺服務器/
$s->dropServer('192.168.1.3:12342');

echo $s->getServer('我存在哪裏呢');
/結果192.168.1.3:12344/

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