几年来,我一直在使用以下代码来处理数据库表上的查找。我们目前在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会有一些聪明的解决方案,人们已经在生产中看到了很好的效果。
发布于 2012-09-19 11:14:32
好的,我发现一个名为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);https://stackoverflow.com/questions/12486587
复制相似问题