我已经使用以下代码几年来处理数据库表的查找。我们目前在6台主机上对表格进行了分片。查找代码是:
$db_servers = Array(
'db-1','db-2','db-3'
//you get the idea
);
$full_table = 'mydatabase.mytable'; //just an example...obviously
$hash = sprintf('%u', crc32($full_table));
$host = $db_servers[($hash % $db_server_count)];
这种“算法”具有快速且随机的优点。但是,每当我向群集添加新节点时,重新平衡需要相当长的时间,因为似乎需要将不必要数量的表移动到不同的主机上。这不是一个大问题,因为我能够构建重新平衡脚本,因此重新平衡发生时不会出现停机。相反,在完成之前只会有很小的性能损失。
我的问题是,当添加新主机时,是否还有其他算法可以实现这种形式的一致性散列而无需大量的重新平衡?我正在继续研究这个主题,但认为Stack Overflow会有一些聪明的解决方案,人们已经看到它在生产中运作良好。
答案 0 :(得分:0)
好的,我找到了一个名为Flexihash的PHP类,可以很好地处理这个问题。这是一篇关于它的博客文章:http://paul.annesley.cc/2008/04/flexihash-consistent-hashing-php/
此外,您可以在此处查看Github回购:https://github.com/pda/flexihash
以下是我的代码现在看起来对于后来偶然发现此线程的任何人的方式。
$db_servers = Array(
'db-1','db-2','db-3'
//you get the idea
);
$full_table = 'mydatabase.mytable'; //just an example...obviously
$Flexihash = new Flexihash(null, 8);
//I played around with different replica counts and settled on 8
$Flexihash->addTargets($db_servers);
$host = $Flexihash->lookup($full_table);