Redis集群的高可用测试(含Jedis客户端的使用)
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 = new JedisPoolConfig();
config.setMaxTotal(100);
config.setMaxIdle(50);
config.setMinIdle(20);
config.setMaxWaitMillis(6 * 1000);
config.setTestOnBorrow(true);
// Redis集群的节点集合
Set jedisClusterNodes = new HashSet();
jedisClusterNodes.add(new HostAndPort("192.168.1.111", 7111));
jedisClusterNodes.add(new HostAndPort("192.168.1.112", 7112));
jedisClusterNodes.add(new HostAndPort("192.168.1.113", 7113));
jedisClusterNodes.add(new HostAndPort("192.168.1.114", 7114));
jedisClusterNodes.add(new HostAndPort("192.168.1.115", 7115));
jedisClusterNodes.add(new HostAndPort("192.168.1.116", 7116));
// 根据节点集创集群链接对象
//JedisCluster jedisCluster = newJedisCluster(jedisClusterNodes);
// 节点,超时时间,最多重定向次数,链接池
JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes, 2000, 100,config);
int num = 1000;
String key = "wusc";
String value = "";
for (int i=1; i
"jedisCluster">"redis.clients.jedis.JedisCluster">
"redis.clients.jedis.HostAndPort">
"redis.clients.jedis.HostAndPort">
"redis.clients.jedis.HostAndPort">
"redis.clients.jedis.HostAndPort">
"redis.clients.jedis.HostAndPort">
"redis.clients.jedis.HostAndPort">
对应的Java调用代码样例
JedisCluster jedisCluster = (JedisCluster)context.getBean("jedisCluster");
int num = 1000;
String key = "wusc";
String value = "";
for (int i=1; i ,然后再进行指派。
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:7111 192.168.1.112:7112 192.168.1.113:7113
2、查看当前集群各节点的状态
# /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节点)这两个操作,所以实际中,命令丢失的窗口非常小。
本文参考:http://www.roncoo.com/course/view/f614343765bc4aac8597c6d8b38f06fd
页:
[1]