0

pecl/memcached クライアントで奇妙な問題が発生しています。私のセットアップでは、3 つの memcached サーバーがあります。完全な障害をシミュレートするために memcached サーバーの 1 つ (これは ec2 インスタンスです) を停止すると、「取得」操作が完了するまでに 4 秒かかります。タイムアウトを早めるにはどうすればよいですか?

以下にいくつかのコード スニペットを示します。

$this->memcache = new Memcached;
$this->memcache->setOption(Memcached::OPT_DISTRIBUTION ,Memcached::DISTRIBUTION_CONSISTENT);
$this->memcache->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE ,TRUE);
...
foreach($CFG->data_memcache_servers as $server){
  if (!$this->memcache->addserver($server,11211)){
    throw new Exception('Unable to connect to memcache server');    
  }
}
...
$data = $this->memcache->get($key);
4

3 に答える 3

2

私は同じ問題を経験しており、すべてのタイムアウトが 50 ミリ秒に設定されており、memcached を使用しない (または memcached が停止している) サーバーで set() を実行すると、set() または get() に 21 秒かかります。

ここで確認できるように、libmemcached のバグのようです: https://bugs.launchpad.net/libmemcached/+bug/778777 (および他の多くの Web サイト)

私は Debian に取り組んでおり、libmemcached は 0.40 であり、バグは少なくとも 0.49 までのようです (不良サーバーの自動削除のため)。

Debian 不安定版には 0.44 があり、これは CONNECT_TIMEOUT 値に正しく応答します。

于 2011-07-08T18:45:51.480 に答える
0

PECL Memcached 2.0 より前のバージョンでは、addServer() でフェイルオーバー/タイムアウト関連のパラメーターをサポートしていません。バージョン 1.0.x (たとえば、Ubuntu 10.04 LTS で出荷されたもの) に行き詰まっている場合、これは単一のメイン サーバーから単一のフェイルオーバー サーバーへのフェイルオーバー サポートを提供する簡単な方法です。

$m = new Memcached();
$m->addServer(MEMBASE_HOST, MEMBASE_PORT);

// Immediately check server connection
$m->get('onlinecheck_' . uniqid());

if (in_array($m->getResultCode(), array(Memcached::RES_ERRNO, Memcached::RES_UNKNOWN_READ_FAILURE)))
{
    // Main server not available - Failing over
    $m = new Memcached();
    $m->addServer(MEMBASE_FAILOVER_HOST, MEMBASE_FAILOVER_PORT);
}
于 2011-07-27T14:07:37.617 に答える
0

addserverこの構文を 試してください

addserver($server, 11211, true, 10, 1, -1, false);
于 2011-05-04T00:21:46.627 に答える