【问题标题】:Potential issue when using memcache session save handler in PHP在 PHP 中使用 memcache 会话保存处理程序时的潜在问题
【发布时间】:2011-06-01 19:45:31
【问题描述】:

我有两个负载平衡的 Web 服务器,并且我正在使用内存缓存会话保存处理程序,其保存路径指向两个内存缓存服务器。它配置了会话冗余设置为两个(memcache 服务器的数量)。所以 PHP 正在将会话数据写入两台 memcache 服务器,当我关闭其中一台服务器时,一切似乎都正常,因为会话数据已写入两台 memcache 服务器。

当我使用该应用程序一段时间后,只启动了一个 memcache 服务器,然后再启动另一个 memcache 服务器,问题似乎发生了。我的理论是 memcache 服务器重新启动,然后 PHP 开始向它询问不存在的会话数据,因为它是在该服务器关闭时写入另一台服务器的。这个理论有什么优点吗? PHP是否应该向两台服务器询问会话数据,也许还有其他问题?

编辑: 我使用的是 2.2.6 版的 PECL 内存缓存包。

【问题讨论】:

    标签: php memcached


    【解决方案1】:

    通过使用以下 php.ini 设置尝试使用一致的哈希策略:

    memcache.hash_strategy = 一致

    这允许从池中添加或删除服务器,而不会导致密钥重新映射到其他服务器。

    http://blog.fedecarg.com/2008/12/24/memcached-consistent-hashing-mechanism/

    【讨论】:

      【解决方案2】:

      根据 Memcache PECL 页面,session_redundancy ini 选项仅在版本 3.0.0 后才可用

      http://pecl.php.net/package/memcache/3.0.0

      尝试下载最新版本并安装(pecl install /path/to/tgz),看看是否仍然出现错误。

      【讨论】:

        【解决方案3】:

        这与 memcache 的实际分布方式有很大关系。本质上,您使用一个可以使用的一个或多个服务器的列表来初始化一个客户端。写入时,数据只发送到一台服务器,而不是全部。

        客户端负责对缓存键进行哈希处理,以确定它应该连接到哪个服务器,用于读取和写入 - 与哈希表决定给定键可能驻留在哪个存储桶中的原理相同。一些 memcache 可以为客户提供权重信息等,以便他们做出更好的决策。

        在您的情况下,您似乎正在使用两台服务器初始化客户端,然后将其中一台停止服务。如果您正在重新配置(例如通过注释掉)服务器列表,那么您实际上是在动态更改该散列策略,并且它与用于确定应存储数据的位置的策略不一致。当您让另一台服务器备份时,客户端会将其重新合并到哈希计算中,然后 that 变得与数据的存储方式不一致。

        我见过的典型解决方法是尝试避免更改实际运行的 memcached 实例的数量(或顺序),通常是准备一些备用。如果您愿意,这些节点可以是资源较少的节点,与您的其他实例在同一个机器上运行就绪 - 只要您在更改 memcache 配置时将它们启动,它们甚至不需要是热备件。

        显然,如果您使用 memcache 来存储“重要”数据,例如会话信息,这些数据不会在其他地方持久化,那么您更关心维护这种完整性而不是实际上只是将它用作一次性缓存,在最坏的情况下,它会在一段时间内影响您的性能。这是一种妥协,真的。

        值得一读:

        【讨论】:

        • PHP 内存缓存会话处理程序可以配置为通过会话冗余设置写入多个内存缓存节点。另外,我不会从配置中删除 memcached 服务器。我只是关闭守护程序。 PHP 内存缓存会话处理程序可能无法如此优雅地处理这种情况。
        猜你喜欢
        • 1970-01-01
        • 2011-05-02
        • 1970-01-01
        • 1970-01-01
        • 2014-12-22
        • 1970-01-01
        • 2014-08-27
        • 2015-11-17
        • 2014-01-29
        相关资源
        最近更新 更多