本项目提供了基于Docker的Redis Sentinel高可用集群部署方案,适用于两台物理机的场景。通过合理分配Sentinel节点位置和设置Quorum值,确保在主节点所在机器故障时能够可靠地进行故障转移。
- 机器A(Master节点机器):
- 1个Redis Master节点(Redis 7.4.3)
- 2个Sentinel节点(优化分布,增强可靠性)
- 机器B(Replica节点机器):
- 1个Redis Replica节点
- 2个Sentinel节点
- 机器A:
- Redis端口:6379
- Sentinel端口:26379, 26380
- 机器B:
- Redis端口:6379
- Sentinel端口:26379, 26380
- Redis密码认证
- protected-mode开启
- 内网部署,隔离外部访问
- 脚本中增加了密码强度检查
- 健康检查确保服务正常
- 4个Sentinel节点均衡分布在两台机器上
- Quorum值设置为2,确保多数决策
- 任一台机器故障时,仍有2个Sentinel节点正常运行
- 完善的故障检测与恢复机制
- Docker Engine (版本 17.06.0 或更高)
- Docker Compose (支持V1或V2版本)
- Docker Compose V1:
docker-compose命令 (1.18.0 或更高) - Docker Compose V2:
docker compose命令
- Docker Compose V1:
- Redis镜像(需提前下载到本地):redis:7.4.3
- 两台物理机之间可以通过内网互相访问
确保两台机器已安装Docker和Docker Compose:
# 检查Docker版本
docker --version # 需要 17.06.0 或更高版本
# 检查Docker Compose版本
# V1版本
docker-compose --version # 需要 1.18.0 或更高版本
# 或V2版本
docker compose version对于有外网环境的服务器,可以直接拉取镜像:
docker pull redis:7.4.3对于离线环境,需要提前准备好镜像:
# 在有网络的环境中拉取并保存镜像
docker pull redis:7.4.3
docker save -o redis-7.4.3.tar redis:7.4.3
# 将镜像文件传输到目标服务器
# 然后在目标服务器上加载镜像
docker load -i redis-7.4.3.tar将redis-7.4.3.tar文件放在部署脚本的同级目录,脚本会自动检测并加载。
将项目文件夹复制到两台机器上,包含以下关键文件:
deploy_master.sh:机器A的部署脚本deploy_replica.sh:机器B的部署脚本
# 执行部署脚本,提供本机IP、对端机器IP和Redis密码
./deploy_master.sh <机器A_IP> <机器B_IP> "<Redis密码>"
# 例如:
./deploy_master.sh 192.168.1.100 192.168.1.101 "StrongPassword123"注意:密码应该使用引号括起来,特别是包含特殊字符时
# 执行部署脚本,提供本机IP、对端机器IP和Redis密码
./deploy_replica.sh <机器B_IP> <机器A_IP> "<Redis密码>"
# 例如:
./deploy_replica.sh 192.168.1.101 192.168.1.100 "StrongPassword123"脚本执行过程中会自动进行健康检查。如果需要手动验证:
-
验证主从复制状态:
# 在机器A上执行 docker exec redis-master redis-cli -h <机器A_IP> -a "<Redis密码>" info replication # 在机器B上执行 docker exec redis-replica redis-cli -h <机器B_IP> -a "<Redis密码>" info replication
-
验证Sentinel状态:
# 在机器A上执行 - 检查两个Sentinel docker exec redis-sentinel-1 redis-cli -h <机器A_IP> -p 26379 info sentinel docker exec redis-sentinel-4 redis-cli -h <机器A_IP> -p 26380 info sentinel # 在机器B上执行 - 检查两个Sentinel docker exec redis-sentinel-2 redis-cli -h <机器B_IP> -p 26379 info sentinel docker exec redis-sentinel-3 redis-cli -h <机器B_IP> -p 26380 info sentinel
-
停止机器A上的所有服务:
cd /opt/redis-sentinel/machine-a docker compose down # V2版本 # 或者 docker-compose down # V1版本
-
在机器B上观察故障转移过程:
# 监控Sentinel状态 docker exec redis-sentinel-2 redis-cli -h <机器B_IP> -p 26379 info sentinel # 检查Redis角色变化 docker exec redis-replica redis-cli -h <机器B_IP> -a "<Redis密码>" info replication
-
预期结果:
- 机器B的Redis节点应该从Replica角色转变为Master角色
- 所有Sentinel节点应该识别新的Master节点
-
在机器A上重新启动服务:
cd /opt/redis-sentinel/machine-a docker compose up -d # V2版本 # 或者 docker-compose up -d # V1版本
-
验证机器A的Redis节点现在是以Replica角色加入集群:
docker exec redis-master redis-cli -h <机器A_IP> -a "<Redis密码>" info replication
-
停止机器B上的所有服务:
cd /opt/redis-sentinel/machine-b docker compose down # V2版本 # 或者 docker-compose down # V1版本
-
在机器A上验证Sentinel状态:
docker exec redis-sentinel-1 redis-cli -h <机器A_IP> -p 26379 info sentinel docker exec redis-sentinel-4 redis-cli -h <机器A_IP> -p 26380 info sentinel
-
确认机器A的Redis节点保持为Master角色。
-
Sentinel分布与Quorum设置:
- 每台机器上都部署了2个Sentinel节点,总共4个
- Quorum设置为2,确保在任一机器故障时仍能正常决策
- 避免Sentinel单点故障问题
-
网络模式:
- 使用host网络模式部署,避免Docker网络隔离问题
- 确保容器可以直接使用主机网络接口
-
持久化设置:
- 启用AOF持久化,确保数据可靠性
- 数据保存在主机的数据目录中
-
安全配置:
- 启用Redis密码认证(requirepass和masterauth)
- Sentinel节点配置相应的认证密码(sentinel auth-pass)
- 启用protected-mode保护模式
- 部署脚本增加密码强度检查
-
健康检查:
- Docker容器配置了健康检查,确保服务可用性
- 脚本自动验证Redis和Sentinel状态
-
网络配置:
- 确保两台机器间的网络稳定可靠
- 检查防火墙设置,确保Redis和Sentinel端口互通
-
数据安全:
- 建议使用强密码,避免弱密码
- 密码应包含大小写字母、数字和特殊字符,长度不少于12位
- 考虑定期更换密码
- 配置防火墙限制只允许内网访问
-
监控建议:
- 建议配置外部监控系统监控Redis集群状态
- 关注Sentinel日志以了解故障转移情况
# 查看复制状态
docker exec -it redis-master redis-cli -h <机器A_IP> -a "<Redis密码>" info replication
docker exec -it redis-replica redis-cli -h <机器B_IP> -a "<Redis密码>" info replication
# 查看Sentinel状态
docker exec -it redis-sentinel-1 redis-cli -h <机器A_IP> -p 26379 info sentinel
# 手动触发故障转移(测试用)
docker exec -it redis-sentinel-1 redis-cli -h <机器A_IP> -p 26379 sentinel failover mymaster
# 查看容器日志
docker logs redis-master
docker logs redis-replica
docker logs redis-sentinel-1如果在使用过程中遇到Sentinel监控问题,可以尝试以下方法:
-
检查Sentinel日志:
docker logs redis-sentinel-1 | tail -50 -
重置Sentinel状态:
redis-cli -h <机器A_IP> -p 26379 SENTINEL RESET mymaster
-
手动触发故障转移:
redis-cli -h <机器A_IP> -p 26379 SENTINEL FAILOVER mymaster
-
验证所有Sentinel状态:
# 执行此命令检查所有Sentinel节点是否一致 for port in 26379 26380; do echo "== Checking Sentinel on port $port ==" redis-cli -h <机器A_IP> -p $port SENTINEL masters done for port in 26379 26380; do echo "== Checking Sentinel on port $port ==" redis-cli -h <机器B_IP> -p $port SENTINEL masters done