【发布时间】:2012-03-13 09:48:36
【问题描述】:
同事们!
我正在运行带有 memcache (2.2.6) 客户端库 (http://pecl.php.net/package/memcache) 的 php 5.3 (5.3.8) 来处理 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、客户端库和服务器获得所需的行为。
非常感谢!
最好, 尤金
【问题讨论】:
-
您确定 session.save_path 指令允许多个(逗号分隔)值吗?我没有看到任何阅读 php 文档的真实示例。
-
@Mike 当然可以php.net/manual/en/memcached.sessions.php :'定义逗号分隔的主机名:端口条目以用于会话服务器池,例如“sess1:11211,sess2:11211”。'跨度>
-
感谢链接,没有看到那个页面,至少应该从会话文档中引用它,有点埋在 memcached 下。在 OP 中,您提到错误状态; 'Server 10.0.10.111 (tcp 11211) failed',你举例说你可以telnet到10.0.10.110,你能确认你确实可以telnet到10.0.10.111吗?
-
@Mike 不,问题本身没有问题。从上面的“session.save_path”变量可以看出,它有两个关联的服务器:10.111 和 10.110。我希望它在 10.111 关闭时连接 10.110。虽然它失败了。 我的示例是证明当池中的第二台服务器 (10.110) 处于活动状态时,它在无法连接第一台服务器 (10.111) 后崩溃
-
朋友,我明白这个问题。我的意思是您收到的错误消息是 refused 到服务器 10.111 的连接,但是您在问题中演示的通过 telnet 成功连接到 10.110,我想看看对 10.111 进行相同的确认,以确保没有可能导致您的问题的防火墙设置。
标签: php session memcached redundancy