客户端接入哨兵
哨兵负责选出新主库,但客户端不会自动知道切换结果:客户端要先向哨兵询问当前主库地址再建连,并在后续订阅切换事件或轮询探测。主流客户端库(Jedis、Lettuce、redis-py、go-redis)都内置哨兵支持,直接用封装好的接口即可。
基本信息
| 哨兵默认端口 | 26379 |
|---|---|
| 主库发现 | SENTINEL get-master-addr-by-name 主库名 |
| 切换事件 | 订阅 +switch-master,或 +sdown 与 +odown |
| 客户端要求 | 连接池要能在切换后重建,不能只重连旧地址 |
| 超时设置 | 单次探测超时建议 1 秒以内,避免故障时请求堆积 |
典型使用场景
- 业务接入哨兵高可用:应用只配置哨兵地址列表与主库名,不需要硬编码主库 IP
- 故障切换后自动恢复:客户端收到切换事件后刷新主库地址并重建连接池
- 多语言混布:各语言客户端都按同一套哨兵地址列表配置,便于统一运维
- 灰度验证切换链路:用订阅事件观察切换是否被客户端正确感知
- 排障:手工询问哨兵主库地址,与客户端实际连接目标做比对
接入与校验
接入与校验
# Python:哨兵地址列表 + 主库名,读写分别取连接
from redis.sentinel import Sentinel
sentinel = Sentinel([('10.0.0.21', 26379),
('10.0.0.22', 26379),
('10.0.0.23', 26379)], socket_timeout=1)
master = sentinel.master_for('mymaster', socket_timeout=0.5, password='***')
slave = sentinel.slave_for('mymaster', socket_timeout=0.5, password='***')
master.set('k', 'v') # 写走当前主库
print(slave.get('k')) # 读走当前从库命令行校验
命令行校验
redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
redis-cli -p 26379 SENTINEL masters # 所有被监控主库概览
redis-cli -p 26379 SENTINEL sentinels mymaster # 其余哨兵节点
redis-cli -p 26379 PSUBSCRIBE +switch-master # 观察切换事件事件与含义
| 事件 | 含义 | 客户端动作 |
|---|---|---|
| +switch-master | 切换完成,新旧地址同时给出 | 刷新主库地址并重建连接池 |
| +sdown | 某个哨兵认为节点主观下线 | 暂不动作,等待是否升级为客观下线 |
| +odown | 达到票数判定客观下线 | 准备应对切换,避免大量写入重试 |
| +promoted-slave | 从库被提升为新主库 | 确认新主库可写后恢复写入 |
客户端要处理「连接被重置」这类异常:切换瞬间旧主库变成从库,写入会失败一次,重试前必须重新向哨兵要地址。
哨兵地址列表要配置全部节点:只配一个哨兵时,该哨兵宕机客户端就连不上,高可用形同虚设。