主页 > Linux > 根据配置中的权值来选择服务器(权重算法)

根据配置中的权值来选择服务器(权重算法)

2012 年 07 月 06 日 没有评论

今天在写一个连接和操作redis的php 文件,主要功能是实现一主多从,写的话主要从主服务器中执行,然后读取的话直接从从服务器中的读取。
现在需要满足的是,可能不需要均等的从从服务器中读取,可能某一台服务器要起的作用要大一点,那么这样子的话,就涉及一个根据权值来选取服务器的问题,
然后在网上搜了一下资料,整理了一个思想,然后用代码予以实现。
思想:
对于多台服务器,根据不同的权值来选择其中的一台,好比是有条直线,在这条直线上,根据这些权值的大小来形成不同长度的连在一起的线段,那么在这条直线上面随机取一个点,那么这个点所在的位置,肯定是线段越长的概率越大,长度越短的概率越小。
代码实现:

function getServerByWeight( $data )
{
	$weight = 0;
	$tempData = array();//一根直线
	foreach ($data as $item)
	{
		$weight += $item['weight'];//直线的总长度
		for ($i = 0; $i < $item['weight']; $i++)
		{
			$tempData[] = $item;//定义一个线段
		}
	}
	$index = rand(0, $weight-1);//从直线上面随机去一个点
	return $tempData[$index]['id'];
}

$data = array(
		array('id'=>1, 'host'=>'192.168.12.205', 'port'=>'6379', 'weight'=>10),
		array('id'=>2, 'host'=>'192.168.12.206', 'port'=>'6379', 'weight'=>30),
		array('id'=>3, 'host'=>'192.168.12.207', 'port'=>'6379', 'weight'=>60),
);

测试:

$lv = array();
$count = 1000;
for ($i=0;$i<$count;$i++)
{
	$lv[$i] = getServerByWeight($data);
	$all = array_count_values($lv);
}
array_walk($all, function (&$value) use($count){
	$value = $value / $count * 100 .'%';
});
var_dump($all);

测试的结果:

array
  2 => string '32.3%' (length=5)
  3 => string '60.2%' (length=5)
  1 => string '7.5%' (length=4)

他们被选中的概率和他们定义权重是基本保持一致的!

发表评论

电子邮件地址不会被公开。 必填项已用*标注


*

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>