12

同事!

我正在运行 php 5.3 (5.3.8) 和 memcache (2.2.6) 客户端库 (http://pecl.php.net/package/memcache) 来处理 memcached 服务器。我的目标是为会话引擎提供故障转移解决方案,即:

  • 仅支持本机 php 会话(无自定义处理程序)
  • 池中很少有 memcached 服务器

我期望的是,如果其中一个 memcached 服务器关闭,php 将尝试利用池中的第二个服务器 [将成功连接它并变得快乐],但是当池中的第一个 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 仍在第二台服务器上运行,并且可以从 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 客户端库的版本,但它看起来对我来说不太可靠,因为它仍处于 beta 版本。

请建议我如何使用标准 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 级(通知)。事实上,引擎只是通知您其中一台服务器不可用(这是合乎逻辑的,否则您怎么知道?)然后成功连接到第二台服务器并使用它。

所以所有的误解都是由我的自定义错误处理程序的薄弱文档、memcache/memcached 混淆和偏执(E_ALL)设置引起的。Connection refused (111)同时,通过忽略在会话建立上下文中提到错误的通知,该问题已得到解决

于 2012-02-24T13:43:33.067 回答
7

使用 Memcached 扩展。请注意,PHP 有两个 memcache 插件。一种称为 Memcache,另一种称为 Memcached。是的,这很令人困惑,但无论如何都是真的。

Memcache 插件支持您使用的那些复杂的 URL,带有协议标识符 (tcp) 和参数(持久性等),而 Memcached 插件支持连接池。

您在上面的评论 ( http://www.php.net/manual/en/memcached.sessions.php ) 中提到的文档是关于 Memcached 扩展的,而不是关于 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 会跨多个服务器复制数据。如果其中一个服务器停机,它会在下一个请求时重试复制它。

于 2013-07-14T10:17:43.237 回答