Memcached 池未按预期工作
Memcached pool not working as expected
所以我有两个 Memcached 服务器。
在我的 PHP 中,我创建了一个使用 addServer
管理服务器的 Memcached 服务。
$app['memcached'] = $app->share(
function ($app) {
$memcached = new \Memcached;
$memcached->setOption(
\Memcached::OPT_PREFIX_KEY,
$app['memcached.config']['prefix']
);
foreach ($app['memcached.config']['servers'] as $server) {
$host = $server['hostname'];
$port = isset($server['port']) ? $server['port'] : 11211;
$memcached->addServer($host, $port);
}
return $memcached;
}
);
然后我创建了一个状态页面,我尝试在其中进行简单设置并获取密钥以验证一切是否按预期工作。
$time = time();
$memcached->set('system_check', $time);
$memcached_status = $memcached->get('system_check') == $time
? StatusInterface::STATUS_OK
: StatusInterface::STATUS_ERROR;
这让我在刷新时有一半时间正常,一半时间错误。
然后我输出 getServerList 和 getStats 以查看更多信息。
这就是我得到的。
Memcached 显然已经注册了两个服务器。 (服务器 ip 被 x 遮住了)
xx.xx.xx.xx 11211
xx.xx.xx.xx 11211
统计数据给了我一半的时间:
服务器 1:
pid 6027
uptime 4486
threads 4
time 1441804532
pointer_size 64
rusage_user_seconds 0
rusage_user_microseconds 84005
rusage_system_seconds 0
rusage_system_microseconds 76004
curr_items 4
total_items 122
limit_maxbytes 67108864
curr_connections 5
total_connections 156
connection_structures 6
bytes 2286
cmd_get 123
cmd_set 122
get_hits 118
get_misses 5
evictions 0
bytes_read 126989
bytes_written 145298
version 1.4.13
服务器 2:
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:
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
服务器 2:
pid 5201
uptime 5552
threads 4
time 1441805639
pointer_size 64
rusage_user_seconds 0
rusage_user_microseconds 132008
rusage_system_seconds 0
rusage_system_microseconds 60003
curr_items 3
total_items 121
limit_maxbytes 67108864
curr_connections 5
total_connections 95
connection_structures 7
bytes 566
cmd_get 124
cmd_set 121
get_hits 120
get_misses 4
evictions 0
bytes_read 18306
bytes_written 52682
version 1.4.13
所以它就像它一次只使用一个服务器......如果它是一个池并且它在内部处理它,这是有意义的。很好.. 但它试图在不同时间从服务器 1 和服务器 2 获取密钥 'system_check'。这对我来说毫无意义。它应该知道条目放在哪里。
我是否以错误的方式设置了 Memcached 服务器?
已解决
在进一步调试 Memcached 服务器时,他们响应错误代码 47(MEMCACHED_SERVER_TEMPORARILY_DISABLED)。
托管公司的 iptables 配置不正确,不允许两个 memcached 服务器相互通信。修复此问题后,一切都按预期开始工作。
所以我有两个 Memcached 服务器。
在我的 PHP 中,我创建了一个使用 addServer
管理服务器的 Memcached 服务。
$app['memcached'] = $app->share(
function ($app) {
$memcached = new \Memcached;
$memcached->setOption(
\Memcached::OPT_PREFIX_KEY,
$app['memcached.config']['prefix']
);
foreach ($app['memcached.config']['servers'] as $server) {
$host = $server['hostname'];
$port = isset($server['port']) ? $server['port'] : 11211;
$memcached->addServer($host, $port);
}
return $memcached;
}
);
然后我创建了一个状态页面,我尝试在其中进行简单设置并获取密钥以验证一切是否按预期工作。
$time = time();
$memcached->set('system_check', $time);
$memcached_status = $memcached->get('system_check') == $time
? StatusInterface::STATUS_OK
: StatusInterface::STATUS_ERROR;
这让我在刷新时有一半时间正常,一半时间错误。
然后我输出 getServerList 和 getStats 以查看更多信息。
这就是我得到的。
Memcached 显然已经注册了两个服务器。 (服务器 ip 被 x 遮住了)
xx.xx.xx.xx 11211
xx.xx.xx.xx 11211
统计数据给了我一半的时间:
服务器 1:
pid 6027
uptime 4486
threads 4
time 1441804532
pointer_size 64
rusage_user_seconds 0
rusage_user_microseconds 84005
rusage_system_seconds 0
rusage_system_microseconds 76004
curr_items 4
total_items 122
limit_maxbytes 67108864
curr_connections 5
total_connections 156
connection_structures 6
bytes 2286
cmd_get 123
cmd_set 122
get_hits 118
get_misses 5
evictions 0
bytes_read 126989
bytes_written 145298
version 1.4.13
服务器 2:
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:
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
服务器 2:
pid 5201
uptime 5552
threads 4
time 1441805639
pointer_size 64
rusage_user_seconds 0
rusage_user_microseconds 132008
rusage_system_seconds 0
rusage_system_microseconds 60003
curr_items 3
total_items 121
limit_maxbytes 67108864
curr_connections 5
total_connections 95
connection_structures 7
bytes 566
cmd_get 124
cmd_set 121
get_hits 120
get_misses 4
evictions 0
bytes_read 18306
bytes_written 52682
version 1.4.13
所以它就像它一次只使用一个服务器......如果它是一个池并且它在内部处理它,这是有意义的。很好.. 但它试图在不同时间从服务器 1 和服务器 2 获取密钥 'system_check'。这对我来说毫无意义。它应该知道条目放在哪里。
我是否以错误的方式设置了 Memcached 服务器?
已解决
在进一步调试 Memcached 服务器时,他们响应错误代码 47(MEMCACHED_SERVER_TEMPORARILY_DISABLED)。
托管公司的 iptables 配置不正确,不允许两个 memcached 服务器相互通信。修复此问题后,一切都按预期开始工作。