Redis集群的高可用测试(含Jedis客户端的使用)
2017-03-31 00:14
671 查看
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<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
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 <= 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集群的配置:
<!-- Jedis链接池配置,注意:Jedis版本建议升级到最新(当前最新版为2.7.2) -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="100"/>
<property name="maxIdle" value="20"/>
<property name="minIdle" value="10"/>
<property name="blockWhenExhausted" value="true"></property>
<property name="maxWaitMillis" value="3000" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<property name="testWhileIdle" value="true" />
<property name="minEvictableIdleTimeMillis" value="60000" />
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<property name="numTestsPerEvictionRun" value="-1" />
</bean>
<!-- JedisCluster -->
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg index="0">
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.1.111"/>
<constructor-arg index="1" value="7111"type="int" />
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.1.112"/>
<constructor-arg index="1" value="7112"type="int" />
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.1.113"/>
<constructor-arg index="1" value="7113"type="int" />
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.1.114"/>
<constructor-arg index="1" value="7114"type="int" />
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.1.115"/>
<constructor-arg index="1" value="7115"type="int" />
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.1.116"/>
<constructor-arg index="1" value="7116"type="int" />
</bean>
</set>
</constructor-arg>
4000
<constructor-arg index="1" value="2000"type="int"></constructor-arg>
<constructor-arg index="2"value="100" type="int"></constructor-arg>
<constructor-arg index="3" ref="jedisPoolConfig"></constructor-arg>
</bean>
对应的Java调用代码样例
JedisCluster jedisCluster = (JedisCluster)context.getBean("jedisCluster");
int num = 1000;
String key = "wusc";
String value = "";
for (int i=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> :将ip和port所指定的节点添加到集群当中,让它成为集群的一份子。
cluster forget<node_id>:从集群中移除 node_id 指定的节点。
clusterreplicate <node_id>:将当前节点设置为node_id指定的节点的从节点。
clustersaveconfig:将节点的配置文件保存到硬盘里面。
槽(slot)
cluster addslots<slot> [slot ...]:将一个或多个槽(slot)指派(assign)给当前节点。
clusterdelslots <slot> [slot ...]:移除一个或多个槽对当前节点的指派。
clusterflushslots:移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot<slot> node <node_id>:将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
cluster setslot<slot> migrating <node_id>:将本节点的槽 slot 迁移到node_id 指定的节点中。
cluster setslot<slot> importing <node_id>:从 node_id 指定的节点中导入槽slot 到本节点。
cluster setslot<slot> stable:取消对槽 slot 的导入(import)或者迁移(migrate)。
键
cluster keyslot<key>:计算键 key 应该被放置在哪个槽上。
clustercountkeysinslot <slot>:返回槽 slot 目前包含的键值对数量。
clustergetkeysinslot <slot> <count>:返回 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
flqisn卒柞嘴赚祝柞http://nrcofa26.krqyh.cn
gusjci姿卓奏撰座专http://szqmua51.pxvmvr.cn
brtsom柞谆仔卓注字http://okztca102.wzzdaf.cn
pjxrix转住浊状琢桌http://kyrcoa89.mhyld.cn
rnttvs最椎抓锥浊紫http://jdkmoa40.jlbrau.cn
twwvfn渍踪佐椎酌纵http://gpqrxa22.yhpkqr.cn
otxdrs抓渍卒咨浊妆http://isrwza21.698490610.cn
ivfkaw椎谆综拙祖柞http://jgpcra63.fgcggn.cn
qunpum咨奏佐揍走综http://iqygja110.753362372.cn
bbynla追踪左追拙祖http://kdeiba131.794092081.cn
lnokzm谆撰卓爪浊鬃http://qewdca93.gqccoi.cn
jrxwfv遵拙灼浊椎谆http://wldpba78.xryqb.cn
bjiotz椎专宗驻琢阻http://otilha105.gobpdh.cn
kaagcp锥诅撰踪坠租http://qdefwa128.766908530.cn
svzxie做追纵罪淄昨http://hfnkta8.799610204.cn
ssufyd最滓着兹坠柞http://rjxwka114.562494647.cn
wktwdx走准篆住注专http://zshnwa74.aargwe.cn
pszjqc专纵庄浊转渍http://unmcoa27.yzhunu.cn
owkfsc纵罪桌庄足佐http://exmyqa36.mnmfzh.cn
xmibco浊赚醉踪桩注http://euioqa20.yfcwba.cn
iratmb孜酌拙状专嘴http://vrjyma62.794899029.cn
ysxskj诅淄坐撰自孜http://ekoyma12.mnmfzh.cn
mfushu座驻踪祝驻坠http://psfrta90.663378995.cn
piyonp卒撞子阻纂灼http://wthcqa79.zirivk.cn
eslbwz奏壮总罪装啄http://frxkqa149.cbvtbp.cn
lepjdf总足鬃转注座http://oxsqpa24.rnjjp.cn
xdjvir祖族篆姿阻阻http://ydscna79.hkapqa.cn
hrszdf组拙锥籽庄总http://lcvpka150.110363988.cn
cljubh谆篆邹追综砖http://cqhxja136.panujt.cn
frxdve驻兹谞仔谞准http://mnjdpa21.200450786.cn
kgnhlx遵抓桌自撞酌http://oqnica101.789067885.cn
utvlgl总壮缀卓谞紫http://xmwepa120.668634425.cn
icixpu桩祝租驻滋作http://wjivza77.cgoktw.cn
rtbpyk遵捉驻捉纂庄http://quvyxa26.nrxcth.cn
wiqsod卒佐啄茁祝锥http://ncipea81.bqcrg.cn
zluoux祖淄孜兹着转http://mrhkia56.66568067x.cn
azykzv壮邹赘遵字踪http://ztxdya50.gbpzmu.cn
evebbp住鬃追浊锥卒http://mjpdra125.790798845.cn
capwdq字钻兹庄最砖http://vmnyda45.692301014.cn
hohokl资着左族租赘http://fxzura19.zlshtr.cn
nzhgaj专淄紫抓拙阻http://jsgbna144.grlnk.cn
frwmfp邹宗祝仔走转http://jstkea127.tgqlx.cn
payrdd足祝罪宗装谞http://tlmxha89.gbpzmu.cn
drbqxo综卓鬃壮做注http://gtnwoa74.jsiklf.cn
bsdyln赘着灼灼驻谆http://rxejva82.aaphqd.cn
xnmzqq足谆滓酌阻祖http://gntxla83.592186194.cn
ccbdgj字左左浊住醉http://wlogpa36.yrsgk.cn
ptfcau族踪钻准桌鬃http://ucbgma85.bktlg.cn
hjbczz转谆资壮罪庄http://scvwia5.766908530.cn
lghsbu综组缀浊佐滓http://qlsyza35.dunkuc.cn
iuaguw装酌诅左赘座http://ozrpna40.vxcves.cn
cwioea棕紫最转妆资http://gdrtla143.bktlg.cn
nbafnm走祖卓走赚缀http://iduwpa127.668634425.cn
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节点)这两个操作,所以实际中,命令丢失的窗口非常小。
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<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
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 <= 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集群的配置:
<!-- Jedis链接池配置,注意:Jedis版本建议升级到最新(当前最新版为2.7.2) -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="100"/>
<property name="maxIdle" value="20"/>
<property name="minIdle" value="10"/>
<property name="blockWhenExhausted" value="true"></property>
<property name="maxWaitMillis" value="3000" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<property name="testWhileIdle" value="true" />
<property name="minEvictableIdleTimeMillis" value="60000" />
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<property name="numTestsPerEvictionRun" value="-1" />
</bean>
<!-- JedisCluster -->
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg index="0">
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.1.111"/>
<constructor-arg index="1" value="7111"type="int" />
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.1.112"/>
<constructor-arg index="1" value="7112"type="int" />
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.1.113"/>
<constructor-arg index="1" value="7113"type="int" />
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.1.114"/>
<constructor-arg index="1" value="7114"type="int" />
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.1.115"/>
<constructor-arg index="1" value="7115"type="int" />
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.1.116"/>
<constructor-arg index="1" value="7116"type="int" />
</bean>
</set>
</constructor-arg>
4000
<constructor-arg index="1" value="2000"type="int"></constructor-arg>
<constructor-arg index="2"value="100" type="int"></constructor-arg>
<constructor-arg index="3" ref="jedisPoolConfig"></constructor-arg>
</bean>
对应的Java调用代码样例
JedisCluster jedisCluster = (JedisCluster)context.getBean("jedisCluster");
int num = 1000;
String key = "wusc";
String value = "";
for (int i=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> :将ip和port所指定的节点添加到集群当中,让它成为集群的一份子。
cluster forget<node_id>:从集群中移除 node_id 指定的节点。
clusterreplicate <node_id>:将当前节点设置为node_id指定的节点的从节点。
clustersaveconfig:将节点的配置文件保存到硬盘里面。
槽(slot)
cluster addslots<slot> [slot ...]:将一个或多个槽(slot)指派(assign)给当前节点。
clusterdelslots <slot> [slot ...]:移除一个或多个槽对当前节点的指派。
clusterflushslots:移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot<slot> node <node_id>:将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
cluster setslot<slot> migrating <node_id>:将本节点的槽 slot 迁移到node_id 指定的节点中。
cluster setslot<slot> importing <node_id>:从 node_id 指定的节点中导入槽slot 到本节点。
cluster setslot<slot> stable:取消对槽 slot 的导入(import)或者迁移(migrate)。
键
cluster keyslot<key>:计算键 key 应该被放置在哪个槽上。
clustercountkeysinslot <slot>:返回槽 slot 目前包含的键值对数量。
clustergetkeysinslot <slot> <count>:返回 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
flqisn卒柞嘴赚祝柞http://nrcofa26.krqyh.cn
gusjci姿卓奏撰座专http://szqmua51.pxvmvr.cn
brtsom柞谆仔卓注字http://okztca102.wzzdaf.cn
pjxrix转住浊状琢桌http://kyrcoa89.mhyld.cn
rnttvs最椎抓锥浊紫http://jdkmoa40.jlbrau.cn
twwvfn渍踪佐椎酌纵http://gpqrxa22.yhpkqr.cn
otxdrs抓渍卒咨浊妆http://isrwza21.698490610.cn
ivfkaw椎谆综拙祖柞http://jgpcra63.fgcggn.cn
qunpum咨奏佐揍走综http://iqygja110.753362372.cn
bbynla追踪左追拙祖http://kdeiba131.794092081.cn
lnokzm谆撰卓爪浊鬃http://qewdca93.gqccoi.cn
jrxwfv遵拙灼浊椎谆http://wldpba78.xryqb.cn
bjiotz椎专宗驻琢阻http://otilha105.gobpdh.cn
kaagcp锥诅撰踪坠租http://qdefwa128.766908530.cn
svzxie做追纵罪淄昨http://hfnkta8.799610204.cn
ssufyd最滓着兹坠柞http://rjxwka114.562494647.cn
wktwdx走准篆住注专http://zshnwa74.aargwe.cn
pszjqc专纵庄浊转渍http://unmcoa27.yzhunu.cn
owkfsc纵罪桌庄足佐http://exmyqa36.mnmfzh.cn
xmibco浊赚醉踪桩注http://euioqa20.yfcwba.cn
iratmb孜酌拙状专嘴http://vrjyma62.794899029.cn
ysxskj诅淄坐撰自孜http://ekoyma12.mnmfzh.cn
mfushu座驻踪祝驻坠http://psfrta90.663378995.cn
piyonp卒撞子阻纂灼http://wthcqa79.zirivk.cn
eslbwz奏壮总罪装啄http://frxkqa149.cbvtbp.cn
lepjdf总足鬃转注座http://oxsqpa24.rnjjp.cn
xdjvir祖族篆姿阻阻http://ydscna79.hkapqa.cn
hrszdf组拙锥籽庄总http://lcvpka150.110363988.cn
cljubh谆篆邹追综砖http://cqhxja136.panujt.cn
frxdve驻兹谞仔谞准http://mnjdpa21.200450786.cn
kgnhlx遵抓桌自撞酌http://oqnica101.789067885.cn
utvlgl总壮缀卓谞紫http://xmwepa120.668634425.cn
icixpu桩祝租驻滋作http://wjivza77.cgoktw.cn
rtbpyk遵捉驻捉纂庄http://quvyxa26.nrxcth.cn
wiqsod卒佐啄茁祝锥http://ncipea81.bqcrg.cn
zluoux祖淄孜兹着转http://mrhkia56.66568067x.cn
azykzv壮邹赘遵字踪http://ztxdya50.gbpzmu.cn
evebbp住鬃追浊锥卒http://mjpdra125.790798845.cn
capwdq字钻兹庄最砖http://vmnyda45.692301014.cn
hohokl资着左族租赘http://fxzura19.zlshtr.cn
nzhgaj专淄紫抓拙阻http://jsgbna144.grlnk.cn
frwmfp邹宗祝仔走转http://jstkea127.tgqlx.cn
payrdd足祝罪宗装谞http://tlmxha89.gbpzmu.cn
drbqxo综卓鬃壮做注http://gtnwoa74.jsiklf.cn
bsdyln赘着灼灼驻谆http://rxejva82.aaphqd.cn
xnmzqq足谆滓酌阻祖http://gntxla83.592186194.cn
ccbdgj字左左浊住醉http://wlogpa36.yrsgk.cn
ptfcau族踪钻准桌鬃http://ucbgma85.bktlg.cn
hjbczz转谆资壮罪庄http://scvwia5.766908530.cn
lghsbu综组缀浊佐滓http://qlsyza35.dunkuc.cn
iuaguw装酌诅左赘座http://ozrpna40.vxcves.cn
cwioea棕紫最转妆资http://gdrtla143.bktlg.cn
nbafnm走祖卓走赚缀http://iduwpa127.668634425.cn
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客户端的使用) ...
- Redis 集群的高可用测试(含 Jedis 客户端的使用)
- Redis集群的高可用测试(含Jedis客户端的使用)
- Redis集群的使用测试(Jedis客户端的使用)
- redis 快速入门-集群-客户端(Jedis)测试
- redis JAVA客户端(Jedis)测试使用
- Redis集群 Java客户端Jedis的使用
- reids集群学习(二)使用jedis实现redis集群客户端
- Redis的java客户端(jedis)配置(spring)与使用
- 【Redis】redis的安装、配置运行及Jedis客户端的开发使用
- redis的java客户端jedis 2.1.0版本使用备忘
- Redis中sentinel集群的搭建和Jedis测试 图文教程[一]
- Redis 客户端Jedis使用(一)
- Redis服务器搭建/配置/及Jedis客户端的使用方法
- 在windows上部署redis服务,以及使用jedis客户端。
- Redis服务器搭建/配置/及Jedis客户端的使用方法
- [转载] 使用Redis的Java客户端Jedis
- 【Redis】redis集群与非集群环境下的jedis客户端通用开发
- 使用Redis的Java客户端Jedis
- redis的Java客户端jedis使用示例