Redis 哨兵高可用
哨兵(Sentinel)是一组独立进程,替你监控 Redis 主从:主库挂了自动把某个从库提升为主,业务无需停机。它默认监听 26379 端口,解决的是“高可用”,不是“容量扩展”。
哨兵的四个职能
- 监控:持续 ping 主库与从库,判断是否存活。
- 通知:节点异常时通知管理员或应用。
- 自动故障转移:主库不可用时,选一个从库晋升为主,并让其他从库改跟随新主。
- 配置提供:客户端向哨兵查询“当前谁是主”,主地址变化对业务透明。
搭建最小高可用
典型布局是 1 主 + 2 从 + 3 个哨兵。每台哨兵写一份 sentinel.conf:
port 26379
sentinel monitor mymaster 192.168.1.10 6379 2 # 名字自取;2 为 quorum
sentinel down-after-milliseconds mymaster 5000 # 多久没响应视为主观下线
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1 # 同时让几个从库重新同步
sentinel auth-pass mymaster YourPass # 主库设了密码时填写
启动哨兵(哨兵之间通过主库上的频道互相发现、协商):
redis-sentinel /etc/redis/sentinel.conf
# 输出:... Sentinel started ...
redis-cli -p 26379 INFO sentinel
# 输出:sentinel_masters:1 ... sentinel_running_scripts:0
下线判定与故障转移
- 主观下线(sdown):单个哨兵超过 down-after-milliseconds 没收到主库有效响应。
- 客观下线(odown):至少 quorum 个哨兵都认为主库下线,如上例 3 台哨兵中 2 台同意。
- 之后哨兵内部选出 leader,由它执行故障转移:按从库优先级、复制偏移量等挑选新主,把其余从库指向新主;原主恢复上线后自动变成新主的从库。
客户端如何拿到主地址
业务不直连固定 IP,而是先问哨兵:
127.0.0.1:26379> SENTINEL get-master-addr-by-name mymaster
# 输出:1) "192.168.1.12" # 切换后返回新主地址
# 2) "6379"
127.0.0.1:26379> SENTINEL replicas mymaster # 查看当前从库清单
127.0.0.1:26379> SENTINEL failover mymaster # 手动触发一次故障转移
主流客户端都有哨兵封装,如 Java 的 JedisSentinelPool、go-redis 的 FailoverClient,只需配置哨兵地址列表与 master 名字。
部署建议与边界
- 哨兵数量建议 3 台起的奇数,quorum 约为一半多一,例如 3 台配 quorum 2,可容忍 1 台哨兵宕机。
- 哨兵、主库、从库尽量分散部署,避免同一台机器宕机带走整个方案。
- 与 Cluster 的边界:哨兵方案仍是“一主多从、单点写”,解决自动切换与高可用;当写压力或数据量需要水平拆分时,应改用数据分片的 Redis Cluster(见下一章)。
小结:哨兵 = 监控 + 自动故障转移 + 地址服务,配置核心是 sentinel monitor 一行的名字与 quorum;它把主从复制升级为无需人工干预的高可用架构,但不解决容量问题。