12

同僚!

memcachedサーバーを処理するためにmemcache(2.2.6)クライアントライブラリ(http://pecl.php.net/package/memcache)でphp 5.3(5.3.8)を実行しています。私の目標は、セッションエンジン用のフェイルオーバーソリューションを用意することです。

  • ネイティブphpセッションのみがサポートされます(カスタムハンドラーはサポートされません)
  • プール内のmemcachedサーバーはほとんどありません

私が期待しているのは、memcachedサーバーの1つがダウンした場合、phpはプール内の2番目のサーバーを利用しようとします[正常に接続して幸せになります]が、プール内の最初のmemcachedサーバーがダウンしたときに受信します次のエラー:

Session start failed. Original message: session_start(): Server 10.0.10.111 (tcp 11211) failed with: Connection refused (111)

関連するphp設定は次のとおりです。

session.save_handler memcache
session.save_path tcp://10.0.10.111:11211?persistent=1&weight=1&timeout=1&retry_interval=10, tcp://10.0.10.110:11211?persistent=1&weight=1&timeout=1&retry_interval=10

およびmemcacheの設定(標準に近いと思いますが)は次のとおりです。

Directive   Local Value
memcache.allow_failover 1
memcache.chunk_size 8192
memcache.default_port   11211
memcache.default_timeout_ms 1000
memcache.hash_function  crc32
memcache.hash_strategy  standard
memcache.max_failover_attempts  20

Memcachedは引き続き2番目のサーバーで実行されており、WEBサーバーから完全にアクセスできます。

telnet 10.0.10.110  11211
Trying 10.0.10.110...
Connected to 10.0.10.110 (10.0.10.110).
Escape character is '^]'.
get aaa
END
quit
Connection closed by foreign host.

つまり、リストされているすべてのサーバーに順番にクエリを実行する代わりに、キュー内の最初のサーバーへの接続に失敗するとクラッシュします。最後に、3.0.xクライアントライブラリのリリースが利用可能であることに気付きましたが、まだベータ版であるため、信頼性が高すぎるようには見えません。

標準のPHP、クライアントライブラリ、サーバーで目的の動作を実現するにはどうすればよいかアドバイスしてください。

どうもありがとう!

最高、ユージーン

4

3 に答える 3

7

この質問に参加したすべての人に感謝します。答えは次のとおりです。実際には、セッションハンドラーとしてのmemcache(memcache dではない)はコンマ区切りのサーバーをサポートしsession.save_pathさらにフェイルオーバーをサポートします。上記のエラーSession start failed. Original message: session_start(): Server 10.0.10.111 (tcp 11211) failed with: Connection refused (111)は、8番目(通知)レベルしかありませんでした。実際、エンジンは、サーバーの1つが使用できないという事実を通知し(論理的ですが、そうでない場合はどうすればわかりますか?)、2番目のサーバーに正常に接続して使用します。

したがって、すべての誤解は、ドキュメントの脆弱性、memcache / memcachedの混乱、およびカスタムエラーハンドラのパラノイド(E_ALL)設定によって引き起こされています。Connection refused (111)それまでの間、セッション確立コンテキストのエラーに関する通知を無視することで、問題は解決されました。

于 2012-02-24T13:43:33.067 に答える
7

Memcached拡張機能を使用します。PHPには2つのmemcacheプラグインがあることに注意してください。1つはMemcacheと呼ばれ、もう1つはMemcachedと呼ばれます。はい、それは紛らわしいですが、とにかく本当です。

Memcacheプラグインは、プロトコル識別子(tcp)とパラメーター(永続性など)を使用して、使用している複雑なURLをサポートしますが、Memcachedプラグインは接続プールをサポートします。

上記のコメント(http://www.php.net/manual/en/memcached.sessions.php)で言及しているドキュメントは、Memcache拡張機能に関するものであり、Memcacheに関するものではありません。

更新:いくつかの興味深い読み物:https ://serverfault.com/questions/164350/can-a-pool-of-memcache-daemons-be-used-to-share-sessions-more-efficiently

于 2012-02-23T23:15:37.623 に答える
0

ハッシュ戦略を変更する必要があります

構成を次のように変更します

memcache.hash_strategy  consistent

一貫性のあるmemcacheにハッシュ戦略を立てると、複数のサーバー間でデータがコピーされます。サーバーの1つがダウンしている場合、次の要求でサーバーのコピーを再試行します。

于 2013-07-14T10:17:43.237 に答える