Redis 哨兵

目录

​编辑

一、哨兵原理

1、集群结构和作用

2、集群监控原理

3、集群故障恢复原理

二、搭建哨兵集群

1、集群结构

2、准备实例和配置

3、启动

[三、RedisTemplate 的哨兵模式](#三、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、引入依赖

XML 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

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

XML 复制代码
spring:
  redis:
    sentinel:
      master: mymaster
      nodes:
        - 111.229.153.16:27001
        - 111.229.153.16:27002
        - 111.229.153.16:27003

3、配置读写分离

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

java 复制代码
@Bean
public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){
    return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
}

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

相关推荐
bobz9655 分钟前
ovs patch port 对比 veth pair
后端
Asthenia041215 分钟前
Java受检异常与非受检异常分析
后端
uhakadotcom29 分钟前
快速开始使用 n8n
后端·面试·github
JavaGuide36 分钟前
公司来的新人用字符串存储日期,被组长怒怼了...
后端·mysql
bobz9651 小时前
qemu 网络使用基础
后端
Asthenia04121 小时前
面试攻略:如何应对 Spring 启动流程的层层追问
后端
Asthenia04121 小时前
Spring 启动流程:比喻表达
后端
Asthenia04122 小时前
Spring 启动流程分析-含时序图
后端
ONE_Gua2 小时前
chromium魔改——CDP(Chrome DevTools Protocol)检测01
前端·后端·爬虫
致心2 小时前
记一次debian安装mariadb(带有迁移数据)
后端