分片/分发(一致哈希)的功能?

时间:2010-07-30 09:48:00

标签: php distributed distribution sharding consistent-hashing

我已经考虑过制作一个类似于轻量级的一致哈希的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.

3 个答案:

答案 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);
}
  • 您必须对插入/更新(使用从config1到config2的移动功能)
  • 执行相同的操作
  • 您可以执行移动异步(批量方式)