当前位置: 首页 > 工具软件 > Spymemcached > 使用案例 >

spymemcached客户端 出现节点宕机不能正常写入读出的错误

厍光霁
2023-12-01


  spymemcached 是内存数据库memcached的的开源客户端软件,比较流行。 spymemcached 支持集群操作,但是 由于其内部机制的设计缺陷性,导致其 集群过程中 会出现一些预想之外的情况。

  spymemcached 中locator.getSequence(key)最多会提供7个备选虚拟节点。根据作者的提示知道,当集群中的某一个节点宕机之后,spymemcached不会选择其他可用机器,而是选择直接失败,当当前节点宕机之后 spymemcached会有限的选择 另一个节点,但是根据作者的提示,当前节点失败后,会有 128 分之一的 几率会选择 宕机的节点。

我们需要修改源码。
  请尊重知识,请尊重原创 更多资料参考请见  http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1

作者的源码

 public Iterator<MemcachedNode> getSequence(String k) {
    // Seven searches gives us a 1 in 2^7 chance of hitting the
    // same dead node all of the time.
    return new KetamaIterator(k, 7, getKetamaNodes(), hashAlg);
  }*



修改之后的代码

 public Iterator<MemcachedNode> getSequence(String k) {  
	  // return new KetamaIterator(k, 7, getKetamaNodes(), hashAlg);  
	  int maxTry = config.getNodeRepetitions() + 1;    
	  if (maxTry < 20) {
			maxTry = 20;  
	  }  
	  return new KetamaIterator(k, maxTry, getKetamaNodes(), hashAlg);
	  }



其 get set delete 可能会存在由于 网络等原因造成的 操作失败。

可以适当修改其执行 方式来实现操作

 @Override
  public OperationFuture<Boolean> set(String key, int exp, Object o) {
	   OperationFuture<Boolean> result = null;
	   Object obj =  null;
	   int count = 50;
	   while(obj == null && count >0 ){
		   result = asyncStore(StoreType.set, key, exp, o, transcoder);
		   obj = get(key);
		   count --;
	   }
    return result;
  }




 @Override
  public OperationFuture<Boolean> delete(String key) {
	  OperationFuture<Boolean> result = null;
	   Object obj =  key;
	   int count = 50;
	   while(obj != null && count > 0){
		   result = delete(key, 0L);
		   obj = get(key);
		   count --;
	   }
   return result;
  }



相对于源码来说 加入了简单的重试机制。

可根据自身实际情况选择使用与否。

本文部分资料参考 http://www.udpwork.com/item/14792.html

 

 类似资料: