
Redis很快。复盘会上解释为什么没人发现它宕机的那套说辞,就慢多了。
第一回合:“应该是网络的问题。”
第二回合:“有没有人查过Redis?”
第三回合:一位老哥打开终端,执行一条命令,人直接老了十岁。
MatrixSwarm的redis_watchdog就是这套流程的急救队。它盯着本地服务,检查TCP监听器或配置的socket路径,服务挂了能自动重启,有情况会呼叫相关人员。
省下来的时间,就是跳过那套猜谜仪式的功夫。
装上一个省心的小代理
在Phoenix的Swarm Workspace里,从Agent Palette把redis_watchdog加到跑Redis的Linux/systemd主机上。根据实际安装情况配置:
| 配置项 | 示例 | 说人话 |
|---|---|---|
| Service Name | redis-server |
跟你的systemd unit对上,有些机器上叫redis
|
| Redis Port | 6379 |
你期望监听的本地TCP端口 |
| Socket Path | /var/run/redis/redis-server.sock |
如果用socket部署就对上这个路径 |
| Check Interval (sec) | 10 |
多久检查一次 |
| Restart Limit | 3 |
连续多少次重启失败后触发阈值 |
| Alert To Role | hive.alert |
告警发送的目标服务角色 |
这些只是示例值,不是放之四海的标准答案。实现会通过常规路径检测Redis,所以确认一下你的包和目录结构能不能被识别。定制安装的话,实际验证一下,别光点头说“应该没问题”。
运行账户必须能检查systemd状态和本地监听器。重启用的是非交互式sudo授权的unit,所以给它分配刚好够用的restart权限就行。
然后配置你想要的告警转发。一个watchdog加一个可达的relay,就够构成一个人工通知通道了。不需要上来就排个委员会。
读懂各种状态标志
Redis watchdog把服务状态和可达性信号分开处理:
跟基于状态转换的Apache、MySQL、Nginx worker不同,Redis在后续轮询中,如果服务仍然down,可以再次进入重启流程。连续失败的restart命令会计入配置的阈值,然后disable guard会停止该agent实例的后续重启尝试。一次成功的restart命令会重置失败计数器。
恢复通知只在服务从down状态恢复后触发。当成服务状态报告看就行,别当成每条业务都能用上缓存的签字保证。服务在跑也还是可能触发单独的可达性告警。
另外,“socket存在”只是文件系统观察,“端口出现在监听列表”只是本地网络观察。两者都不是一次认证过的Redis对话。这个worker不用Redis PING作为健康判断依据。真需要这个保障的话,自己加一个合适的协议/应用层探针。
停着的赛车也有轮子。只是比赛日我们对它的要求不止于此。
带上黑匣子,别光带警报器
诊断是尽力而为:systemd status、可用的Redis CLI信息、以及最近的日志上下文。带认证的Redis、自定义端口、或TLS可能需要额外的诊断处理;基础CLI诊断调用不会自动继承你应用客户端的所有配置。
如果配了report_to_role消费者,可以接收结构化的排查数据。这个跟人工告警relay是分开的,简单的通知场景下可选。
Always alert on failure设置影响的是失败相关的通知,但别以为每个告警分支都受同一个全局冷却时间控制。特别是“服务在跑但不可达”的警告,每次轮询都可能重复。想清楚间隔和通道再选。你的手机应该汇报故障,不是来打鼓的。
任意watchdog都能用任意告警通道
这是全swarm通用的模式:Apache、MySQL、Nginx、Redis的watchdog都可以配合Slack、Discord、Telegram或email的告警relay混用。根据需要通知的人选通道。
用slack_relay、discord_relay、telegram_relay或email_send。Watchdog的alert_to_role通常指向hive.alert,这些relay提供的接口是hive.alert@cmd_send_alert_msg。
配置目标凭证、解决需要的Registry和签名分配、确保服务scope/routing把agent们连上。几个匹配的可达relay可以接收同一个告警。你的Redis告警可以同时到Slack、Telegram和email;不需要三套不同的watchdog实现再来一遍。
加密是relay上的选项,不是团队的迷信
Discord、Telegram和email支持可选的加密告警信封。在每个应该用加密的relay上,开启encrypt_alerts并提供分配好的包签名/加密密钥。单独配置包签名不会开启发出的平台消息加密。
开关名叫Encrypt Discord alert message、Encrypt Telegram alert message和Encrypt alert email subject and body。有正确的密钥,授权操作员可以用对应relay的Decrypt Message面板在Phoenix里读取编码后的告警。
加密封装失败时,relay不会悄悄把那个加密告警降级成明文发送。Email把告警的subject和body包进信封里;投递元数据仍然是可见的。Slack走普通HTTPS投递,这个实现里没有对应的MatrixSwarm告警载荷加密开关。
每个副本有独立设置。Discord加密而别处发明文副本,意思就是:一个加密副本、一个明文副本。在队车上画个锁头不意味着行李就安全了。
跑几圈练习赛
在测试主机上验证:正常服务/监听器检测、受控的服务down事件、重启权限和行为、服务在跑但不可达的情况、恢复报告、以及每个选定relay的投递。如果开了加密,也测一下解密。
持久化、备份和故障切换规划还是要放在该在的位置。服务重启不会恢复丢失的数据、不会选出集群leader、不会让一个没验证过的恢复计划突然变得天才。
Redis提供速度。Watchdog提供肩膀上那一下轻拍,省得维修区变成集体心理辅导。
永远争胜。让缓存保持快,让借口变得更短。