2012-01-25 4 views
1

プラットフォーム:64ビットのWindows OS、spymemcached-2.7.3.jar、J2EESpymemcache- Memcacheの/ MemBase値Faileover

私たちは、キャッシングソリューションのための2つのmemcache/MemBase値サーバを使用したいです。各memcache/membaseサーバに1GBのメモリを割り当てたいので、合計で2GBのデータをキャッシュできます。 memcacheからデータを取得したり取得したりするためにspymemcached Javaクライアントを使用しています。私たちは、2つのmembaseサーバー間で複製を使用していません。

J2EEアプリケーションの起動時にmemcacheClientオブジェクトをロードしています。

URI server1 = new URI("http://192.168.100.111:8091/pools"); 
    URI server2 = new URI("http://127.0.0.1:8091/pools"); 
    ArrayList<URI> serverList = new ArrayList<URI>(); 
    serverList.add(server1); 
    serverList.add(server2); 
    client = new MemcachedClient(serverList, "default", ""); 

その後、memcacheClientを使用してmemcache/membaseサーバーの値を取得して設定します。

Object obj = client.get("spoon"); 
client.set("spoon", 50, "Hello World!"); 

memcacheClientは、server1からの設定と取得と値だけです。

server1を停止すると、値を取得/設定できません。 server1がダウンした場合、server2を使用しないでください。私たちがここで間違って何かしているかどうか私に教えてください...

+0

私は同様の問題がありました。これを見てください:https://blog.serverdensity.com/handling-memcached-failover/ –

答えて

0

client.get()は最初に利用可能なノードを使用するので、あなたの値は1つのノードにのみ保存/更新されます。

まず、「は、各memcache/membaseサーバーに1GBのメモリを割り当てて、2GBのデータをキャッシュすることができます。」という意味で、分散キャッシュを意味します。モデル(特定のキーはキャッシュ・ファーム内の1つのノードに格納されています)。そのノードが停止している場合は、モデルをフェッチする予定です。

ノードに障害が発生しても、そのノードにキャッシュされたデータを失うことなくキャッシュファームを使用する必要がある場合は、MemBaseで使用できるレプリケーションを使用する必要があります。ただし、同じ値を複数回保存するコストは、サーバーあたり1GB ...合計2GBのキャッシュ 'は不可能です。

+0

返信ありがとうございます.. – user989010

+0

私のシナリオはです。 MemcachedClientオブジェクトの設定中に、サーバー1とサーバー2の両方が起動しています。サーバー1が停止します。 key2/value2を入れようとすると、Server2から値を取得したり取得したりしていませんか? server1がダウンした場合、server2を使用しないでください。私たちがここで何か悪いことをしているかどうか私に知らせてください... – user989010

+0

あなたはあなた自身と矛盾しています。元の質問ではget/setを使用していますが、今はset/getのように見えます。問題の声明をより正確に修正し、おそらく私たちが助けてくれるかもしれません。 – maximdim

1

aspymemcached javaクライアントのdosは、特定のノードのmembase failoverを処理しません。

参考:https://blog.serverdensity.com/handling-memcached-failover/ 我々は(我々のコードで)手動でそれを処理する必要が

我々はここでConnectionObserver を使用することによってこれを行うことができますが、私のコードです:

public static void main(String a[]) throws InterruptedException{ 
      try { 
       URI server1 = new URI("http://192.168.100.111:8091/pools"); 
       URI server2 = new URI("http://127.0.0.1:8091/pools"); 
       final ArrayList<URI> serverList = new ArrayList<URI>(); 
       serverList.add(server1); 
       serverList.add(server2); 
       final MemcachedClient client = new MemcachedClient(serverList, "bucketName", ""); 
       client.addObserver(new ConnectionObserver() { 

        @Override 
        public void connectionLost(SocketAddress arg0) { 
         //method call when connection lost 
         for(MemcachedNode node : client.getNodeLocator().getAll()){ 
          if(!node.isActive()){ 
           client.shutdown(); 
           //re init your client here, and after re-init it will connect to your secodry node 
           break; 
          } 
         } 
        } 
        @Override 
        public void connectionEstablished(SocketAddress arg0, int arg1) { 
         //method call when connection established 
        } 
       }); 
       Object obj = client.get("spoon"); 
       client.set("spoon", 50, "Hello World!"); 
      } catch (Exception e) { 
      } 
    } 
関連する問題