1 //1.设置sentinel 各个节点集合
 2 Set<String> sentinelSet = new HashSet<>();
 3 sentinelSet.add("192.168.14.101:26379");
 4 sentinelSet.add("192.168.14.102:26380");
 5 sentinelSet.add("192.168.14.103:26381");
 6  
 7 //2.设置jedispool 连接池配置文件
 8 JedisPoolConfig config = new JedisPoolConfig();
 9 config.setMaxTotal(10);
10 config.setMaxWaitMillis(1000);
11  
12 //3.设置mastername,sentinelNode集合,配置文件,Redis登录密码
13 JedisSentinelPool jedisSentinelPool = new JedisSentinelPool("mymaster",sentinelSet,config,"123");
14 Jedis jedis = null;
15 try {
16     jedis = jedisSentinelPool.getResource();
17     //获取Redis中key=hello的值
18     String value = jedis.get("hello");
19     System.out.println(value);
20 } catch (Exception e) {
21     e.printStackTrace();
22 } finally {
23     if(jedis != null){
24         jedis.close();
25     }
26 }

java连接redis哨兵集群 java redis 哨兵_Redis

 

②、连接步骤 

  一.客户端遍历所有的 Sentinel 节点集合,获取一个可用的 Sentinel 节点.

  二.客户端向可用的 Sentinel 节点发送 get-master-addr-by-name 命令,获取Redis Master 节点.

  三.客户端向Redis Master节点发送role或role replication 命令,来确定其是否是Master节点,并且能够获取其 slave节点信息.

  四.客户端获取到确定的节点信息后,便可以向Redis发送命令来进行后续操作了

  需要注意的是:客户端是和Sentinel来进行交互的,通过Sentinel来获取真正的Redis节点信息,然后来操作.实际工作时,Sentinel 内部维护了一个主题队列,

        用来保存Redis的节点信息,并实时更新,

        客户端订阅了这个主题,然后实时的去获取这个队列的Redis节点信息

哨兵模式工作原理

  ①、三个定时任务

  一.每10秒每个 sentinel 对master 和 slave 执行info 命令:该命令第一个是用来发现slave节点,第二个是确定主从关系.

  二.每2秒每个 sentinel 通过 master 节点的 channel(名称为_sentinel_:hello) 交换信息(pub/sub):用来交互对节点的看法(后面会介绍的节点主观下线和客观下线)以及自身信息.

  三.每1秒每个 sentinel 对其他 sentinel 和 redis 执行 ping 命令,用于心跳检测,作为节点存活的判断依据.

  ②、主观下线和客观下线

  一.主观下线

  SDOWN:subjectively down,直接翻译的为”主观”失效,即当前sentinel实例认为某个redis服务为”不可用”状态.

  二.客观下线

  ODOWN:objectively down,直接翻译为”客观”失效,即多个sentinel实例都认为master处于”SDOWN”状态,那么此时master将处于ODOWN,ODOWN可以简单理解为master已经被集群确定为”不可用”,将会开启故障转移机制.

  结合我们第4点搭建主从模式,验证主从切换时,kill掉Redis主节点,然后查看 sentinel 日志,如下:

  

java连接redis哨兵集群 java redis 哨兵_Redis_02

  发现有类似 sdown 和 odown 的日志.在结合我们配置 sentinel 时的配置文件来看:

1

2


#监控的IP 端口号 名称 sentinel通过投票后认为mater宕机的数量,此处为至少2

sentinel monitor mymaster 192.168.14.101 6379 2


  最后的 2 表示投票数,也就是说当一台 sentinel 发现一个 Redis 服务无法 ping 通时,就标记为 主观下线 sdown;同时另外的 sentinel 服务也发现该 Redis 服务宕机,也标记为 主观下线,当多台 sentinel (大于等于2,上面配置的最后一个)时,都标记该Redis服务宕机,这时候就变为客观下线了,然后进行故障转移.

  ③、故障转移

  故障转移是由 sentinel 领导者节点来完成的(只需要一个sentinel节点),关于 sentinel 领导者节点的选取也是每个 sentinel 向其他 sentinel 节点发送我要成为领导者的命令,超过半数sentinel 节点同意,并且也大于quorum ,那么他将成为领导者,如果有多个sentinel都成为了领导者,则会过段时间在进行选举.

  sentinel 领导者节点选举出来后,会通过如下几步进行故障转移:

  一.从 slave 节点中选出一个合适的 节点作为新的master节点.这里的合适包括如下几点:

    1.选择 slave-priority(slave节点优先级)最高的slave节点,如果存在则返回,不存在则继续下一步判断.

    2.选择复制偏移量最大的 slave 节点(复制的最完整),如果存在则返回,不存在则继续.

    3.选择runId最小的slave节点(启动最早的节点)

  二.对上面选出来的 slave 节点执行 slaveof no one 命令让其成为新的 master 节点.

  三.向剩余的 slave 节点发送命令,让他们成为新master 节点的 slave 节点,复制规则和前面设置的 parallel-syncs 参数有关.

  四.更新原来master 节点配置为 slave 节点,并保持对其进行关注,一旦这个节点重新恢复正常后,会命令它去复制新的master节点信息.(注意:原来的master节点恢复后是作为slave的角色)

  可以从 sentinel 日志中出现的几个消息来进行查看故障转移:

  1.+switch-master:表示切换主节点(从节点晋升为主节点)

  2.+sdown:主观下线

  3.+odown:客观下线

  4.+convert-to-slave:切换从节点(原主节点降为从节点)