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 的读取策略,是一个枚举,包括下面选择:

相关推荐
一只叫煤球的猫3 小时前
写代码很6,面试秒变菜鸟?不卖课,面试官视角走心探讨
前端·后端·面试
bobz9653 小时前
tcp/ip 中的多路复用
后端
bobz9654 小时前
tls ingress 简单记录
后端
皮皮林5515 小时前
IDEA 源码阅读利器,你居然还不会?
java·intellij idea
你的人类朋友5 小时前
什么是OpenSSL
后端·安全·程序员
bobz9655 小时前
mcp 直接操作浏览器
后端
前端小张同学7 小时前
服务器部署 gitlab 占用空间太大怎么办,优化思路。
后端
databook7 小时前
Manim实现闪光轨迹特效
后端·python·动效
武子康8 小时前
大数据-98 Spark 从 DStream 到 Structured Streaming:Spark 实时计算的演进
大数据·后端·spark
该用户已不存在8 小时前
6个值得收藏的.NET ORM 框架
前端·后端·.net