4

特定のキーがプール内のすべての memcached サーバーに確実に配布されるようにする方法について少し考えました。

私の現在のテストされていない解決策は、次のような memcached の別のインスタンスを作成することです。

$cluster[] = array('host' => '192.168.1.1', 'port' => '11211', 'weight' => 50);

$this->tempMemcached = new Memcached;
$this->tempMemcached->addServers($cluster);

foreach ($this->cluster() as $cluster) {    

    $this->tempMemcached->setByKey($cluster, $key, $value, $this->compress, $expireTime);

}

$this->tempMemcache->close();

信頼性のために特定のキーをすべてのサーバーに保存する必要がある場合、この場合に行うべき常識は何ですか?

4

3 に答える 3

6

設計された方法で memcached を使用していないと思います。FAQを参照してください: アイテムの1 つのコピーのみを保存する必要があります。これにより、使用されるハッシュ アルゴリズムに従って、アイテムが特定のノードに配置されます。

すべてのノードでアイテムを利用できるようにしたい場合、これを行う唯一の方法は、現在行っているのとまったく同じように繰り返すことです。

このアイテムがキャッシュに見つからない場合、あなたのコードがケースを処理してくれることを願っています。

于 2010-05-26T13:23:55.270 に答える
4

Memcached の要点を見逃していると思います。信頼できるデータ ストレージ用ではありません。これは、キャッシュされたデータに非常に高速にアクセスするためのものです。冗長性が必要な場合は、MongoDB などの NOSQL データベースを試してください...

さらに、複数の接続を作成すると、パフォーマンスと冗長性が低下します (作成する必要がある接続が多いほど、何かがうまくいかない可能性が高くなり、各要求に対してより多くの処理を行う必要があります)。

単純化して、複雑にしないでください...

于 2010-05-23T23:53:38.377 に答える
1

非常に頻繁にヒットするキーの負荷を memcache サーバー全体に「分散」する必要がありました。これを行うには、乱数 0 ~ N を追加するだけです。N は、構成したインスタンス数の倍数です。見逃した場合は、ソース (データベースなど) に移動します。memcache はキーに対してハッシュするため、知らないうちにバケットの衝突が発生する可能性があります。

これにより、ソースからのより多くの読み取り (N の倍数に比例) の前払いコストが発生する可能性がありますが、1 つのキーの負荷がすべてのインスタンスに分散され、それらのボックスが適切に維持されます。

しかし、ええ、これは冗長性のためではなく、負荷分散のためです。

于 2010-06-03T04:46:48.127 に答える