我一直在使用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”的密钥中,很少见,稍后会回读一下例如,关键返回产品ID的Python腌制字典,它们只能通过完全不同的代码存储到名为“product_ids_ $ serial”的密钥中。此外,我们很少会收到一个电子邮件地址,而不是一整套电子邮件地址(或一个电子邮件地址的数组,这可能是预期的情况)。
另外:我估计我们每天推送超过1TB的memcached流量,因此记录所有内容以便能够返回并调试在我们每月看到一到三次的故障时发生的事情有点不太可能是可行的。
答案 0 :(得分:0)
这很可能是关键冲突的问题,您是否在将密钥发送到memcached之前使用了特殊哈希?
升级到最新的PHP是否导致方法/功能的意外返回?打开所有错误并注意错误。
答案 1 :(得分:0)
我们已经能够重现这个问题。
事实证明,如果与memcached的连接失败,PHP memcached客户端库版本3将失败。它返回一个错误,但将前一个请求的数据排队。进入库的下一个请求将导致新连接打开,然后使用新请求中的密钥,但来自旧请求的数据!
这听起来很疯狂,我知道,但它完全可以重现。