1. Redis哨兵集群概述
Redis哨兵(Sentinel)是Redis官方提供的高可用性解决方案,它通过监控主从节点状态、自动故障转移和配置更新等机制,确保Redis服务在节点故障时仍能持续可用。这套系统特别适合对数据可靠性要求较高的生产环境,比如电商平台的购物车、秒杀系统的库存计数等场景。
哨兵系统由多个哨兵节点组成,它们独立于Redis主从节点运行。当主节点不可用时,哨兵会通过投票机制从从节点中选举出新的主节点,并自动更新客户端连接配置。这种设计避免了单点故障,即使部分哨兵节点宕机,只要多数哨兵存活就能维持集群的正常运作。
关键特性:监控(Monitoring)、通知(Notification)、自动故障转移(Automatic failover)、配置提供(Configuration provider)
2. 环境规划与准备
2.1 硬件配置建议
对于生产环境,建议采用至少3台物理服务器或虚拟机,每台配置:
- CPU:4核以上(Redis单线程模型对单核性能敏感)
- 内存:16GB+(根据数据量调整,预留30%缓冲)
- 磁盘:SSD存储,容量为预估数据量的2-3倍
- 网络:千兆内网互联
测试环境可以用单机多实例方式模拟,但必须保证:
- 每个Redis实例使用不同端口
- 每个哨兵实例使用不同端口
- 关闭防火墙或开放相应端口
2.2 软件版本选择
当前稳定版本组合(2023年):
- Redis 7.0+(新版本优化了内存管理和线程模型)
- Sentinel版本与Redis主程序绑定
版本兼容性注意:
- 哨兵节点数量必须为奇数(推荐3或5个)
- 所有节点应使用相同Redis版本
- 避免混用大版本(如6.x与7.x混搭)
3. Redis主从集群部署
3.1 基础安装步骤
# Ubuntu/Debian sudo apt update sudo apt install -y build-essential tcl wget https://download.redis.io/releases/redis-7.0.11.tar.gz tar xzf redis-7.0.11.tar.gz cd redis-7.0.11 make && make install # 创建数据目录 sudo mkdir -p /var/lib/redis/6379 sudo chown -R redis:redis /var/lib/redis3.2 主节点配置
编辑/etc/redis/6379.conf:
port 6379 daemonize yes pidfile /var/run/redis_6379.pid logfile "/var/log/redis_6379.log" dir /var/lib/redis/6379 maxmemory 8gb maxmemory-policy allkeys-lru appendonly yes appendfilename "appendonly.aof"3.3 从节点配置
在从节点配置文件中额外添加:
replicaof <master-ip> 6379 replica-read-only yes repl-diskless-sync yes验证主从同步:
redis-cli info replication # 主节点应显示connected_slaves > 0 # 从节点应显示role:slave和master_link_status:up4. 哨兵集群部署
4.1 哨兵配置文件
创建/etc/redis/sentinel.conf:
port 26379 daemonize yes logfile "/var/log/redis/sentinel.log" dir "/tmp" sentinel monitor mymaster 192.168.1.100 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 60000 sentinel parallel-syncs mymaster 1 # 当使用认证时添加 sentinel auth-pass mymaster YourStrongPassword关键参数说明:
down-after-milliseconds:判定节点不可用的超时时间failover-timeout:故障转移超时时间parallel-syncs:故障转移后同时同步的从节点数
4.2 启动哨兵节点
redis-sentinel /etc/redis/sentinel.conf验证哨兵状态:
redis-cli -p 26379 info sentinel # 应显示sentinel_masters:1和sentinel_known_slaves:2(根据实际从节点数)5. 集群验证与测试
5.1 自动故障转移测试
在主节点执行DEBUG SEGFAULT强制崩溃
观察哨兵日志:
+sdown master mymaster 192.168.1.100 6379 +odown master mymaster 192.168.1.100 6379 #quorum 2/2 +try-failover master mymaster 192.168.1.100 6379 +vote-for-leader xxx 1 +elected-leader master mymaster 192.168.1.100 6379 +failover-state-select-slave master mymaster 192.168.1.100 6379 +selected-slave slave 192.168.1.101:6379 192.168.1.101 6379 +failover-state-send-slaveof-noone slave 192.168.1.101:6379 192.168.1.101 6379 +failover-state-wait-promotion slave 192.168.1.101:6379 192.168.1.101 6379 +promoted-slave slave 192.168.1.101:6379 192.168.1.101 6379 +failover-state-reconf-slaves master mymaster 192.168.1.100 6379 +slave-reconf-sent slave 192.168.1.102:6379 192.168.1.102 6379 +slave-reconf-inprog slave 192.168.1.102:6379 192.168.1.102 6379 +slave-reconf-done slave 192.168.1.102:6379 192.168.1.102 6379 +failover-end master mymaster 192.168.1.100 6379 +switch-master mymaster 192.168.1.100 6379 192.168.1.101 6379检查新主节点是否可写:
redis-cli -h 192.168.1.101 set test_key "value_after_failover"
5.2 客户端连接配置
Java客户端示例(Jedis):
JedisPoolConfig poolConfig = new JedisPoolConfig(); Set<String> sentinels = new HashSet<>(); sentinels.add("192.168.1.100:26379"); sentinels.add("192.168.1.101:26379"); sentinels.add("192.168.1.102:26379"); JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels, poolConfig); try (Jedis jedis = pool.getResource()) { jedis.set("foo", "bar"); System.out.println(jedis.get("foo")); }6. 生产环境优化建议
6.1 内核参数调优
# 增加TCP backlog echo 'net.core.somaxconn = 65535' >> /etc/sysctl.conf # 内存过量使用(避免OOM killer) echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf # 透明大页禁用(影响性能) echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled sysctl -p6.2 Redis配置优化
# 主节点 repl-backlog-size 256mb repl-backlog-ttl 3600 min-replicas-to-write 1 min-replicas-max-lag 10 # 所有节点 tcp-keepalive 300 timeout 0 client-output-buffer-limit replica 512mb 128mb 606.3 哨兵部署策略
- 跨机架/可用区部署哨兵节点
- 哨兵节点不要与Redis实例混部
- 监控哨兵节点的
uptime_in_seconds和last_ok_ping_reply - 配置适当的告警规则:
- 主从切换事件
- 哨兵节点不可用
- 从节点同步延迟
7. 常见问题排查
7.1 脑裂问题处理
症状:网络分区导致出现双主节点 解决方案:
# 手动干预 redis-cli -h <old-master> DEBUG SLEEP 30 # 检查哨兵日志确认故障转移完成预防措施:
- 合理设置
down-after-milliseconds(建议5000-15000ms) - 确保至少3个哨兵节点且分布在不同物理位置
- 配置
min-replicas-to-write
7.2 同步延迟问题
诊断命令:
redis-cli info replication # 查看master_repl_offset与slave_repl_offset差值优化方案:
- 使用SSD磁盘
- 增大
repl-backlog-size - 适当调大
client-output-buffer-limit - 考虑使用Redis 7.0的共享复制缓冲区
7.3 哨兵无法达成共识
可能原因:
- 网络分区导致哨兵节点间通信中断
- 配置文件中
quorum值设置过高 - 哨兵节点时间不同步
检查步骤:
# 检查各哨兵节点视图是否一致 redis-cli -p 26379 sentinel master mymaster redis-cli -p 26379 sentinel slaves mymaster redis-cli -p 26379 sentinel sentinels mymaster # 检查系统时间 date && ntpstat8. 监控与维护
8.1 关键监控指标
Redis实例:
- 内存使用率(used_memory/maxmemory)
- 持久化状态(rdb_last_bgsave_status/aof_last_write_status)
- 命中率(keyspace_hits/keyspace_misses)
- 延迟监控(latency monitor)
哨兵节点:
- 哨兵到Redis节点的ping延迟
- 主从切换次数(sentinel_simulate_failure_count)
- 哨兵节点之间的消息传递延迟
8.2 日常维护命令
检查集群状态:
redis-cli -p 26379 sentinel masters redis-cli -p 26379 sentinel get-master-addr-by-name mymaster安全移除节点:
redis-cli -p 26379 sentinel remove mymaster redis-cli -p 26379 sentinel reset mymaster手动触发故障转移(测试用):
redis-cli -p 26379 sentinel failover mymaster9. 版本升级策略
滚动升级步骤:
- 先升级从节点
- 手动故障转移(SENTINEL FAILOVER)
- 升级原主节点
- 最后升级哨兵节点
大版本升级注意:
- 检查Release Notes中的破坏性变更
- 先在测试环境验证RDB/AOF文件兼容性
- 准备回滚方案(旧版本二进制文件不要立即删除)
升级后验证:
- 检查所有功能是否正常
- 监控性能指标变化
- 确认客户端连接无异常