【发布时间】:2011-07-12 18:45:23
【问题描述】:
我使用 php 5.2 和 Apache 2.2 以及 memcached 1.2.6 已经有很长一段时间了,客户端在多个主机上分片。这工作得很好AFAICT。最近,我开始将 memcached 客户端升级到 php 5.3。这来自 ubuntu 服务器 10.04 LTS。 但是,我开始看到一个奇怪的错误,其中一些其他键的值会返回,例如每 1,000,000,000 个请求左右一次(据我所知)。我还无法确定这是否在存储或加载时损坏(在数据过期后进行调试)。 从 get 返回的损坏数据有时是来自完全不同的键的值,有时也是键应该具有的数组值中的单个元素。 在网上搜索并没有发现明显提到这些症状,但很难搜索到,因为大多数讨论都与应用程序级别的竞争条件错误有关。我已经向自己证明了这不是其中之一。
那么,这是堆栈中某处的已知错误吗?其他有类似经历的人吗?提前致谢!
回答一些问题:
是的,它是旧版本。很长一段时间以来,它一直运行良好。因此,我不认为是服务器搞砸了(但我想可能是这样)。我们尝试升级到 1.4.5,但测试失败,因为我们依赖于旧 memcache 的某些行为,这些行为在升级时发生了不兼容的更改。将来会解决这个问题,但你知道那句话:如果它没有坏......
每台分片服务器机器(以及 PHP 客户端)都有 8 GB 的 ECC RAM,因此我们会知道是否存在内存故障。
我所说的不同键的值的意思是,如果我将一组电子邮件地址存储到一个名为“email_addresses_$id”的键中,这种情况很少见,稍后会回读key 返回,比如说,一个 Python 腌制的产品 id 字典,它只被完全不同的代码存储到一个名为“product_ids_$serial”的键中。此外,我们很少会返回单个电子邮件地址,而不是完整的电子邮件地址数组(或单个电子邮件地址的数组,这将是预期的情况)。
另外:我估计我们每天推送超过 TB 的 memcached 流量,因此记录所有这些流量以便能够返回并调试我们每月看到一到三次失败时发生的情况有点不太可能是可行的。
【问题讨论】:
-
其他键的值是什么意思?
-
那是一个 oooooold 版本的 memcached。当您尝试升级到 1.4.5 时,该错误会消失吗?失败了,你在那台机器上做过内存测试吗?