码迷,mamicode.com
首页 > 编程语言 > 详细

memcached-分布式一致性哈希算法练习

时间:2018-04-29 18:41:38      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:出现   down   echo   均衡   bsp   bre   sdas   memcache   col   

interface hash{
    function _hash($key);//计算键名对应的32位数值
}
interface distribution{
    function lookup($node);//查看落点
}

class Consistent implements hash,distribution{
    protected $_nodes = array();

    public function _hash($key)
    {
        return sprintf("%u",crc32($key));
    }

    public function lookup($key)
    {
       $point = $this->_hash($key);
        $node = current($this->_nodes);//将最小的key所对应的值付给node
       foreach($this->_nodes as $k => $v){
           if($k>=$point){
                $node = $v;
                break;
           }
       }
       return $node;
    }

    public function addNodes($node)
    {
        //记录服务器节点
        $this->_nodes[$this->_hash($node)] = $node;
        $this->sortNodes();
    }

    public function sortNodes()
    {
        ksort($this->_nodes,SORT_REGULAR);
    }
    public function getNodes()
    {
        return $this->_nodes;
    }
}

$con = new Consistent(); 
$con->addNodes(‘a‘);
$con->addNodes(‘b‘);
$con->addNodes(‘c‘);
echo ‘现有服务器节点有:‘;
print_r($con->getNodes());
echo ‘name的落点为‘.  $con->_hash(‘titleasdas‘) . "<br />";
echo ‘应该写在‘.$con->lookup(‘titleasdas‘)."服务器上";

以上代码简单的实现了分布数据到不同的服务器上。不过缺点很明显。用这个实现的分布式当其中服务器down后,排在这台服务器后面的那台服务器需要承担这台服务器的全部工作量。于是,下面加强了一下。

interface hash{
    function _hash($key);//计算键名对应的32位数值
}
interface distribution{
    function lookup($node);//查看落点
}

class Consistent implements hash,distribution{
    
    protected $_positions = array();
    protected $_nodes = array();
    protected $_mul = 64;
    public function _hash($key)
    {
        return sprintf("%u",crc32($key));
    }

    public function lookup($key)
    {
       $point = $this->_hash($key);
        $node = current($this->_positions);//将最小的key所对应的值付给node
       foreach($this->_positions as $k => $v){
           if($k>=$point){
                $node = $v;
                break;
           }
       }
       return $node;
    }

    public function addPos($node)
    {
        //记录服务器节点
        for($i=0;$i<$this->_mul;$i++){
            $pos = $this->_hash($node.‘-‘.$i);
            $this->_positions[$pos] = $node;
        }
        $this->sortPos();
    }

    public function sortPos()
    {
        ksort($this->_positions,SORT_REGULAR);
    }
    public function getPos()
    {
        return $this->_positions;
    }
}

$con = new Consistent(); 
$con->addPos(‘a‘);
$con->addPos(‘b‘);
$con->addPos(‘c‘);
echo ‘现有服务器节点有:‘;
print_r($con->getPos());
echo ‘name的落点为‘.  $con->_hash(‘titleasdas‘) . "<br />";
echo ‘应该写在‘.$con->lookup(‘titleasdas‘)."服务器上";

将每台服务器生成64个不同的节点。然后进行排序。这样多台服务器就均衡无序的分布在不同的节点位置。当其中某台服务器down后也不会出现其中一台服务器全部承担那台服务器的压力的情况发生。

 

 

对于分布式算法理解尚有不足,以上观点若有错误之处还望前辈们不吝指教,十分感谢。

memcached-分布式一致性哈希算法练习

标签:出现   down   echo   均衡   bsp   bre   sdas   memcache   col   

原文地址:https://www.cnblogs.com/laoshibulaoshi/p/8971474.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!