切换后要通知谁
哨兵能自动把从库提成主库,但主库地址变了这件事往往还要传出去:配置中心里的连接串、负载均衡的后端、DNS 记录都得跟着改。sentinel client-reconfig-script 就是切换时的回调钩子,哨兵会调用本机脚本,并把它算出来的新主库地址作为参数传进去。
基本信息
| 配置项 | sentinel client-reconfig-script <master-name> <script-path> |
|---|---|
| 执行位置 | 由触发切换的哨兵在本机启动脚本 |
| 传入参数 | master-name、role、state 以及新旧主库地址与端口 |
| 生效方式 | 写入 sentinel.conf 或用 SENTINEL SET 在线调整 |
典型使用场景
- 切换后刷新配置中心或注册中心里的主库连接串
- 漂移 VIP 或更新四层负载均衡的后端地址
- 触发 DNS 或服务发现记录的变更,配合主机名方案使用
- 把每次切换写成审计记录,供复盘统计切换次数与时长
- 作为应急联动入口,通知相关方切换已发生
脚本骨架
脚本骨架
#!/bin/sh
# 参数:$1 master-name $2 role $3 state $4/$5 旧地址 $6/$7 新地址
MASTER=$1; ROLE=$2; NEW_IP=$6; NEW_PORT=$7
echo "$(date '+%F %T') failover $MASTER -> $NEW_IP:$NEW_PORT role=$ROLE" >> /var/log/redis-reconfig.log
# 幂等写入:先读当前值,相同就直接退出,避免重复触发时反复改
curl -sf -m 3 -X POST http://conf-center/api/master \
-d "name=$MASTER&addr=$NEW_IP:$NEW_PORT" || exit 1参数逐位读法
| 位置 | 含义 | 示例值 |
|---|---|---|
| $1 | master-name | mymaster |
| $2 | 执行脚本的哨兵角色 | leader 或 observer |
| $3 | 切换状态,当前实现恒为 start | start |
| $4 $5 | 被替换的旧主库 ip 与 port | 10.0.0.11 6379 |
| $6 $7 | 新主库 ip 与 port | 10.0.0.12 6379 |
第三个参数目前恒为 start,不要指望它给出切换结束事件;需要结束态信息就配合 notification-script,或事后查 SENTINEL MASTERS 核对当前主库。
脚本的输出不会回传给业务方,需要留痕就在脚本里自己写文件或走 syslog;建议把触发哨兵的地址、新旧主库地址与执行时间一起记下来,复盘时才有据可查。
脚本由哨兵以自身运行用户启动,权限、环境变量与 PATH 都与登录 shell 不同,命令一律写绝对路径,避免出现「手工执行正常、哨兵调用失败」。
脚本会阻塞该哨兵的切换流程推进,哨兵等待子进程的时间有限,超时会杀掉脚本继续往下走;脚本必须做到「改完立刻返回」,网络调用一律加超时参数。