2

平台: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 吗?如果我们在这里做错了什么,请告诉我......

4

2 回答 2

2

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

参考:https ://blog.serverdensity.com/handling-memcached-failover/ 我们需要手动处理(通过我们的代码)

我们可以通过使用ConnectionObserver Here is my code 来做到这一点:

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) {
            }
    }
于 2017-03-22T09:43:24.790 回答
0

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

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

如果您需要您的缓存场在节点故障后不丢失缓存在该节点上的数据,您应该使用复制,它在 MemBase 中可用,但显然您会付出多次存储相同值的代价,因此您希望每台服务器 1GB。 ..total 2GB of cache' 是不可能的。

于 2012-01-25T14:05:48.467 回答