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

さて、あなたができることの1つは、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

最終的な解決策は次のようになります。

サーバーが4台しかない場合はCRC32(key)%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 に答える