博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一致性哈希算法运用到分布式
阅读量:4693 次
发布时间:2019-06-09

本文共 1757 字,大约阅读时间需要 5 分钟。

我知道一致性哈希算法。但是,在没遇到你的时候,我还不知道怎么写。因为我肯本还没来的思考。但是,现在我知道了~~嘿嘿。   这里主要讲的是memcached(以下简称mem)集群,遇到集群中某台服务器down(M服务器)后,无法get到mem的值,这就给程序带来了风险,我们需要将风险用算法分摊出去,并将M的mem分布到正常的服务器上(N是正常运转的服务器)。

先讨论风险分摊的理论算法思路(因为同步mem是另外一篇,有时间再聊聊): 其实,主要思路很简单。通俗点儿来讲,就是理解将一个点分散为多个点分散在一个圆环上----俗称“虚拟节点”。,在数学的概念上,如果节点足够均匀的分布在一个圆环上 ,那么我们的风险也就平摊在每个节点上了。
前提:我们需要一种机制,将任意字符串按一个标准转换成整数crc32(),往高大上的讲就是hash它,让你对她爱慕有佳。
首先,第一步:添加节点a,这里不光是简单的添加,需要将节点虚拟成多个节点;言外之意,在一个圆环上随机分配a-$i个节点。           第二部:对每个虚拟节点hash掉,放在一个数组中,并按照key-value中的key来排序。ksort(),这个又是PHP的杰出代表者。           第三部:就是核心了,我们要找到新增的字符串应该在圆环上的位置,回到显示就是找到新增的mem数据应该插入到那台mem服务器上比较合理。我想的,这里也是做了前面步骤后,顺应的结果。           第四部:完善这个算法,我们理所当然的做到有增有减。addNode,delNode。          

第五步:华丽丽的代码展示,雏形。

<?php
 
interface hash{
public function hash($str);
}
 
interface distribution{
public function lookup($key);
}
 
class Consistent implements hash,distribution{
protected $_postion=array();
    protected $_mul=64;
 
   public function hash($str){
   return sprintf('%u',crc32($str));
   }
 
    public function lookup($key){
      $point=$this->hash($key);
      $node=current($this->_postion);
      foreach($this->_postion as $k=>$v){
      if($point <= $k){
      $node=$v;
      break;
      }
      }
     return $node;
    }
 
    public function addNode($node){
    for($i=0;$i<$this->_mul;$i++){
    $this->_postion[$this->hash($node.'-'.$i)]=$node;
    }
    $this->_sortPos();
    }
   
    public function delNode($node){
    foreach($this->_postion as $k=>$v){
    if($v == $node){
    unset($this->_postion[$k]);
    }
    }
    }
 
    public function _sortPos(){
    ksort($this->_postion,SORT_REGULAR);
    }
    public function printPos(){
      print_r($this->_postion);
    }
 
}
 
 
$con=new Consistent();
$con->addNode('a');
$con->addNode('b');
$con->addNode('c');
// $con->delNode('c');
 
echo '所有服务器如下:<br/>';
$con->printPos();  
 
echo '当前的键计算的hash落点是'.$con->_hash('name'),'<br/>';
 
echo $con->lookup('name');
 
?>

转载于:https://www.cnblogs.com/iifeng/p/3892260.html

你可能感兴趣的文章
Linux下安装Tomcat
查看>>
windows live writer 2012 0x80070643
查看>>
tomcat 和MySQL的安装
查看>>
git常用操作
查看>>
京东SSO单点登陆实现分析
查看>>
u-boot启动第一阶段
查看>>
MySQL批量SQL插入性能优化
查看>>
定义列属性:null,default,PK,auto_increment
查看>>
用户画像展示
查看>>
C#中StreamReader读取中文出现乱码
查看>>
使用BufferedReader的时候出现的问题
查看>>
批处理文件中的路径问题
查看>>
hibernate出现No row with the given identifier exists问题
查看>>
为什么wait()和notify()属于Object类
查看>>
配置NRPE的通讯
查看>>
shp系列(一)——利用C++进行shp文件的读(打开)与写(创建)开言
查看>>
匹配两个空格之间的字符。。。
查看>>
CSS 文字溢出 变成省略号 ...
查看>>
Spring事务
查看>>
java编程基础(三)流程控制语句
查看>>