如何利用Redis哨兵实现自动化运维告警_对接Sentinel通知脚本notification-script

梦婷姑娘_3048

梦婷姑娘_3048

2026-06-06

368人浏览

原创

notification-script是redis sentinel在发生警告级事件(如主观/客观下线、主从切换)时调用的外部通知脚本,用于邮件、短信或告警平台通知;其不自动触发的主因是权限不足、脚本不可执行、超时或路径/环境配置错误。

如何利用redis哨兵实现自动化运维告警_对接sentinel通知脚本notification-script

notification-script 是什么,为什么它不自动触发

notification-script 是 Redis Sentinel 配置中的一项,用于在发生故障转移、主从切换等事件时,由 Sentinel 进程同步调用外部脚本。但它不是“只要配了就一定执行”——Sentinel 只会在自身进程有权限、脚本可执行、且调用不阻塞的前提下运行它。常见失败现象包括:Failed to execute notification script、日志里反复出现 Failed to spawn notification script,但脚本本身在命令行能跑通。

根本原因通常是:Sentinel 以启动它的用户身份(比如 redis 用户)执行脚本,而该用户缺乏对脚本路径、依赖命令(如 curl、jq)、临时文件目录的读写权限;或脚本未设 +x 权限;或脚本执行超时(Sentinel 默认等待 10 秒,超时即杀掉进程)。

  • 脚本必须是绝对路径,相对路径一律无效
  • 脚本第一行必须是有效的 shebang,例如 #!/bin/bash,且解释器路径真实存在
  • 所有依赖命令(如 curl、logger)需用绝对路径调用,或确保 PATH 环境变量被显式设置
  • Sentinel 不会传递 stdin,脚本不能依赖交互式输入

脚本接收的参数和典型使用场景

Sentinel 调用 notification-script 时,固定传入三个参数:$1 是事件类型(如 +sdown、+odown、+switch-master),$2 是发生事件的实例地址(格式为 ip:port),$3 是事件详情(可能为空,也可能含 JSON 结构的上下文)。这些参数全靠位置获取,没有命名参数。

最常对接的场景是:收到 +switch-master 后立刻通知运维群、更新配置中心、触发服务重注册;收到 +odown 但尚未切换时发 P0 级告警。注意:+sdown 是单个 Sentinel 认为主观下线,不可靠;+odown 是多数 Sentinel 达成共识,才值得告警;+switch-master 才代表客观切换完成,适合做恢复类动作。

  • +switch-master 的 $3 是新主节点地址(new-ip:new-port),不是 JSON,直接切分即可
  • +odown 的 $3 通常为空,判断依据只能是 $1 和 $2
  • 不要在脚本里 sleep 或做耗时操作,Sentinel 调用是同步阻塞的,卡住会影响 Sentinel 自身状态检测

一个最小可用的告警脚本示例(含权限与健壮性处理)

以下是一个生产环境验证过的 Bash 脚本片段,用于通过企业微信机器人发文本告警。关键点在于:显式设置 PATH、用绝对路径调用 curl、忽略非关键错误、限制执行时长:

Redis Skill - 高性能缓存管理
Redis Skill - 高性能缓存管理

Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。

下载
#!/bin/bash
# 注意:此脚本必须 chmod +x,且由 redis 用户能读取执行
<p>export PATH="/usr/bin:/bin:/usr/local/bin"
WEBHOOK_URL="<a href="https://www.php.cn/link/fc804d532af1ae8155de91061e37d756">https://www.php.cn/link/fc804d532af1ae8155de91061e37d756</a>"</p><h1>防止脚本被重复调用或卡死</h1><p>exec 2>/dev/null
timeout 8s /usr/bin/curl -s -X POST "$WEBHOOK_URL" \
-H 'Content-Type: application/json' \
-d "{\"msgtype\": \"text\", \"text\": {\"content\": \"[Redis Sentinel] $1 on $2\"}}" \</p><blockquote><p>/dev/null 2>&1 &</p></blockquote>

说明:timeout 8s 是硬性保护,避免 curl 卡死;末尾 & 让 curl 后台运行,Sentinel 不等待其结束(Sentinel 本身只等前台进程);exec 2>/dev/null 防止 stderr 输出干扰 Sentinel 日志解析。

  • 不要用 $(date) 或 hostname 等可能因环境缺失而失败的命令,除非你确认它们在 redis 用户下可用
  • 如果要用 JSON 构造复杂消息,建议用 /usr/bin/jq(而非 shell 字符串拼接),但要先检查是否存在
  • 测试时用 sudo -u redis /path/to/script.sh +switch-master 127.0.0.1:6379 10.0.1.5:6379 模拟调用

配置生效后必须验证的三件事

改完 sentinel.conf 中的 notification-script /path/to/alert.sh 并 sentinel failover 测试后,别急着认为 OK。实际线上出过太多“看着日志有调用,但告警没到”的情况,根源往往不在脚本逻辑,而在环境链路断点:

  • 检查 Sentinel 日志是否真有 Executing notification script 行,而不是只有 Executing script(后者是旧版日志格式,可能对应未启用配置)
  • 确认脚本所在磁盘分区没满(df -h),因为 Sentinel 会尝试创建临时文件描述符
  • 用 ps aux | grep sentinel 看进程启动时用的配置文件路径是否是你修改的那个(尤其是多实例部署时容易配错 conf 文件)

最隐蔽的问题是:脚本里用了 source ~/.bashrc 或 ~ 展开,而 redis 用户的 home 目录可能为空或无读权限——Sentinel 不加载任何 shell profile,一切得靠脚本自己兜底。

相关专题

更多
常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4289

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

3775

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

6832

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

623

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

736

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

6422

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1140

6

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1016

6

redis主要作用有哪些
redis主要作用有哪些

redis 的主要作用包括:1. 缓存数据,提高访问速度;2. 充当消息队列,实现消息传递;3. 存储各种数据类型,如字符串、散列和集合;4. 管理会话信息,确保可靠性和可用性;5. 限制请求速率,防止服务器超载等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

5738

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习