15

私は終日、PHP を使用して Memcache を理解し、コーディングしようとしましたが、いくつかの点で混乱しています。私は多くの記事を読み、これに関連するほぼすべての SO の質問を調べましたが、正確な答えを見つけることができませんでした。

1) PHP で Consistent Hashed Key を作成するコードは何ですか? どのライブラリをインストールする必要があり、本当に何をする必要があるのか​​? 良い記事はありますか?

2) コンシステント ハッシュ キーを正常に保存したとします。コンシステント ハッシュ キーなどを使用している場合でも、いずれかのサーバーがダウンしているか、新しいサーバーを追加した場合、違いはありますか?

3) Memcached::addServer() の代わりに Memcached::addServers() を使用すると、http://ru.php.net/manual/en/memcached.addserver.php に記載されているように、Consistent Hashing の場合に違いが生じます。そうではなく、どういう意味ですか?

$m = new Memcached();
$m->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$m->addServers($servers);

4) コンシステント ハッシュには上記のコードを使用するだけで十分であり、サーバーを追加/削除してもキーに違いはありませんか?

5) ケタマ図書館とは?Memcached::DISTRIBUTION_CONSISTENT がより適切に機能する場合、なぜそれを使用するのでしょうか? http://www.last.fm/user/RJ/journal/2007/04/10/rz_libketama_-_a_consistent_hashing_algo_for_memcache_clientsに従う

6) なんらかの方法でキーをハッシュする必要がありますか、それとも単にキーを提供し、残りは Memcached に処理させる必要がありますか?

できるだけ早く私の実稼働環境を理解して実装するために、あなたの本当のサポートが必要です。あなたの答えは、何をより良くコーディングする必要があるかを理解するのに役立ちます。

4

2 に答える 2

18

これらは一度に多くの質問がありますが、1 つずつ答えるために最善を尽くします。

1) PHP で Consistent Hashed Key を作成するコードは何ですか? どのライブラリをインストールする必要があり、本当に何をする必要があるのか​​? 良い記事はありますか?

あなたのコードに疑問を投げかけるように、このコードは PHP の Consistent Hashing には十分です。Memcached で Consistent Hashing を使用するには、LibMemcached クライアント ライブラリを使用する必要があります。コードの下に次の行を追加するだけです

$m->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);

コンシステント ハッシュを使用する場合は、このオプションを有効にすることを強くお勧めします。将来のリリースではデフォルトで有効になる可能性があります。http://www.php.net/manual/en/memcached.constants.phpをよりよく理解するために、一連の定数とその定義については、これに従ってください

ただし、php.ini でグローバルに設定することにより、パフォーマンスを向上させることができます (まだテストしていません)。

memcache.hash_strategy = consistent;

http://blog.fedecarg.com/2008/12/24/memcached-consistent-hashing-mechanism/で提案されているように、各 memcached 呼び出しで個別に指定する必要はありません。デフォルト値は標準で、サーバーを追加または削除する場合には役に立たないモジュラス計算を使用します。

2) コンシステント ハッシュ キーを正常に保存したとします。コンシステント ハッシュ キーなどを使用している場合でも、いずれかのサーバーがダウンしているか、新しいサーバーを追加した場合、違いはありますか?

lsmoothが言ったように、サーバーが削除または追加されると常に影響がありますが、1台のサーバーを3台のサーバーに追加すると仮定すると、キーが約1/4 = 25%失われるため、多くのサーバーがキーを失う可能性が低くなります。 .

3) Memcached::addServer() の代わりに Memcached::addServers() を使用すると、http://ru.php.net/manual/en/memcached.addserver.php に記載されているように、Consistent Hashing の場合に違いが生じます。そうではなく、どういう意味ですか?

イスムースの言うとおりです。彼は正しい。addServers を使用することをお勧めします。setOption ですべてのオプションを設定した後、«addServers()» を呼び出す必要があることに注意してください。そうしないと、オプションはそれらのサーバーに適用されません。

4) コンシステント ハッシュには上記のコードを使用するだけで十分であり、サーバーを追加/削除してもキーに違いはありませんか?

質問 No 1 の回答で既に回答済みです。

5) ケタマ図書館とは?Memcached::DISTRIBUTION_CONSISTENT がより適切に機能する場合、なぜそれを使用するのでしょうか? http://www.last.fm/user/RJ/journal/2007/04/10/rz_libketama_-_a_consistent_hashing_algo_for_memcache_clients

LibKetama は Consistent Hashing キー配布アルゴリズムのベースとなるライブラリです。したがって、Memcached で Consistent Hashing を使用することは、LibKetama を使用することを意味し、それがそれです。

6) なんらかの方法でキーをハッシュする必要がありますか、それとも単にキーを提供し、残りは Memcached に処理させる必要がありますか?

Yvan によると、「Memcached クライアントはキーを自動的にハッシュします。たとえば、A、B、C の 3 つのサーバーと、«K1» から «K9» までの 3 つのキーがあるとします。たとえば、クライアント ハッシュ アルゴリズムは次のように保存されます: K1/K2 /K3 は A に保存され、K4/K5/K6 は B に保存され、K7/K8/K9 は C に保存されます。サーバー B がダウンした場合、そのキー (K4/K5/K6) は残りの 2 台のサーバーに均等に保存されます ( A and C). たとえば、K4 は A に移動し、K5/K6 はサーバー C に移動します。

これは単なる例であり、実際のアルゴリズムではありません。関数 $memcached->getServerByKey( 'K4') を使用して、どのサーバーでどのキーが使用されているかを確認できます。次に、1 つのサーバーをダウンさせ、この失敗後に getServerByKey() が何を送信するかを確認ます

于 2014-01-01T10:49:30.180 に答える
8

コンシステント ハッシュは、PHP の memcached 拡張機能でサポートされています。次のようにコードで使用する以外は、何もする必要はありません。

<?php
  $servers = array(
    array('memcache1.example.com', 11211),
    array('memcache2.example.com', 11211)
    );
  $m = new Memcached();
  $m->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
  $m->addServers($servers);
?>

その後、キャッシュへのアイテムの追加を開始すると、サーバーを追加した場合にキャッシュの損失を最小限に抑えるために、拡張機能によってアイテムがサーバーに自動的に配布されます。たとえば、サーバーがダウンしているなどの理由で、あるはずのサーバーからアイテムを取得できない場合は、php コードでそれを自分で処理する必要があります。

addServer の代わりに addServers を使用しても、Consistent Hashing に違いはありません。ドキュメントに記載されているように、複数のサーバーを追加する場合は addServers を使用して、内部データ構造が一度だけ更新されるようにする必要があります。

PHP の Consistent Hashing の実装はlibketama に基づいているため、libketama はまったく必要ありません。拡張機能は、アイテムをさまざまなサーバーに配布して、キャッシュの損失を最小限に抑えます. サーバーが削除または追加されると、常に影響があります。

于 2014-01-01T02:06:33.650 に答える