前言:
在分布式系统架构中,数据的高可用性、读写性能与运维效率是保障业务稳定运行的核心诉求,而Redis作为高性能的键值对数据库,被广泛应用于缓存、会话存储、实时数据处理等场景,其服务的连续性与可靠性直接影响整个业务链路的正常运转。为解决Redis单点部署存在的单点故障、读写压力瓶颈、数据丢失风险等问题,一主二从三哨兵架构应运而生,成为Redis集群部署中最经典、最成熟且应用最广泛的高可用解决方案。
一、环境说明
1. MySQL 主从怎么搭建
这一步要明确本次实验的固定环境,确保 IP、端口、角色分配统一不变,就像盖房子先要画图纸,所有部署步骤、配置文件都基于这套环境编写,目的是避免因 IP 混乱、端口冲突、角色不清导致部署失败
MySQL 主:192.168.101.103
MySQL 从:192.168.101.104
搭建步骤:https://blog.mario123.top/archives/zhu-cong-shu-ju-ku-da-jian
2. Redis 集群
并且记住一个重点,哨兵必须奇数台,这是为了防止脑裂;所以生产至少 3 台独立的机器 (Debian 12/Ubuntu)
二、实验操作步骤
步骤一: 安装 Redis
这一步需要在三台机器都安装 Redis,不区分主从,就像装修房子先把材料运到每一间房,后续才能分别配置成主卧、次卧,这样的目的是保证三台机器都具备 Redis 运行能力,为后续主从复制、哨兵监控打下基础
操作命令
# 三台都需要执行
apt update && apt install -y redis-server步骤二:创建数据目录
这一步要为 Redis 和哨兵创建专属目录,并授权 redis 用户,就像给员工分配独立办公桌和柜子,必须有权限才能放东西,Redis 必须有目录才能持久化数据,权限不对会直接启动失败
操作命令
# 三台虚拟机都执行
mkdir -p /var/redis/6379 /var/redis/26379
chown redis:redis /var/redis /var/redis/*这一步是为了:
创建数据、哨兵目录,并授权 Redis 用户。
为什么?
Redis 必须有目录才能存数据
权限不对会启动失败
步骤三: 关闭默认 Redis
关闭系统自带的 Redis 服务,防止和我们自定义配置冲突,就像先关掉旧灯,再装新灯,避免两个光源互相干扰,这样的目的是保证端口、配置、进程唯一,避免启动异常
操作命令
# 三台虚拟机都执行
systemctl stop redis-server
systemctl disable redis-server步骤四:配置 Redis 主节点
主节点是整个集群的写入核心,这一步要生成独立配置文件,设置后台运行、密码、数据目录、允许外部访问等关键项,就像给主卧做基础装修,确定格局、门锁、水电,这样的目的是让主节点正常启动、允许外部连接、支持密码验证
1.复制配置
cp /etc/redis/redis.conf /etc/redis/6379.conf2.写入主节点配置
cat > /etc/redis/6379.conf << EOF
bind 0.0.0.0
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile /var/log/redis_6379.log
dir /var/redis/6379
requirepass 123456
masterauth 123456
protected-mode no
EOF关键说明
daemonize yes:后台运行requirepass:密码protected-mode no:允许外部访问
3.启动主节点
redis-server /etc/redis/6379.conf4.验证
ps -ef | grep redis结果图

步骤五:配置从节点 1和节点2 (步骤一样)
从节点比主节点多一行 replicaof 配置,用来声明自己是谁的从库,就像次卧要明确归属主卧,这一步目的就是建立主从关系,实现数据自动同步,实现读写分离与数据备份
1. 复制配置文件
cp /etc/redis/redis.conf /etc/redis/6379.conf2. 写入从节点配置
cat > /etc/redis/6379.conf << EOF
bind 0.0.0.0
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile /var/log/redis_6379.log
dir /var/redis/6379
requirepass 123456
masterauth 123456
replicaof 192.168.101.105 6379
protected-mode no
EOFreplicaof 192.168.101.105 6379表示:我是主节点的从库。
3. 启动从节点
redis-server /etc/redis/6379.conf4.验证
ps -ef | grep redis结果图:

步骤六:验证主从同步
这一步检查主从关系是否真正建立,确认从节点已连接、数据可同步,就像装修完检查水电是否通、信号是否正常,目的是确保主从复制链路正常,为哨兵高可用做准备
1.在Redis主节点(105)上执行
redis-cli -a 123456 info replication结果图

步骤七:配置哨兵(三台步骤一样)
哨兵是高可用核心,负责监控、故障切换、通知,配置文件指定监控哪个主节点、密码、判定超时时间、投票数,就像小区保安室,24 小时监控,出事自动处理,目的是实现主节点挂掉后自动切换,业务不中断
1. 写入哨兵配置
cat > /etc/redis/26379.conf << EOF
bind 0.0.0.0
port 26379
daemonize yes
pidfile /var/run/redis-sentinel.pid
logfile /var/log/redis-sentinel.log
dir /var/redis/26379
sentinel monitor sentry 192.168.101.105 6379 2
sentinel auth-pass sentry 123456
sentinel down-after-milliseconds sentry 3000
sentinel failover-timeout sentry 5000
protected-mode no
EOF关键说明
daemonize yes:哨兵后台运行sentinel monitor:监控主节点2:2 个哨兵同意才切换(防止误判)
2. 启动哨兵
redis-sentinel /etc/redis/26379.conf3.验证
ps -ef | grep sentinel
结果图

3. 检查哨兵状态
redis-cli -p 26379 info sentinel结果图

3 个哨兵在线 = 集群正常
第八步:测试自动故障切换
手动关掉主节点,观察哨兵是否自动选举新主、切换从节点指向、更新配置,就像模拟主卧停电,保安自动把次卧升为主卧,目的是验证高可用是否真正生效,保证业务无感知恢复
1. 关闭主节点(105)
redis-cli -a 123456 shutdown结果图

2. 查看哨兵自动切换
tail -f /var/log/redis-sentinel.log3.结果图

图片解析:集群当前状态总结
主节点已切换:新主是
192.168.101.108:6379从节点状态:
192.168.101.106:6379:正常同步新主192.168.101.105:6379:原主,现在是从节点,暂时下线
哨兵状态:
成功完成故障转移
配置已持久化,重启后不会丢失状态
主名称依然是
sentry,业务连接不
4.验证当前主节点
redis-cli -p 26379 sentinel get-master-addr-by-name sentry结果图

步骤九:挂掉的节点重新启动
原主节点重启后,会自动变成新主的从节点,不需要手动改配置,就像原来的主卧修好回来,只能当次卧,服从新主卧,目的是验证集群自愈能力,节点恢复后自动加入集群,如关掉的主节点:192.168.101.105 这台机器,我们重启
1.启动 Redis 服务
redis-server /etc/redis/6379.conf2.让它自动变成 从节点
因为现在的主节点变成108那个IP,所以我们要去同步,这一步只需要安静等待一会就行
3.验证节点是否恢复
redis-cli -p 26379 sentinel get-master-addr-by-name sentry结果图

三、业务连接配置
1. MySQL 信息
主节点 IP:
192.168.101.103从节点 IP:
192.168.101.104用户名:root
密码:你自己设置的
数据库名:Demo
2. Redis 哨兵信息
哨兵 1:
192.168.101.105:26379哨兵 2:
192.168.101.106:26379哨兵 3:
192.168.101.108:26379主名称:
sentry密码:
你自己配置的
3. 使用python脚本进行业务配置
创建python脚本:
nano app.py
from redis.sentinel import Sentinel
import pymysql
from pymysql.cursors import DictCursor
SENTINEL_NODES = [
("192.168.101.105", 26379),
("192.168.101.106", 26379),
("192.168.101.108", 26379),
]
MASTER_NAME = "sentry"
REDIS_PASSWORD = "你自己的密码"
MYSQL_MASTER = {
"host": "192.168.101.103",
"user": "root",
"password": "你自己的密码",
"database": "Demo",
"charset": "utf8mb4",
"cursorclass": DictCursor
}
MYSQL_SLAVE = {
"host": "192.168.101.104",
"user": "root",
"password": "你自己的密码",
"database": "Demo",
"charset": "utf8mb4",
"cursorclass": DictCursor
}
def get_redis():
sentinel = Sentinel(
SENTINEL_NODES,
password=REDIS_PASSWORD,
socket_timeout=2
)
master = sentinel.master_for(MASTER_NAME)
slave = sentinel.slave_for(MASTER_NAME)
return master, slave
def get_mysql(is_master=True):
if is_master:
return pymysql.connect(**MYSQL_MASTER)
else:
return pymysql.connect(**MYSQL_SLAVE)
if __name__ == "__main__":
try:
r_master, r_slave = get_redis()
r_master.set("test_key", "hello_redis_sentry")
print("Redis 连接成功:", r_slave.get("test_key"))
mysql_master = get_mysql(is_master=True)
with mysql_master.cursor() as cur:
cur.execute("""
CREATE TABLE IF NOT EXISTS test_table (
id INT PRIMARY KEY AUTO_INCREMENT,
info VARCHAR(100)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
""")
cur.execute("INSERT INTO test_table (info) VALUES ('业务数据测试')")
mysql_master.commit()
print("MySQL 主库写入成功(库名:Demo)")
mysql_slave = get_mysql(is_master=False)
with mysql_slave.cursor() as cur:
cur.execute("SELECT * FROM test_table ORDER BY id DESC LIMIT 1")
print("MySQL 从库读取成功:", cur.fetchone())
print("全部连接成功!业务正常运行!")
except Exception as e:
print("连接失败:", e)3.运行
# 先安装依赖
pip3 install redis pymysql --user
# 运行脚本
python3 app.py总结:
1. Redis 主从
作用
主节点(Master):负责写数据
从节点(Slave):负责读数据 + 备份主节点数据
从节点会实时复制主节点的数据
核心价值
读写分离:减轻主节点压力
数据备份:一台挂了数据还在
高可用基础:没有主从,就没有哨兵
缺点
主节点挂了,不能自动切换,必须手动改主
业务会直接断连,无法自动恢复
2. Redis 哨兵(Sentinel)
作用
监控 + 自动故障转移 + 通知它是 Redis 的自动运维工具,独立进程,不存数据。
三大核心功能
监控:盯着主节点、从节点是否存活
自动故障转移
主节点挂了
哨兵投票选举
自动把一个从节点升为主节点
配置通知:告诉业务新的主节点是谁
为什么必须至少 3 个哨兵?
防止误判
需要半数以上投票才能切换
避免脑裂
哨兵的最终价值
Redis 从 “会挂的服务” → 变成 “高可用服务”主节点挂了 → 自动切换 → 业务无感知(或短暂中断)
3. 业务 Python 程序
业务不直接连 Redis!
业务 → 哨兵 → 真实主节点
流程
业务启动,连接哨兵
哨兵告诉业务:当前主节点是谁
业务直接连接主节点进行写操作
主节点挂了
哨兵自动切换主从
哨兵通知业务新主节点地址
业务自动重连 → 无感知恢复
关键点
业务代码不需要写死主节点 IP
只需要配置 哨兵地址
故障切换 完全自动化
4. 三者关系
主从 = 数据备份与读写分离
哨兵 = 自动切换主节点,保证高可用
业务 = 通过哨兵获取主节点,实现无缝使用
完整运行逻辑
主节点写入数据
从节点同步数据
哨兵监控所有节点
主节点挂了 → 哨兵自动选新主
业务从哨兵获取最新主节点,继续运行