平台: 64位windows操作系统,spymemcached-2.7.3.jar,J2EE
我们希望使用两个memcache/membase服务器来缓存解决方案。我们希望为每个memcache/membase服务器分配1GB内存,这样我们总共可以缓存2GB数据。我们正在使用spymemcached java客户端来设置和从memcache获取数据。我们不使用两个membase服务器之间的任何复制。
我们在启动memcacheClient应用程序时加载J2EE对象。
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,它就无法获得/设置值。在server2下降的情况下,不应该使用server1吗?如果我们做错了什么请告诉我..。
发布于 2017-03-22 09:43:24
aspymemcached java客户端dos不处理特定节点的membase故障转移。
Ref: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) {
}
}发布于 2012-01-25 14:05:48
client.get()将使用第一个可用节点,因此您的值将仅存储/更新在一个节点上。
您的要求似乎有点矛盾--首先您是说‘我们希望为每个memcache/membase服务器分配1GB内存,这样我们就可以总共缓存2GB数据’,这意味着分布式缓存模型(特定密钥存储在缓存场中的一个节点上),然后,如果该节点被关闭,那么您希望获取它,这显然不会发生。
如果您需要缓存场以避免节点故障而丢失缓存在该节点上的数据,则应该使用复制,这在MemBase中是可用的,但显然您要付出多次存储相同值的代价,这样就不可能实现“每2GB缓存1GB”的愿望。
https://stackoverflow.com/questions/9003525
复制相似问题