联动帖:http://blog.itpub.net/29510932/viewspace-1788524/
这是一篇很简短的博文
-----------------------------------------------------------
--------------------------------------正文---------------------------------------------------------------------------------------------------------
目的:联动帖已经搭建好了cluster的环境,写一个cluster的测试示例来简单验证一下cluster的功能
结果:等待详细评估以后,再考虑在简单的业务上进行生产使用
过程:
使用jedis-2.7.3和commons-pool2,尽量使用最新版
代码
-
import java.util.HashSet;
-
import java.util.Set;
-
import redis.clients.jedis.HostAndPort;
-
import redis.clients.jedis.JedisCluster;
-
-
public class jedis
-
{
-
public static void main( String[] args )
-
{
-
Set<HostAndPort> clusterNodes = new HashSet<HostAndPort>();
-
// 这里只需要列出集群中的一个节点
-
// JedisCluster 会自行通过cluster nodes来获取其他的集群节点
-
clusterNodes.add(new HostAndPort("10.16.68.183", 7000));
-
/*
-
clusterNodes.add(new HostAndPort("10.16.68.183", 7001));
-
clusterNodes.add(new HostAndPort("10.16.68.183", 7002));
-
clusterNodes.add(new HostAndPort("10.16.68.183", 7003));
-
clusterNodes.add(new HostAndPort("10.16.68.183", 7004));
-
clusterNodes.add(new HostAndPort("10.16.68.183", 7005));
-
clusterNodes.add(new HostAndPort("10.16.68.183", 7006));
-
clusterNodes.add(new HostAndPort("10.16.68.183", 7007));
-
*/
-
JedisCluster cluster = new JedisCluster(clusterNodes,3000,1000);//cluster节点,超时时间,最大重定向数
-
// set/get试验
-
/*
-
cluster.set("cluster test", "hello jedis cluster!");
-
String value = cluster.get("foo");
-
System.out.println("foo = " + value);
-
*/
-
cluster.incr("counter");
-
System.out.println("counter = " + cluster.get("counter"));
-
cluster.incr("counter");
-
System.out.println("counter = " + cluster.get("counter"));
-
// get cluster nodes
-
System.out.println("------- cluster nodes --------");
-
/*
-
Map<String, JedisPool> nodes = cluster.getClusterNodes();
-
Iterator<Map.Entry<String, JedisPool>> iterNodes = nodes.entrySet().iterator();
-
while (iterNodes.hasNext())
-
{
-
Map.Entry<String, JedisPool> entry = iterNodes.next();
-
Jedis jedis = entry.getValue().getResource();
-
System.out.println("============");
-
System.out.println(entry.getKey() + "\n" + jedis.info());
-
}
-
// 循环结束
-
System.out.println("------- end --------");
-
*/
-
cluster.close();
-
}
-
}
红色字体标出了与普通redis不同的地方,一部分特性也在代码中已注释标明,简单看了一下cluster的函数列表,基本上单点redis的命令都支持了,接下来记录一部分redis-cluster使用过程已经发现的问题
1.创建cluster Node的时候,或者是操作cluster Node的时候,出现如下错误
redis.clients.jedis.exceptions.JedisClusterMaxRedirectionsException: Too many Cluster redirections?
解决办法:
a.在创建cluster的时候,带上超时时间和最大重定向数;
b.检查cluster Node的状态,如果某个cluster node在加入集群的时候,使用的是127.0.0.1:port的形式,那么客户端在连接这个Node,在-MOVE转移request的时候会出现问题,其实是连接超时(但是抛出的异常却是一个坑爹的连接数太多,而且还是个疑问句....),所以集群在配置的时候务必带上详细的IP
2.redis-cluster没有pipeline
无解,因为redis-cluster的数据是垂直切分的,这意味着不同的key按照不同的策略被分配到了不同的Node上,所以pipeline里面的request[A,B,C,D,E,F]经过转发以后,可能[A,B]发往了Node1,[C]在Node2上面处理,[D,E,F]转发到Node3,最终的response无法保证为[A,B,C,E,D,F]的顺序。cluster干脆就不让用pipeline了
3.redis-benchmark目前不能对cluster进行压力测试
所以没办法进行严密的对比测试,如果采用比较小的数据量,可以跑跑试试看效果,但是结论必定是不严谨的,仅仅看看就好,所以不贴测试结果了,
从原理来看,在轻负载和中等负载下,使用cluster会少量的增加延迟,但是会有更高的operation/s的上限
4.redis-cluster会丢失分片的数据
联动帖里面阐述过redis-cluster丢失数据的一种可能性,在这里要写的就是redis-cluster有可能会丢失整个分片的数据的一种情况,一般来说,如果某个Master挂掉了,对应的slave会变成新的Master处理request,但是如果这个Master对应的所有的slave都挂了的话,这一组分片保存的数据在这些Node恢复之前是不可访问和操作的,所以在初始化redis-cluster的时候,replica的数量需要好好斟酌,MS的分布也需要尽量规划好,避免某个分片所有的Node全部挂掉
-----------------------------------------------------------------------------------------------简短的小尾巴~-------------------------------------------------------------------------------------------------------
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29510932/viewspace-1798069/
,如需转载,请注明出处,否则将追究法律责任。