Spymemcached Memcached / Membase故障转移

时间:2012-01-25 13:30:10

标签: memcached membase spymemcached

平台:64位Windows操作系统,spymemcached-2.7.3.jar,J2EE

我们想使用两个memcache / membase服务器来缓存解决方案。我们想为每个memcache / membase服务器分配1 GB内存,这样我们总共可以缓存2 GB数据。 我们正在使用spymemcached java客户端来设置和从memcache获取数据。我们没有在两个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吗?如果我们在这里做错了,请告诉我......

2 个答案:

答案 0 :(得分:2)

aspymemcached java客户端dos不处理特定节点的membase故障转移。

参考: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) {
            }
    }

答案 1 :(得分:0)

client.get()将使用第一个可用节点,因此您的值将仅在一个节点上存储/更新。

您的要求似乎有点矛盾 - 首先您要说'我们要为每个memcache / membase服务器分配1 GB内存,这样我们总共可以缓存2 GB数据'这意味着分布式缓存模型(特定密钥存储在缓存场中的一个节点上),然后您希望在该节点关闭时获取它,这显然不会发生。

如果您需要缓存服务器场以在不丢失缓存在该节点上的数据的情况下继续运行节点故障,您应该使用MemBase中提供的复制,但显然您需要支付多次存储相同值的价格,因此您需要“1GB”每台服务器......总共不能有2GB的缓存。