在PHP中使用memcache会话保存处理程序时可能出现的问题

时间:2010-12-31 00:24:06

标签: php memcached

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

当我使用应用程序一段时间只有一个内存缓存服务器时,似乎会出现问题,然后再将其他服务器重新启动。我的理论是memcache服务器重新启动,然后PHP开始询问它是否存在会话数据,因为当它被关闭时,它被写入另一台服务器。这个理论有什么价值吗? PHP应该向两台服务器询问会话数据吗?可能还有其他问题吗?

编辑: 我正在使用PECL内存缓存包的2.2.6版本。

3 个答案:

答案 0 :(得分:2)

memcache 的实际分发方式有很大关系。实质上,您使用可以使用的一个或多个服务器的列表初始化客户端。执行写操作时,数据仅发送到一个服务器,而不是全部。

客户端负责散列缓存密钥以确定它应连接到哪个服务器,包括读取和写入 - 与散列表相同的原则决定给定密钥可能驻留在哪个存储桶中。一些 memcache < / strong>客户可以获得重量信息等,以使他们的决策更好。

在您的情况下,您似乎是使用两台服务器初始化客户端,然后丢弃一台服务器。如果您正在重新配置(例如通过注释掉)服务器列表,那么您可以实时有效地更改该哈希策略,并且它与用于确定数据应存储位置的策略不一致。当您重新启动其他服务器时,客户端会将其重新合并到哈希计算中,然后 与数据 的存储方式不一致。

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

显然,如果您使用 memcache 存储“重要”数据(如会话信息),而这些数据并未在其他地方保留,那么您更关心的是保持这种完整性,而不是保持这种完整性。真的只是将它用作一次性缓存,最糟糕的是,它会影响你的性能一段时间。这真的是妥协。

值得一读:

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

memcache.hash_strategy =一致

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

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