Redis Sentinel故障转移时无法执行client-reconfig-script(VIP漂移)求助
排查Redis Sentinel client-reconfig-script 未执行VIP漂移的问题
我来帮你梳理下这个问题的排查方向,结合你用的CentOS7 + Redis 4.0.2环境,咱们从几个核心点逐一验证:
1. 先确认Sentinel配置的脚本路径与格式
- 检查
/etc/sentinel.conf里的配置是否完整且正确:正确的格式应该是sentinel client-reconfig-script mymaster /usr/opt/notify_master.sh,你之前写的/usr/...是不是路径没写全?CentOS是大小写敏感的,路径拼写错误会直接导致Sentinel找不到脚本。 - 立刻去看Sentinel的日志(默认路径一般是
/var/log/redis/sentinel.log,或者你启动时指定的日志文件),执行tail -f /var/log/redis/sentinel.log后手动触发故障转移,看日志里有没有类似Cannot execute script或者Failed to run script的报错,这是最直接的问题线索。
2. 验证脚本本身的可用性
- 先检查脚本的shebang行:脚本开头必须有
#!/bin/bash或#!/bin/sh,否则Sentinel不知道用什么解释器执行脚本,直接失败。 - 手动模拟Sentinel的调用方式执行脚本:Sentinel触发脚本时会传递5个参数,格式是
/usr/opt/notify_master.sh <旧主节点IP> <旧主节点端口> <新主节点IP> <新主节点端口> <主节点名称(mymaster)>,你手动传真实参数执行,看能不能正常完成VIP漂移,有没有报错(比如找不到命令、权限不足)。 - 脚本里的系统命令必须用绝对路径:比如
ip命令要写/usr/sbin/ip,而不是只写ip——因为Sentinel运行时的环境变量PATH非常有限,找不到系统默认路径下的命令。
3. 检查Sentinel运行用户的权限
- 先看Sentinel是用哪个用户启动的:执行
ps aux | grep redis-sentinel,如果是redis用户,那这个用户大概率没有修改网卡配置、绑定VIP的权限(这些操作需要root权限)。 - 解决办法:
- 给
redis用户配置sudo免密权限:编辑/etc/sudoers,添加redis ALL=(ALL) NOPASSWD: /usr/sbin/ip(如果脚本里还有其他需要root权限的命令,也要加进去)。 - 或者修改脚本,把需要权限的命令用
sudo包裹,比如sudo /usr/sbin/ip addr add 192.168.1.100/24 dev eth0。
- 给
4. Redis 4.0.2的脚本执行限制
- 确认脚本超时时间:Redis 4.0里Sentinel默认的脚本超时时间是60秒,如果你的VIP漂移脚本执行时间超过这个值,Sentinel会直接杀掉脚本进程。可以在
sentinel.conf里添加sentinel script-timeout mymaster 120来延长超时时间(单位是秒)。 - 检查配置是否生效:修改
sentinel.conf后,必须重启Sentinel或者用SENTINEL RESET mymaster命令让配置生效,否则新配置不会被加载。
5. SELinux的限制(CentOS7默认开启)
- CentOS7默认启用SELinux,可能会阻止Sentinel执行脚本,或者脚本执行系统命令。可以临时关闭SELinux测试:执行
setenforce 0,然后触发故障转移,看脚本是否正常执行。 - 如果临时关闭后生效,就需要给脚本添加SELinux上下文以永久解决:
semanage fcontext -a -t bin_t /usr/opt/notify_master.sh restorecon -v /usr/opt/notify_master.sh
按照上面的步骤逐一排查,重点优先看Sentinel日志和手动测试脚本,基本就能定位到问题所在了。
内容的提问来源于stack exchange,提问作者dzhou
相关产品推荐
相关产品推荐

