【问题标题】:Memcached PHP client library bug?Memcached PHP 客户端库错误?
【发布时间】: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 时,该错误会消失吗?失败了,你在那台机器上做过内存测试吗?

标签: php ubuntu memcached


【解决方案1】:

这很可能是密钥冲突的问题,您在将密钥发送到 memcached 之前是否使用了特殊哈希?

升级到最新的 PHP 是否导致方法/函数意外返回?打开所有错误并注意错误。

【讨论】:

  • 键是实际唯一的字符串。我们的 API 使用符合犹太教规。但是,我们不能在生产环境中打开通知,因为我们拥有的请求量以及并非完全没有通知的站点会过于嘈杂。
  • 如果你的代码没有错误应该没有噪音,如果有噪音你发现你的问题,可以得到5分钟的样本并将其关闭。
  • 最后一次,这个代码库是几百万行代码,最初是 php4,并且通知(“index blah not defined in array...”)实际上并不是生产中的错误。他们也没有告诉我为什么 memcache 客户端库会失败。在最好的情况下,我们将有无限的工程时间来修复通知,但这不是我们生活的世界。
  • 您可以将这些错误排除在外……没有千篇一律的解决方案。如果遇到冲突,首先要调试。
【解决方案2】:

我们已经能够重现这个问题。

事实证明,如果与 memcached 的连接失败,PHP memcached 客户端库版本 3 将失败。它返回一个错误,但将前一个请求的数据排队。进入库的下一个请求将导致打开新连接,然后使用新请求中的密钥,但使用旧请求中的数据!

这听起来很疯狂,我知道,但它完全可以重现。

【讨论】:

  • 我们遇到了同样的问题。内存缓存有时会为同一个键返回不同的值。一天发生几次。我们有 4 个内存缓存服务器。也许我们有同样的问题,你认为你可以给我一个脚本,如果你有的话,如何重现或指导如何尝试?
  • 你使用pconnect功能吗?尝试使用连接而不是
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
相关资源
最近更新 更多