Redis哨兵集群配置
一、哨兵集群核心原理
Redis哨兵(Sentinel)是实现高可用性的分布式系统,通过监控、通知、自动故障转移三大功能保障服务连续性:
-
监控机制
哨兵节点每秒向主/从节点发送
PING命令检测存活状态,响应超时判定为主观下线 (SDOWN)。当多数哨兵(quorum)确认主节点下线,触发客观下线(ODOWN)。 -
故障转移流程
- 领导者选举:使用Raft协议在哨兵间选举领导者
- 新主节点选择:根据优先级、复制偏移量等规则选择最优从节点
- 配置更新:将新主节点信息同步至所有节点
- 客户端重定向:通过
PUBLISH通知客户端更新连接
-
状态同步
哨兵通过
__sentinel__:hello频道发布自身信息,实现节点间状态共享。
二、OpenEuler环境准备
bash
# 所有节点执行
sudo dnf install -y gcc make tcl
wget https://download.redis.io/releases/redis-7.0.12.tar.gz
tar xzf redis-7.0.12.tar.gz
cd redis-7.0.12
make && sudo make install
# 创建专用用户
sudo groupadd redis
sudo useradd -r -g redis -s /sbin/nologin redis
三、节点角色规划
| IP地址 | 角色 | 端口分配 |
|---|---|---|
| 192.168.64.128 | 主节点 + 哨兵 | 6379/26379 |
| 192.168.64.129 | 从节点 + 哨兵 | 6379/26379 |
| 192.168.64.130 | 从节点 + 哨兵 | 6379/26379 |
四、Redis主从配置
主节点配置 (128)
bash
# /etc/redis/redis.conf
bind 192.168.64.128
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile /var/log/redis/redis.log
dir /var/lib/redis
masterauth "S3cr3tP@ss" # 主从认证密码
requirepass "S3cr3tP@ss" # 客户端访问密码
从节点配置 (129/130)
bash
slaveof 192.168.64.128 6379
masterauth "S3cr3tP@ss"
replica-read-only yes
五、哨兵集群配置(所有节点)
bash
# /etc/redis/sentinel.conf
port 26379
daemonize yes
logfile /var/log/redis/sentinel.log
sentinel monitor mymaster 192.168.64.128 6379 2 # quorum=2
sentinel auth-pass mymaster "S3cr3tP@ss"
sentinel down-after-milliseconds mymaster 5000 # 5秒判定下线
sentinel failover-timeout mymaster 60000 # 故障转移超时
sentinel parallel-syncs mymaster 1 # 并行同步数
六、关键参数解析
- quorum值
主要作用是把来自多个哨兵节点的独立判断(主观下线)汇聚成一个集群层面的共同决策(客观下线),从而有效防止因单点网络抖动等原因导致的误判
-
故障转移超时
failover-timeout:控制故障转移各阶段超时阈值- 包含领导者选举、从节点晋升、配置传播三阶段
-
网络分区处理
bashgraph LR A[主节点] -->|网络中断| B[分区A] C[哨兵集群] -->|网络中断| D[分区B] B-->|多数哨兵在线| E[触发故障转移] D-->|少数哨兵在线| F[维持原状态]
七、启动与验证
bash
# 启动Redis服务
sudo systemctl start redis-server
# 启动哨兵服务
redis-sentinel /etc/redis/sentinel.conf
# 验证主从状态(从节点执行)
redis-cli -h 192.168.64.129 -a S3cr3tP@ss
> INFO replication
# 输出示例
role:slave
master_host:192.168.64.128
master_link_status:up
# 检查哨兵拓扑
redis-cli -p 26379
> SENTINEL MASTER mymaster
预期输出包含主节点IP、从节点数量、哨兵节点数等关键信息。
八、故障转移测试
-
模拟主节点宕机
bash# 在主节点执行 sudo systemctl stop redis-server -
观察日志
bash# sentinel.log +sdown master mymaster 192.168.64.128 6379 +odown master mymaster #quorum 2/2 +try-failover master mymaster +vote-for-leader 5a3b4c6d 1 # 领导者选举 +elected-leader master mymaster +selected-slave 192.168.64.129 # 新主节点 +failover-state-send-slaveof-noone 192.168.64.129 +failover-state-wait-promotion 192.168.64.129 +promoted-slave 192.168.64.129 # 晋升成功 -
验证新拓扑
bashredis-cli -p 26379 > SENTINEL GET-MASTER-ADDR-BY-NAME mymaster 1) "192.168.64.129" 2) "6379"
九、生产环境优化建议
-
内核参数调优
bash# /etc/sysctl.conf net.core.somaxconn = 2048 vm.overcommit_memory = 1 -
哨兵部署策略
- 避免与Redis进程同机部署(物理隔离)
- 跨机房部署时设置
sentinel announce-ip声明公网IP
-
客户端重连策略
python# Python示例 from redis.sentinel import Sentinel sentinel = Sentinel([('192.168.64.128', 26379), ('192.168.64.129', 26379), ('192.168.64.130', 26379)], socket_timeout=0.5) master = sentinel.master_for('mymaster', password='S3cr3tP@ss') master.set('key', 'value') # 自动路由到主节点
十、常见故障排查
-
脑裂问题
- 现象:客户端同时向两个"主节点"写入
- 解决:设置
min-slaves-to-write 1确保至少一个从节点同步
-
配置不同步
- 检查哨兵节点间网络连通性
- 验证
sentinel current-epoch值是否一致
-
日志分析要点
bashgrep -E 'sdown|odown|failover' /var/log/redis/sentinel.log
十一、监控告警配置
-
Prometheus监控指标
bash# redis_exporter配置 - targets: ['192.168.64.128:9121', '192.168.64.129:9121', '192.168.64.130:9121'] labels: group: 'redis-sentinel' -
关键告警规则
bash- alert: RedisSentinelQuorumLost expr: redis_sentinel_master_quorum_status == 0 for: 5m labels: severity: critical
十二、安全加固措施
-
防火墙配置
bash# OpenEuler防火墙规则 sudo firewall-cmd --permanent --add-port=6379/tcp sudo firewall-cmd --permanent --add-port=26379/tcp sudo firewall-cmd --reload -
ACL访问控制
bash# redis.conf aclfile /etc/redis/users.aclacl# users.acl user default on >S3cr3tP@ss ~* +@all user monitor on >MonitorP@ss resetchannels -@all +info