Redis 哨兵模式

目录

[一、Redis 哨兵介绍](#一、Redis 哨兵介绍)

[1. 概述](#1. 概述)

[2. 实现原理](#2. 实现原理)

[3. 架构](#3. 架构)

[4. 选举领导者哨兵的过程](#4. 选举领导者哨兵的过程)

[5. 故障后恢复过程](#5. 故障后恢复过程)

[6. 实现原理](#6. 实现原理)

二、实验案例环境

三、搭建基础环境

[四、部署 Redis 主从](#四、部署 Redis 主从)

五、部署哨兵节点

[1. 部署哨兵](#1. 部署哨兵)

[2. 修改配置文件](#2. 修改配置文件)

[3. 编写服务脚本](#3. 编写服务脚本)

[4. 查看哨兵状态信息](#4. 查看哨兵状态信息)

[5. 故障转移](#5. 故障转移)

6.查看哨兵epoch


一、Redis 哨兵介绍

1. 概述

Redis 哨兵是 分布式高可用解决方案,用于实现:

  1. 主从自动故障转移(Master-Slave Failover)

  2. 集群监控(节点健康检测)

  3. 配置中心(自动更新客户端连接信息)

2. 实现原理

工作原理三阶段

  1. 监控(Monitoring)

    • 哨兵每秒向主/从节点发送 PING 命令

    • 若节点超时(down-after-milliseconds,默认 30s),标记为 主观下线(SDOWN)

  2. 共识(Agreement)

    • 哨兵集群通过 Gossip 协议 交换节点状态

    • 当多数哨兵(≥ quorum)认为主节点下线,标记为 客观下线(ODOWN)

  3. 故障转移(Failover)

    • 选举 领导者哨兵 执行故障转移

    • 从从节点中选出新主节点(基于优先级、复制偏移量等)

    • 通知客户端和从节点更新配置

3. 架构

哨兵最基础架构由哨兵节点和数据节点。其中哨兵节点是特殊的Redis节点,不存储数据,只为监控;哨兵架构要由多个哨兵节点共同提供服务;数据节点用于存储Redis数据,包括主、从节点。

关键规则

  • 哨兵节点数 ≥ 3(推荐奇数台,避免脑裂)

  • 故障转移决策需满足:同意数 > 哨兵总数/2

4. 选举领导者哨兵的过程

基于 Raft 协议的选举流程

选举细节

  1. 发现主节点 ODOWN 的哨兵发起选举

  2. 每个哨兵在每个 配置纪元(epoch) 仅投一票

  3. 最先获得 多数票(≥ N/2 + 1) 的哨兵当选

  4. 选举超时(默认 100ms)后重新发起

5. 故障后恢复过程

步骤拆解

  1. 筛选候选节点

    • 排除已下线节点

    • 排除 replica-priority=0 的节点

    • 选择优先级最高 → 复制偏移量最大 → Run ID 最小的节点

  2. 提升新主节点

    复制代码
    # 领导者哨兵执行
     SLAVEOF NO ONE # 提升为独立节点
  3. 重配置从节

    SLAVEOF new_master_ip port # 指向新主节点

  4. 通知客户端

    • 通过 __sentinel__:hello 频道发布新主节点信息

    • 客户端监听频道自动更新连接

  5. 旧主节点处理

    • 恢复后自动转换为从节点

    • 同步新主数据

6. 实现原理

哨兵节点的配置文件需添加

复制代码
sentinel monitor master-name IP port quorum
#需指定要监控的masterIP地址和端口
quorum用来表示执行故障恢复操作之前至少需要几个哨兵节点同意

建立连接后,哨兵会定时执行任务(贯穿整个生命周期):

  • 每10秒哨兵会向主节点和从节点发送info命令
  • 每2秒哨兵会向主节点和从节点发送自己的信息
  • 每1秒哨兵会向主节点、从节点和其他哨兵发生ping命令

二、实验案例环境

|--------------|------|----------------|-------------|----|
| 操作系统 | 配置 | IP | 主机名 | 角色 |
| Open Euler24 | 2C4C | 192.168.10.101 | master | 主 |
| Open Euler24 | 2C4C | 192.168.10.102 | slave1 | 从 |
| Open Euler24 | 2C4C | 192.168.10.103 | slave2 | 从 |
| Open Euler24 | 2C4C | 192.168.10.104 | sentione101 | 哨兵 |
| Open Euler24 | 2C4C | 192.168.10.105 | sentione102 | 哨兵 |
| Open Euler24 | 2C4C | 192.168.10.106 | sentione103 | 哨兵 |

三、搭建基础环境

复制代码
systemctl stop firewalld
setenforce 0
systemctl disable firewalld
vim /etc/selinux/config 
SELINUX=disabled

hostnamectl set-hostname 主机名(master/salve)

四、部署 Redis 主从

bash 复制代码
--部署redis
dnf -y install gcc
tar zxvf redis
cd redis
make
make PREFIX=/usr/local/redis install

--软链接环境变量
ln -s /usr/local/redis/bin/* /usr/local/bin/

--适用默认配置文件
mkdir /etc/redis
cp /root/redis/redis.conf /etc/redis/6379.conf

--编写服务脚本
vim /etc/systemd/system/redis.service
[Unit]
Description=redis
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /etc/redis/6379.conf


[Install]
WantedBy=multi-user.target

--修改主从配置文件
vim /etc/redis/6379.conf
bind 127.0.0.1 192.168.10.101  //这个监听三台不一致,为本机的IP
daemonize yes
logfile "/var/log/redis_6379.log"

--启动服务
systemctl daemon-reload
systemctl start redis
systemctl enable redis
--查看监听
netstat -anpt | grep 6379

从配置
从节点
vim /etc/redis/6379.conf
replicaof 192.168.10.101 6379  //指定主

--重启
systemctl restart redis
netstat -anpt |grep redis

--验证主从
redis-cli
info replication

五、部署哨兵节点

1. 部署哨兵

bash 复制代码
systemctl stop firewalld
setenforce 0
systemctl disable firewalld
dnf -y install gcc
tar zxvf redis-6.2.4
cd redis-6.2.4

make
make PREFIX=/usr/local/redis install

mkdir /etc/redis
cp redis.conf /etc/redis/6379.conf


ln -s /usr/local/redis/bin/* /usr/local/bin/

2. 修改配置文件

bash 复制代码
vim /etc/redis/6379.conf 
bind 0.0.0.0
daemonize yes  //75行
sentinel monitor master 192.168.10.101 6379 2  //添加出来,监测master,当主节点故障,至少需要2个哨兵节点同意,才能判断主故障(客观故障)

3. 编写服务脚本

bash 复制代码
cd /lib/systemd/system
vim redis.service

[Unit]
Description=redis
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-sentinel /etc/redis/6379.conf

[Install]
WantedBy=multi-user.target

-启动
systemctl daemon-reload
systemctl start redis
systemctl enable redis

-查看进程
netstat -anpt | grep redis

4. 查看哨兵状态信息

bash 复制代码
redis-cli
info sentinel  

5. 故障转移

bash 复制代码
-在主上模拟故障,停止服务
systemctl stop redis
-再查看哨兵状态信息
info sentinel  //master发生变化

6.查看哨兵epoch

bash 复制代码
每进行一次主从切换,epoch相关的参数都会加1
tail /etc/redis/6379.conf
相关推荐
夜斗小神社1 小时前
【黑马点评】(二)缓存
缓存
GJCTYU1 小时前
spring中@Transactional注解和事务的实战理解附代码
数据库·spring boot·后端·spring·oracle·mybatis
MicroTech20251 小时前
微算法科技(NASDAQ: MLGO)探索Grover量子搜索算法,利用量子叠加和干涉原理,实现在无序数据库中快速定位目标信息的效果。
数据库·科技·算法
Code季风1 小时前
SQL关键字快速入门:CASE 实现条件逻辑
javascript·数据库·sql
weixin_478689761 小时前
操作系统【2】【内存管理】【虚拟内存】【参考小林code】
数据库·nosql
九皇叔叔2 小时前
【7】PostgreSQL 事务
数据库·postgresql
kk在加油2 小时前
Mysql锁机制与优化实践以及MVCC底层原理剖析
数据库·sql·mysql
Kookoos3 小时前
ABP VNext + Cosmos DB Change Feed:搭建实时数据变更流服务
数据库·分布式·后端·abp vnext·azure cosmos
hello 早上好3 小时前
MsSql 其他(2)
数据库·mysql
高压锅_12203 小时前
SQLAlchemy数据库连接密码特殊字符处理完全指南
数据库·mysql·django·sqlalchemy