我已经考虑过制作一个类似于轻量级的一致哈希的PHP函数,以便在不同服务器之间对上传的文件进行分片。
显然,rand()可以在服务器之间稍微均匀地分配文件,但是在请求文件时,没有人知道哪个文件位于哪个服务器上......
我知道有一些广泛的库可以创建一致的哈希,但是我想知道它们是如何工作的以及如何推出我自己的,非常轻量级的库?
注意:我没有考虑将删除服务器,而是将更多的服务器添加到池中。
更新
这是一个快速的伪代码行:
$config['shards'] = array('192.168.1.1, 192.168.1.2');
function shard ($filename) {
$servers = $config['shards'];
// do lookup in some magic way to decide which server to return.
return $appropriateserver;
}
echo shard('filename.jpg'); // returns the appropriate server to distribute the file.
答案 0 :(得分:2)
嗯,你能做的一件事就是使用crc32 ......
$crc = crc32($mykey);
$serverNo = $crc % count($servers);
它应该相当一致(意味着均衡),并且100%可重复......
答案 1 :(得分:1)
我建议使用MurmurHash3:它比加密哈希函数快得多,同时保留similar randomness。 MurmurHash速度接近CRC32甚至更好。有PHP implementation。
答案 2 :(得分:0)
最终的解决方案是:
当您只有4台服务器时,CRC32(密钥)%4
当您想要重新平衡时,您可以在迁移时使用2种不同的哈希函数
例如:
$server_hash1 = crc32($key) % 4
$result = $db->search($server_hash1, $key);
if ($result == false)
{
$server_hash2 = crc32($key) % 8
$result = $db->search($server_hash2, $key);
}