2012-02-02 45 views
4

私のphpサイトでmemcacheに問題があります。時折私はサイトが誤動作しているという報告を得るでしょう、そして、私がmemcacheを見ると、私はいくつかの鍵がクラスタの両方のサーバに存在することを発見します。データは2つのエントリ間で同じではありません(1つは古いものです)。memcachedの重複キー

私がmemcachedを理解していれば、これは起こらないはずです。クライアントはキーをハッシュしてから、常に同じサーバーを選択する必要があります。だから私の理解が間違っているか、私のコードが間違っています。なぜこれが起こっているのかも説明できますか?

FWIWサーバーはAmazon EC2でホストされています。 memcacheのに

私のすべての接続は、この関数を使用して開かれます:

$mem_servers = array(
    array('ec2-000-000-000-20.compute-1.amazonaws.com', 11211, 50), 
    array('ec2-000-000-000-21.compute-1.amazonaws.com', 11211, 50) 
); 

function ConnectMemcache() 
{ 
    global $mem_servers; 
    if ($memcon == 0) { 
      $memcon = new Memcache(); 
      foreach($mem_servers as $server) $memcon->addServer($server[0], $server[1], true); 
    } 
    return($memcon); 
} 

と値は、このを通じて保存されています

function SetData($key,$data) 
{ 
    global $mem_global_key; 
    if(MEMCACHE_ON_OFF) 
    { 
     $key = $mem_global_key.$key; 
     $memcache = ConnectMemcache(); 
     $memcache->set($key, $data); 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

答えて

1

私はこのブログの記事は、問題あなたが持つに触れると思います。以下が起こるように聞こえる記事から

http://www.caiapps.com/duplicate-key-problem-in-memcache-php/

:鍵が更新されたデータ
と第二のサーバ上で再作成されます - - - もともとは鍵を持っている
脱落memcacheのサーバー
第一サーバは古いデータでオンラインに戻ってクラスタに入ります。
- 今、あなたはキーはあなたが長い重複があなたの中に存在している場合がありますどのように最小限に抑えるために、あなたの書き込みの前にmemcacheのクラスタをクリアするためにするMemcache ::フラッシュを使用する必要がありますように

が鳴る異なるデータと2台のサーバーに保存していクラスタ。