首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spymemcache- Memcache/Membase Faileover

Spymemcache- Memcache/Membase Faileover
EN

Stack Overflow用户
提问于 2012-01-25 13:30:10
回答 2查看 946关注 0票数 2

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

我们希望使用两个memcache/membase服务器来缓存解决方案。我们希望为每个memcache/membase服务器分配1GB内存,这样我们总共可以缓存2GB数据。我们正在使用spymemcached java客户端来设置和从memcache获取数据。我们不使用两个membase服务器之间的任何复制。

我们在启动memcacheClient应用程序时加载J2EE对象。

代码语言:javascript
复制
    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服务器中的值。

代码语言:javascript
复制
Object obj = client.get("spoon");
client.set("spoon", 50, "Hello World!");

看起来,memcacheClient正在设置、获取并仅从server1中获得值。

如果我们停止server1,它就无法获得/设置值。在server2下降的情况下,不应该使用server1吗?如果我们做错了什么请告诉我..。

EN

回答 2

Stack Overflow用户

发布于 2017-03-22 09:43:24

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

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

我们可以通过使用ConnectionObserver来做到这一点--这里是我的代码:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-01-25 14:05:48

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

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

如果您需要缓存场以避免节点故障而丢失缓存在该节点上的数据,则应该使用复制,这在MemBase中是可用的,但显然您要付出多次存储相同值的代价,这样就不可能实现“每2GB缓存1GB”的愿望。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9003525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档