Php MySQL表查找一致性哈希改进
我使用下面的代码处理数据库表的查找已经有几年了。我们目前在6台主机上共享表。查找代码为:Php MySQL表查找一致性哈希改进,php,mysql,sharding,consistent-hashing,Php,Mysql,Sharding,Consistent Hashing,我使用下面的代码处理数据库表的查找已经有几年了。我们目前在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[($ha
$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会有一些聪明的解决方案,人们已经看到这些解决方案在生产中运行良好。好的,我发现一个名为Flexihash的PHP类可以很好地处理这个问题。下面是一篇关于它的博文: 此外,您可以在此处查看Github回购协议: 下面是我的代码现在寻找任何稍后偶然发现此线程的人的方式
$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);
结果是,在发布这篇文章后不久,我发现Flexihash正是我想要的。