首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL表查找一致性散列的改进

MySQL表查找一致性散列的改进
EN

Stack Overflow用户
提问于 2012-09-19 07:35:58
回答 1查看 848关注 0票数 1

几年来,我一直在使用以下代码来处理数据库表上的查找。我们目前在6台主机上共享我们的表。查找代码为:

代码语言:javascript
复制
$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会有一些聪明的解决方案,人们已经在生产中看到了很好的效果。

EN

回答 1

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

下面是我的代码现在对于任何后来偶然发现这个线程的人的样子。

代码语言:javascript
复制
$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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12486587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档