1

几年来,我一直在使用以下代码来处理对我们数据库表的查找。我们目前在 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 会有一些聪明的解决方案,人们已经看到这些解决方案在生产中运行良好。

4

1 回答 1

1

好的,我发现一个名为 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);
于 2012-09-19T03:14:32.377 回答