我有一个两台 memcached 服务器设置。当 memcached 写入失败时,我会收到一封电子邮件通知。大约每天会出现一次“服务器已失败且已禁用,直到定时重试”错误,我不知道如何找到原因。
我正在使用 PHP Memcached 客户端。
我没有使用太长的密钥。我尝试添加 -v 标志,但没有帮助,日志仍然是空的。
如果我将 getStats 的输出添加到错误通知中,我会收到以下信息:
Array
(
[192.168.0.3:11211] => Array
(
[pid] => 28167
[uptime] => 3671962
[threads] => 4
[time] => 1358714713
[pointer_size] => 64
[rusage_user_seconds] => 24516
[rusage_user_microseconds] => 130981
[rusage_system_seconds] => 86246
[rusage_system_microseconds] => 675512
[curr_items] => 1616352
[total_items] => 118339822
[limit_maxbytes] => 2684354560
[curr_connections] => 8
[total_connections] => 78108681
[connection_structures] => 356
[bytes] => 981522779
[cmd_get] => 1561752945
[cmd_set] => 158718324
[get_hits] => 1383072575
[get_misses] => 178680370
[evictions] => 0
[bytes_read] => 138113231690
[bytes_written] => 1091741700765
[version] => 1.4.15
)
[192.168.0.4:11211] => Array
(
[pid] => -1
[uptime] => 0
[threads] => 0
[time] => 0
[pointer_size] => 0
[rusage_user_seconds] => 0
[rusage_user_microseconds] => 0
[rusage_system_seconds] => 0
[rusage_system_microseconds] => 0
[curr_items] => 0
[total_items] => 0
[limit_maxbytes] => 0
[curr_connections] => 0
[total_connections] => 0
[connection_structures] => 0
[bytes] => 0
[cmd_get] => 0
[cmd_set] => 0
[get_hits] => 0
[get_misses] => 0
[evictions] => 0
[bytes_read] => 0
[bytes_written] => 0
[version] =>
)
)
答案1
MEMCACHED_SERVER_TEMPORARILY_DISABLED或者 ”服务器已发生故障并被禁用,直至定时重试“由库生成libmemcached
。我无法确认如何pecl_memcached
处理此错误,但我认为它会被视为标准连接错误。当连接超过超时和/或重试限制时,将发出此消息。(请参阅 I/O 选项)
当然,由于这是一个暂时的问题,您可以设计您的 PHP 应用程序以转移到下一个缓存服务器,或将受影响的服务器从服务器列表中拉出。
答案2
就我而言,关闭行为选项tcp_nodelay
使其起作用。
这似乎是 的一个选项pylibmc
,它是 的python包装器libmemcached
,但文档说,这个选项属于 中可直接配置的选项libmemcached
。
更多信息请参阅pylibmc
文档http://sendapatch.se/projects/pylibmc/behaviors.html
答案3
就我而言,我在代码中将 localhost 更改为“127.0.0.1”。并且我能够解决错误“服务器已失败且已被禁用,直到定时重试”
希望有帮助
'options' => array(
'servers' => array('127.0.0.1', 11211),
答案4
就我而言,出现此错误消息的原因是服务器名称不正确。
准备配置字符串的代码不知怎么搞乱了,其中一个 memcache 服务器名称前面出现了一个空格字符。这导致在从服务器读取时出现上述错误消息。
我使用的是 PHP 和 Memcached 扩展。添加带空格的服务器名称没有任何问题,也就是说,没有对它们进行内部验证。只有在必须连接到服务器时才会检查它们。