1

データベース テーブルのルックアップを処理するために、次のコードを数年間使用しています。現在、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[($hash % $db_server_count)];

この「アルゴリズム」には、高速でかなりランダムであるという利点があります。ただし、クラスターに新しいノードを追加するたびに、別のホストに移動する必要がある不要な量のテーブルがあるように見えるため、リバランスにはかなりの時間がかかります。これは大きな問題ではありません。リバランス スクリプトを作成できたので、リバランス中にダウンタイムが発生することはありません。むしろ、それが完了するまで、わずかなパフォーマンスのペナルティがあります。

私の質問は、新しいホストが追加されたときに大量のリバランスを行わずに、この形式の一貫したハッシュを達成する他のアルゴリズムがあるかどうかです。私はこのトピックの調査を続けていますが、Stack Overflow には、本番環境でうまく機能することがわかっている巧妙なソリューションがあると考えていました。

4

1 に答える 1

1

わかりました、これをうまく処理する Flexihash という PHP クラスを見つけました。これに関するブログ投稿は次のとおりです。http://paul.annesley.cc/2008/04/flexihash-consistent-hashing-php/

さらに、こちらの Github リポジトリもご覧ください: https://github.com/pda/flexihash

後でこのスレッドに出くわした人のために、私のコードが今どのように見えるかを次に示します。

$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);
于 2012-09-19T03:14:32.377 に答える