2

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

3 回答 3

2

好吧,您可以做的一件事是使用 crc32 ...

$crc = crc32($mykey);
$serverNo = $crc % count($servers);

它应该是相当一致的(意味着均匀平衡),并且 100% 可重现......

于 2010-07-30T10:15:24.093 回答
1

我推荐使用MurmurHash3:它比加密哈希函数快得多,同时保留了类似的随机性。MurmurHash 速度接近 CRC32 甚至更好。有PHP 实现

于 2012-09-07T08:45:38.930 回答
0

最终的解决方案是:

CRC32(key) % 4 当你只有 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 的移动功能)
  • 您可以进行异步移动(批处理方式)
于 2012-03-28T13:51:23.407 回答