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 服务器时,他们响应错误代码 47MEMCACHED_SERVER_TEMPORARILY_DISABLED)。

托管公司的 iptables 配置不正确,不允许两个 memcached 服务器相互通信。修复此问题后,一切都按预期开始工作。