首页/数据/Redis 进阶速查/client-reconfig-script:切换后回调
主从与哨兵51 条

client-reconfig-script:切换后回调

sentinel client-reconfig-script <master> <script> 在切换时调用外部脚本,把新主库地址通过参数传入,可用来更新配置中心或 DNS。

Redis 进阶速查数据更新于 2026-10-13

切换后要通知谁

哨兵能自动把从库提成主库,但主库地址变了这件事往往还要传出去:配置中心里的连接串、负载均衡的后端、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

参数逐位读法

位置含义示例值
$1master-namemymaster
$2执行脚本的哨兵角色leader 或 observer
$3切换状态,当前实现恒为 startstart
$4 $5被替换的旧主库 ip 与 port10.0.0.11 6379
$6 $7新主库 ip 与 port10.0.0.12 6379
第三个参数目前恒为 start,不要指望它给出切换结束事件;需要结束态信息就配合 notification-script,或事后查 SENTINEL MASTERS 核对当前主库。
脚本的输出不会回传给业务方,需要留痕就在脚本里自己写文件或走 syslog;建议把触发哨兵的地址、新旧主库地址与执行时间一起记下来,复盘时才有据可查。
脚本由哨兵以自身运行用户启动,权限、环境变量与 PATH 都与登录 shell 不同,命令一律写绝对路径,避免出现「手工执行正常、哨兵调用失败」。
脚本会阻塞该哨兵的切换流程推进,哨兵等待子进程的时间有限,超时会杀掉脚本继续往下走;脚本必须做到「改完立刻返回」,网络调用一律加超时参数。

易错点

  • 脚本只部署在一台哨兵上 → 恰好是另一台当选 leader 时钩子不执行 → 三台哨兵都部署脚本与其依赖的客户端工具
  • 脚本不幂等,切换重试时重复下发地址 → 联动侧地址反复抖动 → 写入前先比较当前值,相同则直接退出
  • 在脚本里等待外部系统确认或 sleep → 触发哨兵超时杀进程,联动丢失 → 只做提交动作,重活丢给异步任务队列
  • 把联动保障全押在这个脚本上 → 脚本失败只写日志、不阻止切换完成 → VIP 与 DNS 侧另配独立探测兜底

数据来源与参考

  • Redis 官方文档:Sentinel client-reconfig-script 说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌