本文介绍当某个Redis节点的Master节点发生问题,发生主从切换时,Jedis怎样自动重连新的Master节点
一、步骤如下:
1、配置三组主从结构的redis集群,参考
2、设置哨兵(某个master节点):哨兵的作用主要是监控master节点的状态,当master节点挂掉时通过选举机制选出一个slave节点成为一个新的master,哨兵的使用可参考
sentinel.conf配置说明,下面的mymaster很重要,表示是master节点的名称,jedis指定master使用该名称,而不是IP+端口
sentinel monitor mymaster 127.0.0.1 6379 1
3、使用ShardedJedisSentinelPool连接池
a) 该类是一个开源项目,地址为:https://github.com/warmbreeze/sharded-jedis-sentinel-pool
b) ShardedJedisSentinelPool通过MasterListener线程(有几个哨兵就有几个线程)监控哨兵的状态,如果对应的master节点发生问题,如主从切换,则通过redis的pub/sub该监听器线程
c) MasterListener的run方法调用initPool重置连接池,即连接新的master机器
d) 调用pool.getResource()前发生主从切换,当次redis操作使用新的master机器
e) 调用pool.getResource()后发生主从切换,当次redis操作无效并抛出SocketException,下次redis恢复正常
二、示例代码:由于机器有限,只配置了一台机器,多台原理一样
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public class ShardedSentinelTest { public static void main(String[] args) { GenericObjectPoolConfig config = new GenericObjectPoolConfig(); List<String> masters = new ArrayList<String>(); masters.add( "mymaster" ); Set<String> sentinels = new HashSet<String>(); sentinels.add( "xxxxxx:29111" ); ShardedJedisSentinelPool pool = new ShardedJedisSentinelPool(masters, sentinels, config, 60000 ); ShardedJedis jedis = pool.getResource(); for ( int i = 1 ; i < 10000 ; i++) { String val = jedis.set( "ss" + i, "vv" + i); System.out.println(jedis.get( "ss" + i)); } jedis.close(); pool.destroy(); } } |
三、参考文档
- http://www.tuicool.com/articles/naeEJbv 基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案
- http://blog.csdn.net/dc_726/article/details/48084373 Jedis分片Sentinel连接池实验