使用 hash环 分表 扩容不影响正常运行,减少数据迁移
<?php
/**
* 使用 hash环 分表 扩容不影响正常运行,减少数据迁移
*/
class Consistance
{
protected $num=24; //设定每一个服务器的节点数,数量越多,宕机时服务器负载就会分布得越平均,但也增大数据查找消耗。
protected $nodes=array(); //当前服务器组的结点列表。
//计算一个数据的哈希值,用以确定位置
public function make_hash($data)
{
$str = sprintf('%u',crc32(strtolower(md5($data))));
$str = abs($str);
return $str;
}
//遍历当前服务器组的节点列表,确定需要存储/查找的服务器
public function set_loc($data)
{
$loc=self::make_hash($data);
foreach ($this->nodes as $key => $val)
{
if($loc<=$key)
{
return $val;
}
}
$new = array_values($this->nodes);
return $new[0];//没有存返回第一
}
//添加一个服务器,将其结点添加到服务器组的节点列表内。
public function add_host($host)
{
for($i=0;$i<$this->num;$i++)
{
$key=sprintf('%u',crc32(md5($host.'_'.$i)));
$this->nodes[$key]=$host;
}
ksort($this->nodes); //对结点排序,这样便于查找。
}
//删除一个服务器,并将其对应节点从服务器组的节点列表内移除。
public function remove_host($host)
{
for($i=0;$i<$this->num;$i++)
{
$key=sprintf('%u',crc32(md5( $host.'_'.$i)));
unset($this->nodes[$key]);
}
}
}
$consistance = new Consistance();
$consistance->add_host("192.168.1.1.user_1");
$consistance->add_host("192.168.1.1.user_2");
//$consistance->add_host("192.168.1.1.user_3");
//
for ($i=670;$i<675;$i++){
echo "{$i}:";
echo $consistance->set_loc($i)." \n";
}
echo "crc32:".crc32("100");
?>