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
相关推荐
2301_32241428041 小时前
基于SpringBoot+Vue的休闲零食超市管理系统的设计与实现59004-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·redis·mysql·决策树·推荐算法
catoop4 小时前
API Key 设计与安全生成方案:结构拆解、数据库设计与 Java 实现
java·数据库·安全
Web极客码4 小时前
我用 Claude 分析 Redis 哨兵日志,实现跨机房数据不一致自动对齐
数据库·redis·php
库库的数据库笔记4 小时前
国产信创数据库的MySQL兼容性深度对比解析
大数据·数据库·mysql·oceanbase·政务
microrain4 小时前
SagooIoT 的缓存换后端只改一行配置,文件后端连 Redis 都不需要
物联网·缓存·golang·sagooiot
姚远Oracle ACE5 小时前
为什么无法连接到 PostgreSQL?
数据库·postgresql
ss2735 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 22 PostgreSQL实例与集群
数据库·笔记·postgresql
ss2735 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 21 PostgreSQL进程与内存架构介绍
数据库·笔记·postgresql
Henry-SAP6 小时前
SAP PP模块全景概览
数据库