web-dev-qa-db-ja.com

memcache / phpのベストプラクティス-マルチmemcacheノード

だから私はウェブアプリに取り組んでいます-それはスケーラビリティのために構築されなければなりません。頻繁なMySQLクエリをキャッシュに保存します。私はほとんどすべてを構築して準備ができていますが、データをキャッシュする場所を処理するためのベストプラクティスに関心があります。私は数人と話をしましたが、そのうちの1人は、各キー/値をすべてのmemcacheノードに分割することを提案しました。

例を保存する場合の意味:「somekey」、「this is thevalue」

たとえば、3つのmemcacheサーバーに分割されます。

それはより良い方法ですか?または、memcacheは1対1の関係に基づいて構築されていますか?例えば。

障害が発生するまでサーバーAに値を保存します-サーバーBに移動してそこに保存します。

これは、私が行った調査とmemcacheでの過去の経験からの私の現在の理解です。

誰かが私をこれの正しい方向に向けて、どちらの方法が最善か、または私がこれを完全に混乱させているかどうかを教えてください。

ありがとう

1
user62835

Memcachedの「分散」部分のほぼすべてがクライアント側で処理されます。

構成で複数のmemcachedサーバーが定義されている場合(投稿にphpタグが表示されているので、pecl/memcacheを使用していると思いますが、構文はpecl/memcachedでも同様だと思います)

<?php 
$mc = new Memcache() 
$mc->addServer('node1', 11211); 
$mc->addServer('node2', 11211); 
$mc->addServer('node3', 11211); 
?> 

クライアントは、キーのハッシュを使用して、データを配置するサーバーを決定します。 addServerメソッド(retry_interval = -1)のオプションがあり、memcachedサーバーがダウンした場合、PHPはそれを試行し続けません。

Memcacheで「レプリケーション」を実行する方法についてはいくつかの情報がありますが、私の経験から、努力や「無駄な」メモリの価値はありません(allキャッシュを-に保存する必要があります) allサーバー。組み込みの分散メカニズムを使用する場合は、サーバーに保存する必要があります。明らかに、サーバーの1つが停止すると、キャッシュミスが発生するまでそのデータは別のサーバーに保存されますが、とにかく永続ストアとしてMemcacheを使用しないでください)。 Memcacheクライアントプロトコルはかなりスマートです。 ;)

https://blogs.Oracle.com/trond/entry/replicate_your_keys_to_multiple への元のリンクは存在しないため削除されました。

2
bhamby

memcachedはキャッシュメカニズムであり、データの永続的な保存を目的としたものではありません。メタデータの保存ではなく、memcachedが処理の高速化に役立つと常に想定しています。そのためのより適切なオプションがあります(たとえば、redisデータベースを参照してください)。

Memcachedでは、宛先サーバーを決定するためにどのハッシュキーを使用するかも非常に重要です。ハッシュキーメカニズムを決定するとすぐに、保存された値が常に適切なサーバーにマップされます(ハッシュメカニズムにはいくつかの手法があります。非常に興味深いテーマです)。デフォルトでは、memcachedハッシュは、ほとんどのシナリオに対応するハッシュキーメソッドを使用してサーバーに正しくマップされます。

また、memcachedはスラブ割り当てメカニズムが原因で断片化するため、ハッシュメカニズムを変更してスラブによる劣化を回避することもお勧めします。

いくつかの異なるハッシュメカニズムを見てください ここ

1
lynxman