Redis 哨兵-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

​编辑

一、哨兵原理

1、集群结构和作用

2、集群监控原理

3、集群故障恢复原理

二、搭建哨兵集群

1、集群结构

 2、准备实例和配置

3、启动

三、RedisTemplate 的哨兵模式


一、哨兵原理

1、集群结构和作用

Redis提供了哨兵Sentinel机制来实现主从集群的自动故障恢复。哨兵的结构和作用如下

监控Sentinel 会不断检查您的master和slave是否按预期工作 

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

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


2、集群监控原理

Sentinel基于心跳机制监测服务状态每隔1秒向集群的每个实例发送ping命令

主观下线如果某sentinel节点发现某实例未在规定时间响应则认为该实例主观下线。

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


3、集群故障恢复原理

一旦发现 master 故障sentinel 需要在 slave 中选择一个作为新的 master那么如何判断选择哪一个 slave 作为新的 master 呢

首先会判断 slave 节点与 master 节点断开时间长短如果超过指定值down-after-milliseconds * 10

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

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

最后是判断slave节点的运行 id 大小越小优先级越高。

当选中了其中一个 slave 作为新的 master 之后故障转移的步骤是这个样子的

假设此时 7002 被选中作为新的 master

1、sentinel 给备选的 7002 节点发送 slaveof no one 命令让该节点成为 master

2、sentinel 给所有其它 slave 发送 slaveof 192.168.150.101 7002 命令让这些 slave 成为新 master的从节点开始从新的 master上同步数据。

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


二、搭建哨兵集群

1、集群结构

 三个 sentinel 的实例信息如下

 2、准备实例和配置

先在 tmp 目录下创建好三个文件夹分别叫 s1 s2 s3

然后我们在 s1 目录中新建一个 sentinel.conf 文件添加下面内容

port 27001
sentinel announce-ip 111.229.153.16
sentinel monitor mymaster 111.229.153.16 7001 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
dir "/tmp/s1"

配置文件的理解

port 27001 当前 sentinel 的端口
sentinel monitor mymaster 111.229.153.16 7001 2 指定主节点信息
mymaster主节点名称
111.229.153.16 7001 主节点的 ip 和端口
2  选举 master 时的 quorum 值

然后将 s1/sentinel.conf 文件拷贝到 s2、s3 两个目录中

cp s1/sentinel.conf s2
cp s1/sentinel.conf s3

修改 s2、s3 两个文件夹内的配置文件将端口分别修改为 27002、27003

sed -i -e 's/27001/27002/g' -e 's/s1/s2/g' s2/sentinel.conf
sed -i -e 's/27001/27003/g' -e 's/s1/s3/g' s3/sentinel.conf

3、启动

启动 redis 实例

./redis-sentinel /usr/tmp/s1/sentinel.conf
./redis-sentinel /usr/tmp/s2/sentinel.conf
./redis-sentinel /usr/tmp/s3/sentinel.conf


三、RedisTemplate 的哨兵模式

在 Sentinel 集群监管下的 Redis 主从集群其节点会因为自动故障转移而发生变化Redis 的客户端必须感知这种变化及时更新连接信息。

Spring 的 RedisTemplate 底层利用 lettuce 实现了节点的感知和自动切换。

1、引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、在配置文件 application.yml 中指定 sentinel 相关信息

spring:
  redis:
    sentinel:
      master: mymaster
      nodes:
        - 111.229.153.16:27001
        - 111.229.153.16:27002
        - 111.229.153.16:27003

3、配置读写分离

在项目的启动类中添加一个新的bean

@Bean
public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){
    return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
}

 这里的 ReadFrom 是配置 Redis 的读取策略是一个枚举包括下面选择

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: redis