【问题标题】:Sessions Failover with PHP-memcache against memcached使用 PHP-memcache 针对 memcached 的会话故障转移
【发布时间】: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


【解决方案1】:

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

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

您在上面的 cmets (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

【讨论】:

  • 我在查看文档时也注意到了这一点,但根据上述文档,他的实现应该也能正常工作。
  • 好吧,我在文档中找不到连接池应该适用于 memcache 插件。实际上,关于 memcache 会话处理程序的文档并不多。
  • 查看这些文档:php.net/manual/en/memcached.sessions.php,根据 PHP 官方和下面的 cmets,它应该可以工作。
  • 本文档和 cmets 没有说连接池适用于 memcache(注意:没有 'd')扩展。说它适用于 memcached(注意:带有 'd')扩展。
  • 可以推断,通过同一行提供 2 个服务器的能力应该适用于 memcache,就像它适用于 memcached。除了连接池,如果一个服务器无法访问,列表中的另一台服务器应该能够管理会话处理。
【解决方案2】:

我要感谢所有参与这个问题的人,答案如下:实际上memcache(不是memcached)作为会话处理程序支持逗号分隔的服务器作为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) 的通知,该问题已得到解决

【讨论】:

  • Ic,因此生成消息是因为服务器实际上已关闭,但由于另一台服务器正在运行,您的会话处理行为是否符合预期?
  • 大声笑,我不会撒谎,我为没有早点意识到这一点而感到愚蠢。澄清一下,这不是连接池,而是冗余?
  • @MikePurcell 我也有同感。 “这不是连接池,它是冗余” - 抱歉不知道你的意思,你能改写一下吗?
  • 正如 Rolf 提到的,memcacheD 支持连接池,因为多台服务器充当一个巨大的池,因此如果一台服务器停止运行,它是对正在运行的服务器的透明故障转移。而且由于数据是分布式的,因此不会丢失任何内容。对于 memcache(d),如果您列出多个服务器,它们不会共享相同的值。
  • Memcache 也是如此。据我了解,使用 memcached 的好处是您可以查询池中的特定 memcached 服务器,而 memcache 自行决定。 Memcache 还支持两种映射策略:php.net/manual/en/memcache.ini.php#ini.memcache.hash-strategy 用于密钥分发。有趣的 3.x 版本(仍然是 beta)支持:memcache.redundancy 和 memcache.session_redundancy 应该用于多次确定 hpw 每个键(或会话数据)将在多个服务器上复制
【解决方案3】:

你必须改变哈希策略

将你的配置更改为

memcache.hash_strategy  consistent

当您将哈希策略设为一致时,memcache 会跨多个服务器复制数据。如果其中一个服务器停机,它会在下一个请求时重试复制它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多