【问题标题】:Spymemcache- Memcache/Membase FaileoverSpymemcached Memcached/Membase 故障转移
【发布时间】:2012-01-25 13:30:10
【问题描述】:

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

【问题讨论】:

标签: memcached membase spymemcached


【解决方案1】:

aspymemcached java 客户端不处理特定节点的 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) {
            }
    }

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我的场景是。服务器 1 和服务器 2 在设置 MemcachedClient 对象时都已启动。现在服务器 1 已关闭。现在如果我们尝试放置 key2/value2,它不是从 Server2 设置/获取值吗?如果 server1 关闭,它不应该使用 server2 吗?如果我们在这里做错了什么,请告诉我...
    • 你自相矛盾。在原始问题中,您使用的是 get/set,现在它看起来像 set/get。请更正您的问题陈述以更准确,然后也许我们可以提供帮助。
    猜你喜欢
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    相关资源
    最近更新 更多