网站首页
MEMCACHED分布式哈希算法
发布时间:1970-01-01 00:00查看次数:3704
<?php
/**
* 一致性哈希分布式算法
* 原理是根据数字从大到小排列算法
*简单的理解就是1-10画个源 然后根据数字的位置去取值
* 负载均衡就是 在这10个点上在每个点虚拟10个点 而附近的点死机了
* 就近落到附近的下一个节点上
*/
class YizhixingHaxi {
protected $jiedian = array(); //节点用数组存储
private $xuniJiedianzengliang = 64; //定义64个虚拟节点 这个可以自己设置的吧
private $post = 11211; //定义每台服务器上初始化端口
//首先需要一个计算字符串哈希数字的公共方法
public function haXi ($str){
$tmp = crc32($str); //第一步先计算一个下 当前字符串的32位有符号数字
$tmp = sprintf('%u',$tmp); //将当前计算的32位数字转换成 无符号数字
return $tmp; //返回计算的哈希值
}
//增加节点服务器 节点服务器是多个用数组存储
public function addJiedian($str){ //节点字符串
//虚拟节点其实就是多增加几个位置分布负载 要注4意端口的增量
$tmppost = $this->post; //定义一个虚拟端口
for($i=1 ; $i < $this->xuniJiedianzengliang;$i++ ){
$tmppost = $tmppost + 1; //端口自增因为每个节点是不能冲突的
$tmp = $str .'_'.$i; //生成虚拟节点名称
$tmp = $this->haXi($tmp); //计算虚拟节点数值
$this->jiedian[$tmp]= $str.':'.$tmppost; //把当前服务器的节点以及端口记录到数组里边
}
$this->paiXunjiedian(); //把当前节点数组按照从小到大进行排序
}
//对节点进行排序 因为节点用的数组排序 所以用数组排序命令
public function paiXunjiedian(){
ksort($this->jiedian,SORT_REGULAR); //把节点排序按照数字从小到大排列
}
//查询当前哈希值 所在节点位置
public function getJiedian($str){
$minjiedian = current($this->jiedian); //取出当前的键 也可以定义一个空变量都可以
foreach($this->jiedian as $k => $v){ //拿服务器节点跟当前值进行比较
if($this->haXi($str) <= $k){ //如果当前字符串的哈希值小于等于节点值
$minjiedian = $v; //把当前节点坐在的服务器以及端口返回给调用者
break;
}
}
return $minjiedian; //返回给调用者
}
}
$crc = new YizhixingHaxi(); //实例化一个哈希计算对象
$crc->addJiedian('a'); //添加一个节点服务器
$crc->addJiedian('b'); //添加一个节点服务器
$crc->addJiedian('c'); //添加一个节点服务器
echo $crc->haXi('name'),'<br>';
echo $crc->getJiedian('name'),'<br>'; //取得节点服务器位置以及端口
echo $crc->haXi('48855784'),'<br>';
echo $crc->getJiedian('48855784'),'<br>';
关键字词:MEMCACHED分布式哈希算法