3.3 Redis哨兵

一、哨兵的作用和原理

  1. Redis提供了哨兵(Sentinel)机制来实现主从集群的故障恢复。

    1. 监控:Sentinel会不断检查master和slave是否按期工作

    2. 自动故障恢复:如果master故障,Sentinel会将一个slave提升为master。当故障恢复后,也以新的master为主

    3. 通知:Sentinel充当Redis客户端的本服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端

  2. Sentinel基于心跳机制检测服务状态,每隔1s向集群的每个实例发送ping命令

    1. 主管下线:如果某Sentinel节点发现某实例未在规定时间相应,则认为该实例主观下线

    2. 客观下线:若超过指定数量(quorum)的sentinel都认为该实例主观下线,则该实例客观下线。quorum值最好超过Sentinel实例数量的一半

  3. 一旦发现master故障,sentinel需要在slave中选择一个作为新的master,选择依据如下

    1. 首先会判断slave节点与master节点断开时间长短,如果超过指定值(down-after-milliseconds*10)则会排除该slave节点

    2. 然后判断slave节点的slave-priority值,越小优先级越高,如果是0则永不参与选举

    3. 如果slave-priority一样,则判断slave节点的offset值,越大说明数据越新,优先级越高

    4. 最后判断slave节点的运行id大小,越小优先级越高

  4. 当选中了其中一个slave为新的master后(假如slave1当选),故障转移的步骤如下

    1. sentinel给备选的slave1发送slaveof on one命令,让该节点称为master

    2. sentinel给所有其他slave节点发送slaveof IP地址 端口号命令,让这些slave成为新master的从节点,开始从新的master上同步数据,并修改原master节点的配置文件

    3. 最后,sentinel将故障节点标记为slave,当故障节点恢复后,会自动称为新master的slave节点

二、搭建哨兵集群

  1. 搭建哨兵集群可以参考附录

三、RedisTemplate的哨兵模式

  1. 在Sentinel集群监管下的Redis主从集群,其节点会因为自动故障转移而发生变化,Redis的客户端必须感知这种变化,及时更新链接信息,Spring的RedisTemplate底层利用lettuce实现了节点的感知和自动切换。

  2. 步骤

    1. 引入Redis的starter依赖

              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-data-redis</artifactId>
              </dependency>
    2. 在配置文件中指定redis的sentinel信息

      spring:
        redis:
          sentinel:
            master: mymaster  # 指定master名称-sentinel配置文件中的名称
            nodes: 指定redis-sentinel集群信息
              - ip:端口
              - ip:端口
              - ip:端口
    3. 配置主从读写分离

      @Configuration
      public class RedisConfig {
          
          @Bean
          public LettuceClientConfigurationBuilderCustomizer configurationBuilderCustomizer() {
              return configBuilder -> configBuilder.readFrom(ReadFrom.REPLICA_PREFERRED); // 匿名内部类使用
              // 或者使用如下方式
              // return new LettuceClientConfigurationBuilderCustomizer() {
              //     @Override
              //     public void customize(LettuceClientConfiguration.LettuceClientConfigurationBuilder clientConfigurationBuilder) {
              //         clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
              //     }
              // };
          }
          
      }

      备注:ReadFrom是配置Redis的读写策略,是一个枚举,有如下选择

      MASTER:从主节点读取

      MASTER_PREFERRED:优先从master节点读取,master不可用才读取replica

      REPLICA:从slave(replace)节点读取

      REPLICA_PREFERRED:优先从slave(replace)节点读取,所有slave(replace)不可用才读取master

最后更新于

这有帮助吗?