联动帖:http://blog.itpub.net/29510932/viewspace-1788524/
这是一篇很简短的博文
----------------------------------------------------------- ----- -------- --------- --------- -------正文 ------ ---------- ---------- ------- ------- ---------- ---------- ---------- ------- ---------- ---------- --------
目的:联动帖已经搭建好了cluster的环境,写一个cluster的测试示例来简单验证一下cluster的功能
结果:等待详细评估以后,再考虑在简单的业务上进行生产使用
过程:
使用jedis-2.7.3和commons-pool2,尽量使用最新版
代码
红色字体标出了与普通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挂掉了,对应的s lave会变成新的Master处理request,但是如果这个Master对应的所有的slave都挂了的话,这一组分片保存的数据在这些Node恢复之前是不可访问和操作的,所以在初始化redis-cluster的时候,replica的数量需要好好斟酌,MS的分布也需要尽量规划好,避免某个分片所有的Node 全部挂掉
-----------------------------------------------------------------------------------------------简短的小尾巴~-------------------------------------------------------------------------------------------------------
这是一篇很简短的博文
----------------------------------------------------------- ----- -------- --------- --------- -------正文 ------ ---------- ---------- ------- ------- ---------- ---------- ---------- ------- ---------- ---------- --------
目的:联动帖已经搭建好了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挂掉了,对应的s lave会变成新的Master处理request,但是如果这个Master对应的所有的slave都挂了的话,这一组分片保存的数据在这些Node恢复之前是不可访问和操作的,所以在初始化redis-cluster的时候,replica的数量需要好好斟酌,MS的分布也需要尽量规划好,避免某个分片所有的Node 全部挂掉
-----------------------------------------------------------------------------------------------简短的小尾巴~-------------------------------------------------------------------------------------------------------