引言
Redis 哨兵模式(Sentinel)是实现 Redis 高可用的核心方案,能够自动监控主从节点状态,并在主节点故障时完成自动故障转移。本文基于 Docker 环境,详细讲解如何在两台服务器(IP 分别为172.16.126.21和172.16.126.20)上搭建哨兵模式,包含完整配置、启动命令及常见问题解决,配置可直接复制粘贴使用。
环境准备
- 服务器: 2 台 Linux 服务器(本文以172.16.126.21作为初始主节点,172.16.126.20作为从节点)。
- 软件: Docker(已安装并启动)。
- 端口开放: 确保两台服务器开放6379(Redis 主从通信)和26379(哨兵通信)端口,或临时关闭防火墙(测试环境):
# 临时关闭防火墙(生产环境需按需开放端口)
systemctl stop firewalld
- 目录规划: 两台服务器创建相同的目录结构(用于挂载配置和数据):
# 在两台服务器上分别执行
mkdir -p /home/mydata/redis/data
mkdir -p /home/mydata/redis/conf
mkdir -p /home/mydata/sentinel/conf
一、主节点配置(172.16.126.21)
主节点负责处理写请求,从节点通过主从复制同步数据。以下是主节点的 Redis 配置和启动步骤。
1. 创建主节点 Redis 配置文件
在172.16.126.21服务器上创建redis.conf:
vi /home/mydata/redis/conf/redis.conf
填入以下内容(密码为Foton@2024kdms,可根据需求修改):
# 主节点Redis配置
port 6379
# 访问密码(必填,确保从节点和哨兵同步配置)
requirepass Foton@2024kdms
# 允许所有IP访问(生产环境可限制为从节点IP)
bind 0.0.0.0
# 关闭保护模式(允许跨IP访问)
protected-mode no
# Docker中禁用后台运行(否则容器会退出)
daemonize no
# 开启AOF持久化(增强数据安全性)
appendonly yes
2. 启动主节点 Redis 容器
docker run -p 6379:6379 -p 26379:26379 \--network host \--name redis-master \--restart=always \-v /home/mydata/redis/data:/data \-v /home/mydata/redis/conf/redis.conf:/etc/redis/redis.conf \-d redis redis-server /etc/redis/redis.conf
关键:redis-server后必须指定配置文件路径/etc/redis/redis.conf,否则自定义配置不生效。
二、从节点配置(172.16.126.20)
从节点通过replicaof配置同步主节点数据,以下是从节点的配置和启动步骤。
1. 创建从节点 Redis 配置文件
在172.16.126.20服务器上创建redis.conf:
vi /home/mydata/redis/conf/redis.conf
填入以下内容(需与主节点密码一致):
# 从节点Redis配置
port 6379
# 从节点可省略密码(客户端通常只连接主节点),若保留需与主节点一致
# requirepass Foton@2024kdms
bind 0.0.0.0
protected-mode no
daemonize no
appendonly yes
# 指向主节点IP和端口(核心配置)
replicaof 172.16.126.21 6379
# 主节点的访问密码(必须与主节点requirepass一致)
masterauth "Foton@2024kdms"
2. 修复配置文件权限(避免启动报错)
从节点启动时可能因权限不足无法读取配置文件,需提前授权:
# 为配置文件添加可读权限
chmod 644 /home/mydata/redis/conf/redis.conf
3. 启动从节点 Redis 容器
docker run -p 6379:6379 -p 26379:26379 \--network host \--name redis-slave \--restart=always \-v /home/mydata/redis/data:/data \-v /home/mydata/redis/conf/redis.conf:/etc/redis/redis.conf \-d redis redis-server /etc/redis/redis.conf
三、哨兵配置(主从节点各部署 1 个)
哨兵节点负责监控主从状态,主节点故障时自动将从节点升级为新主节点。两台服务器均需部署哨兵,配置基本一致。
1. 主节点(172.16.126.21)的哨兵配置
创建哨兵配置文件sentinel.conf:
vi /home/mydata/sentinel/conf/sentinel.conf
填入以下内容
# 哨兵端口
port 26379
# Docker中禁用后台运行
daemonize no
# 监控主节点:名称(mymaster)、主节点IP、端口、故障判定阈值(1个哨兵认为故障即可触发转移)
sentinel monitor mymaster 172.16.126.21 6379 1
# 判定主节点主观下线的超时时间(30秒)
sentinel down-after-milliseconds mymaster 30000
# 故障转移时,最多1个从节点同时同步新主节点数据
sentinel parallel-syncs mymaster 1
# 故障转移超时时间(180秒)
sentinel failover-timeout mymaster 180000
# 主节点的访问密码(与主节点requirepass一致,含特殊字符需用引号)
sentinel auth-pass mymaster "Foton@2024kdms"
启动主节点哨兵容器:
docker run -p 26379:26379 \--network host \--name redis-sentinel-21 \--restart=always \-v /home/mydata/sentinel/conf/sentinel.conf:/etc/redis/sentinel.conf \-d redis redis-sentinel /etc/redis/sentinel.conf
2. 从节点(172.16.126.20)的哨兵配置
创建哨兵配置文件sentinel.conf(与主节点哨兵配置一致,仅运行在不同服务器):
vi /home/mydata/sentinel/conf/sentinel.conf
填入以下内容(与主节点哨兵配置相同):
port 26379
daemonize no
sentinel monitor mymaster 172.16.126.21 6379 1
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel auth-pass mymaster "Foton@2024kdms"
启动从节点哨兵容器:
docker run -p 26379:26379 \--network host \--name redis-sentinel-20 \--restart=always \-v /home/mydata/sentinel/conf/sentinel.conf:/etc/redis/sentinel.conf \-d redis redis-sentinel /etc/redis/sentinel.conf
四、验证哨兵模式
1. 检查主从复制状态
- 主节点(21):
# 进入主节点容器
docker exec -it redis-master redis-cli
# 输入密码认证
auth Foton@2024kdms
# 查看复制状态(应显示1个从节点)
info replication
正常输出应包含:role:master和connected_slaves:1,并显示从节点172.16.126.20的信息。
- 从节点(20):
# 进入从节点容器
docker exec -it redis-slave redis-cli
# 若从节点未设置密码则无需认证,否则执行:auth Foton@2024kdms
# 查看复制状态(应显示主节点信息)
info replication
正常输出应包含:role:slave、master_host:172.16.126.21和master_link_status:up。
2. 检查哨兵状态
在任意哨兵容器中执行命令,查看监控的主从节点信息:
# 进入21节点哨兵容器(或20节点的redis-sentinel-20)
docker exec -it redis-sentinel-21 redis-cli -p 26379
# 查看当前主节点
sentinel get-master-addr-by-name mymaster
# 查看从节点列表(应显示20节点)
sentinel slaves mymaster
# 查看哨兵集群(应显示2个哨兵)
sentinel sentinels mymaster
五、故障转移测试
手动停止主节点(21),验证哨兵是否自动将从节点(20)升级为新主节点:
1.停止主节点容器:
# 在21节点执行
docker stop redis-master
2.等待 30 秒后(down-after-milliseconds 配置),查看哨兵主节点:
# 进入任意哨兵容器
docker exec -it redis-sentinel-20 redis-cli -p 26379
sentinel get-master-addr-by-name mymaster # 应返回172.16.126.20 6379
3.恢复原主节点(21):
# 在21节点执行
docker start redis-master
原主节点恢复后会自动成为新主节点(20)的从节点,可通过info replication验证。
六、常见问题及解决
1.从节点启动报错 “Permission denied”:
原因:配置文件权限不足。解决:chmod 644 /home/mydata/redis/conf/redis.conf。
2.主从复制失败(从节点 role 仍为 master):
原因:启动命令未指定配置文件,replicaof未生效。解决:启动命令末尾添加/etc/redis/redis.conf。
3.哨兵无法识别从节点(slaves 返回空):
原因:主从复制未生效,或哨兵未配置auth-pass。解决:确保主从正常连接,哨兵配置中添加sentinal auth-pass。
4.Java 项目在主节点故障后无法访问:
原因:客户端未通过哨兵获取新主节点,硬编码了原主节点地址。解决:客户端配置哨兵模式(示例 Spring Boot 配置):
spring:redis:sentinel:master: mymasternodes: 172.16.126.21:26379,172.16.126.20:26379password: Foton@2024kdms
总结
通过本文步骤,可在两台服务器上快速搭建 Redis 哨兵模式,实现主节点故障自动转移。核心注意事项:
- 启动 Redis 容器时必须指定配置文件路径。
- 密码含特殊字符需用引号包裹,且主从、哨兵密码保持一致。
- 客户端需通过哨兵获取主节点地址,而非硬编码。
按此配置,哨兵模式可有效保障 Redis 服务的高可用性,适合中小规模生产环境使用。