美文网首页我爱编程
Redis集群的使用测试(Jedis客户端的使用)

Redis集群的使用测试(Jedis客户端的使用)

作者: 龙果学院 | 来源:发表于2016-12-01 15:40 被阅读1364次

    本文参考:http://www.roncoo.com/course/view/f614343765bc4aac8597c6d8b38f06fd

    Redis集群的使用测试(Jedis客户端的使用)

    1、Jedis客户端建议升级到最新版(当前为2.7.3),这样对3.0.x集群有比较好的支持。

    https://github.com/xetorthio/jedis

    http://mvnrepository.com/artifact/redis.clients/jedis

    2、直接在Java代码中链接Redis集群:

    //数据库链接池配置

    JedisPoolConfig config =newJedisPoolConfig();

    config.setMaxTotal(100);

    config.setMaxIdle(50);

    config.setMinIdle(20);

    config.setMaxWaitMillis(6 * 1000);

    config.setTestOnBorrow(true);

    //Redis集群的节点集合

    Set jedisClusterNodes =newHashSet();

    jedisClusterNodes.add(newHostAndPort("192.168.1.111", 7111));

    jedisClusterNodes.add(newHostAndPort("192.168.1.112", 7112));

    jedisClusterNodes.add(newHostAndPort("192.168.1.113", 7113));

    jedisClusterNodes.add(newHostAndPort("192.168.1.114", 7114));

    jedisClusterNodes.add(newHostAndPort("192.168.1.115", 7115));

    jedisClusterNodes.add(newHostAndPort("192.168.1.116", 7116));

    //根据节点集创集群链接对象

    //JedisCluster jedisCluster = newJedisCluster(jedisClusterNodes);

    //节点,超时时间,最多重定向次数,链接池

    JedisClusterjedisCluster=newJedisCluster(jedisClusterNodes, 2000, 100,config);

    intnum = 1000;

    String key ="wusc";

    String value ="";

    for(inti=1; i <= num; i++){

    //存数据

    jedisCluster.set(key+i,"WuShuicheng"+i);

    //取数据

    value= jedisCluster.get(key+i);

    log.info(key+i +"="+ value);

    //删除数据

    //jedisCluster.del(key+i);

    //value = jedisCluster.get(key+i);

    //log.info(key+i + "=" + value);

    }

    3、Spring配置Jedis链接Redis3.0集群的配置:

    undefinedundefined

    undefinedundefined

    undefinedundefined

    undefinedundefined

    undefinedundefined

    undefinedundefined

    undefinedundefined

    undefinedundefined

    undefinedundefined

    undefinedundefined

    undefinedundefined

    undefinedundefined

    undefinedundefined

    undefinedundefined

    undefinedundefined

    undefinedundefined

    对应的Java调用代码样例

    JedisCluster jedisCluster = (JedisCluster)context.getBean("jedisCluster");

    intnum = 1000;

    String key ="wusc";

    String value ="";

    for(inti=1; i <= num; i++){

    //存数据

    jedisCluster.set(key+i,"WuShuicheng"+i);

    //取数据

    value= jedisCluster.get(key+i);

    log.info(key+i +"="+ value);

    //删除数据

    //jedisCluster.del(key+i);

    }

    Redis集群的高可用性测试

    一、Redis集群特点

    1、集群架构特点:

    (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽;

    (2)节点的fail是通过集群中超过半数的节点检测失效时才生效;

    (3)客户端与redis节点直连,不需要中间proxy层。客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可;

    (4)redis-cluster把所有的物理节点映射到[0-16383]个slot(哈希槽)上,cluster 负责维护

    node<->slot<->value。

    2、集群选举容错:

    (1)节点失效选举过程是集群中所有master参与,如果半数以上master节点与当前被检测master节点通信检测超时(cluster-node-timeout),就认为当前master节点挂掉;

    (2):什么时候整个集群不可用(cluster_state:fail)?

    A:如果集群任意master挂掉,且当前master没有slave。集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完整时进入fail状态。 ps : redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败;

    B:如果集群超过半数以上master挂掉,无论是否有slave集群进入fail状态。ps:当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误。

    二、客户端集群命令

    集群

    cluster info:打印集群的信息

    cluster nodes:列出集群当前已知的所有节点(node),以及这些节点的相关信息。

    节点

    cluster meet :将ip和port所指定的节点添加到集群当中,让它成为集群的一份子。

    cluster forget:从集群中移除 node_id 指定的节点。

    clusterreplicate :将当前节点设置为node_id指定的节点的从节点。

    clustersaveconfig:将节点的配置文件保存到硬盘里面。

    槽(slot)

    cluster addslots [slot ...]:将一个或多个槽(slot)指派(assign)给当前节点。

    clusterdelslots [slot ...]:移除一个或多个槽对当前节点的指派。

    clusterflushslots:移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。

    cluster setslot node :将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。

    cluster setslot migrating :将本节点的槽 slot 迁移到node_id 指定的节点中。

    cluster setslot importing :从 node_id 指定的节点中导入槽slot 到本节点。

    cluster setslot stable:取消对槽 slot 的导入(import)或者迁移(migrate)。

    cluster keyslot:计算键 key 应该被放置在哪个槽上。

    clustercountkeysinslot :返回槽 slot 目前包含的键值对数量。

    clustergetkeysinslot :返回 count 个 slot 槽中的键。

    三、集群高可用测试

    1、重建集群,步骤:

    (1)关闭集群的各节点;

    (2)删除各节点数据目录下的 nodes.conf、appendonly.aof、dump.rdb;

    # rm -rf appendonly.aof| rm -rf dump.rdb | rm -rf nodes.conf

    (3)重新启用所有的节点

    192.168.1.111

    # /usr/local/redis3/bin/redis-server/usr/local/redis3/cluster/7111/redis-7111.conf

    192.168.1.112

    # /usr/local/redis3/bin/redis-server/usr/local/redis3/cluster/7112/redis-7112.conf

    192.168.1.113

    # /usr/local/redis3/bin/redis-server/usr/local/redis3/cluster/7113/redis-7113.conf

    192.168.1.114

    # /usr/local/redis3/bin/redis-server/usr/local/redis3/cluster/7114/redis-7114.conf

    192.168.1.115

    # /usr/local/redis3/bin/redis-server/usr/local/redis3/cluster/7115/redis-7115.conf

    192.168.1.116

    # /usr/local/redis3/bin/redis-server/usr/local/redis3/cluster/7116/redis-7116.conf

    (4)执行集群创建命令(只需要在其中一个节点上执行一次则可)

    # cd/usr/local/src/redis-3.0.3/src/

    # cpredis-trib.rb /usr/local/bin/redis-trib

    # redis-tribcreate --replicas 1192.168.1.114:7114 192.168.1.115:7115 192.168.1.116:7116 192.168.1.111:7111192.168.1.112:7112 192.168.1.113:7113

    2、查看当前集群各节点的状态

    [root@edu-redis-01 7111]# /usr/local/redis3/bin/redis-cli -c -p 7111

    127.0.0.1:7111> cluster nodes

    3、使用demo应用向集群写入1000个键值数据

    使用 /usr/local/redis3/bin/redis-cli-c -p 711X命令登录各节点,使用 keys *查看各节点的所有key

    4、运行demo应用,获取所有的键值数据

    如果有空值则停止

    5、模拟集群节点宕机(实现故障转移)

    (1)Jedis客户端循环操作集群数据(模拟用户持续使用系统)

    (2)查看Redis集群当前状态(用于接下来做节点状态变化对比)

    (3)关闭其中一个master节点(7111)

    (4)观察该master节点和对应的slave节点的状态变化

    节点状态 fail? 表示正在判断是否失败

    节点状态 fail 表示节点失败,对应的slave节点提升为master

    (5)再查看集群状态变化# /usr/local/src/redis-3.0.3/src/redis-trib.rbcheck 192.168.1.116:7116

    由上可见,7114节点替换7111,由slave变成了master

    此时再执行demo应用获取所有的键值数据,依然正常,说明slave替换master成功,集群正常。

    6、恢复fail节点

    (1)启动7111

    # /usr/local/redis3/bin/redis-server/usr/local/redis3/cluster/7111/redis-7111.conf

    (2)查看集群状态

    其中7111变成 7114的slave

    7、观察集群节点切换过程中,对客户端的影响

    JedisCluster链接Redis集群操作时遇到的几个常见异常:

    (1)重定向次数过多

    redis.clients.jedis.exceptions.JedisClusterMaxRedirectionsException:Too many Cluster redirections?

    解决方法: 初始化JedisCluster时,设定JedisCluster的maxRedirections

    //集群各节点集合,超时时间(默认2秒),最多重定向次数(默认5),链接池

    newJedisCluster(jedisClusterNodes, 2000, 100,config);

    (2)集群不可以用

    redis.clients.jedis.exceptions.JedisClusterException:CLUSTERDOWN The cluster is down

    原因:集群节点状态切换过程中会出现临时闪断,客户端重试操作则可。

    (3)链接超时

    redis.clients.jedis.exceptions.JedisConnectionException:java.net.SocketTimeoutException: Read timed out

    解决方法: 初始化JedisCluster时,设定JedisCluster的timeout(默认为两秒);也可以修改源码中的默认时间。

    7、总结:

    优点:

    在master节点下线后,slave节点会自动提升为master节点,保存集群持续提供服务;

    fail节点恢复后,会自动添加到集群中,变成slave节点;

    缺点:

    由于redis的复制使用异步机制,在自动故障转移的过程中,集群可能会丢失写命令。然而 redis 几乎是同时执行(将命令恢复发送给客户端,以及将命令复制到slave节点)这两个操作,所以实际中,命令丢失的窗口非常小。

    相关文章

      网友评论

        本文标题:Redis集群的使用测试(Jedis客户端的使用)

        本文链接:https://www.haomeiwen.com/subject/tuwxmttx.html