Nightingale 集成 Redis 监控:基于 Categraf 的 info 采集、多实例与集群监控完整指南
【免费下载链接】nightingaleNightingale is to monitoring and alerting what Grafana is to visualization.项目地址: https://gitcode.com/GitHub_Trending/ni/nightingale
本指南讲解 Nightingale 生态中 Redis 监控插件的使用方式:监控 agent(Categraf)通过连接 Redis 实例执行info命令,解析返回结果后整理成监控数据上报,配合仓库内置的告警规则与监控大盘,即可快速落地 Redis 的可用性、性能与容量监控。读完本文,你将掌握 Redis 插件的最小配置、多实例扩展、集群与 Sentinel 的监控思路,以及告警规则和大盘的使用方法。
Redis 监控的核心原理
仓库内 integrations/Redis/markdown/README.md 对监控原理的描述非常精炼:连上 Redis,执行info命令,解析结果,整理成监控数据上报。
info是 Redis 自带的诊断命令,返回服务端运行时状态,按 section 组织成key:value文本块,例如:
# Server redis_version:7.0.12 uptime_in_seconds:86400 # Clients connected_clients:32 # Memory used_memory:1048576 maxmemory:0 # Stats total_commands_processed:1024000 keyspace_hits:9000 keyspace_misses:1000 expired_keys:50 evicted_keys:2 # Keyspace db0:keys=100,expires=50,avg_ttl=0监控插件周期性连接 Redis 实例、执行info、把上述指标行解析为带redis_前缀的时序指标(如redis_used_memory、redis_connected_clients、redis_uptime_in_seconds),再统一上报到 Nightingale。这一点可以从仓库自带的监控大盘得到印证:integrations/Redis/dashboards/redis_by_categraf.json中的所有面板查询都基于redis_前缀指标,例如redis_uptime_in_seconds、redis_connected_clients、redis_used_memory、redis_total_commands_processed、redis_keyspace_hits/misses等。
插件配置文件与最小可用配置
Redis 插件的配置位于conf/input.redis/redis.toml(仓库内的示例文件为 integrations/Redis/collect/redis/redis.toml)。最简单的配置如下:
[[instances]] address = "127.0.0.1:6379" username = "" password = "" labels = { instance="n9e-10.23.25.2:6379" }各字段含义:
| 配置项 | 说明 |
|---|---|
address | Redis 实例地址,格式ip:port |
username | Redis 6.0+ 的 ACL 用户名,无则留空 |
password | 访问密码,无则留空 |
labels | 附加维度标签,官方强烈建议配置instance标签 |
仓库示例文件还展示了一批可选配置项:
# # collect interval # interval = 15 [[instances]] # address = "127.0.0.1:6379" # username = "" # password = "" # pool_size = 2 # # Optional. Specify redis commands to retrieve values # commands = [ # {command = ["get", "sample-key1"], metric = "custom_metric_name1"}, # {command = ["get", "sample-key2"], metric = "custom_metric_name2"} # ] # # interval = global.interval * interval_times # interval_times = 1 # important! use global unique string to specify instance # labels = { instance="n9e-10.2.3.4:6379" } ## Optional TLS Config # use_tls = false # tls_min_version = "1.2" # tls_ca = "/etc/categraf/ca.pem" # tls_cert = "/etc/categraf/cert.pem" # tls_key = "/etc/categraf/key.pem" ## Use TLS but skip chain & host verification # insecure_skip_verify = true这些可选参数的作用:
interval:采集周期(秒),不配置时沿用全局采集间隔;pool_size:与 Redis 建立连接时的连接池大小,默认 2;commands:插件额外支持的自定义命令采集能力,可对指定的 key 执行 Redis 命令并把返回值注册为自定义指标。例如{command = ["get", "sample-key1"], metric = "custom_metric_name1"}会把GET sample-key1的返回值上报为名为custom_metric_name1的指标,适用于采集业务侧自定义计数器的场景;interval_times:本实例的采集间隔倍率,实际采集周期 = 全局间隔 ×interval_times;labels:附加维度标签,注释中特别强调important! use global unique string to specify instance(务必使用全局唯一的字符串标识实例);- TLS 配置:
use_tls、tls_min_version(默认 "1.2")、tls_ca、tls_cert、tls_key,用于对 Redis 开启 TLS 加密的场景;insecure_skip_verify = true可跳过证书链与主机名校验。
多实例监控:用多个 instances 扩展
监控多个 Redis 实例时,只需要在同一个redis.toml里追加多个[[instances]]块即可:
[[instances]] address = "10.23.25.2:6379" username = "" password = "" labels = { instance="n9e-10.23.25.2:6379" } [[instances]] address = "10.23.25.3:6379" username = "" password = "" labels = { instance="n9e-10.23.25.3:6379" }每个[[instances]]块对应一个独立的 Redis 连接与采集任务,agent 会分别连接各地址执行info并各自上报指标。
为什么强烈建议配置instance标签?文档中的原话是:建议通过 labels 配置附加一个 instance 标签,便于后面复用监控大盘。仓库内的大盘 integrations/Redis/dashboards/redis_by_categraf.json 正是通过instance标签做面板过滤的:其变量定义label_values(redis_uptime_in_seconds, instance)直接枚举所有上报的instance值,各面板查询均形如redis_used_memory{instance=~"$instance"}。也就是说,只要你在采集端把instance标签配成全局唯一值(例如n9e-10.23.25.2:6379),导入大盘后就能在下拉框里选择对应实例查看数据,无需改动大盘。
顺带说明:仓库还提供了一套按address标签过滤的大盘 integrations/Redis/dashboards/FilterByAddress.json,其变量定义为label_values(redis_uptime_in_seconds, address)。如果你的采集配置里没有(或不想用)instance标签,可以选用这套大盘并保证指标带有address标签。
Redis 集群如何监控
文档给出了明确的结论:Redis 集群的监控,本质还是逐个监控集群中的每个 Redis 实例。
原因在于 Redis 集群的访问模型:对于一个由 3 个实例组成的集群,业务应用发起请求时可能随机命中任意一个实例,这对业务无影响;但监控端需要拿到所有实例的数据,才能完整评估集群的状态(每个节点的内存、连接数、key 分布、主从延迟等)。因此采集配置必须把集群内每个实例都列入instances,agent 会分别连接全部节点抓取info数据。
当多个实例组成集群时,还需要一个标识来区分"这批实例属于哪个集群"。实现方式同样是利用labels:给每个实例附加一个redis_clus标签,值为集群名字即可。例如:
[[instances]] address = "10.23.25.2:6379" labels = { instance="n9e-10.23.25.2:6379", redis_clus="prod-cache-cluster" } [[instances]] address = "10.23.25.3:6379" labels = { instance="n9e-10.23.25.3:6379", redis_clus="prod-cache-cluster" } [[instances]] address = "10.23.25.4:6379" labels = { instance="n9e-10.23.25.4:6379", redis_clus="prod-cache-cluster" }之后在 Nightingale 中即可通过redis_clus="prod-cache-cluster"把集群维度聚合起来做查询与告警(例如按集群汇总sum by (redis_clus)内存、key 总量等)。
监控 Redis Sentinel
仓库中 Redis 集成还包含 Sentinel 监控插件,配置示例见 integrations/Redis/collect/redis_sentinel/redis_sentinel.toml。该插件 fork 自 telegraf 的redis_sentinel输入插件,用于采集 Sentinel 节点的状态信息。
Sentinel 插件的配置格式略有不同,servers支持[protocol://][:password]@address[:port]形式:
# # collect interval # interval = 15 [[instances]] # [protocol://][:password]@address[:port] # e.g. servers = ["tcp://localhost:26379"] servers = [] # # interval = global.interval * interval_times # interval_times = 1 # add some dimension data by labels # labels = {} ## Optional TLS Config # use_tls = false # tls_min_version = "1.2" # tls_ca = "/etc/categraf/ca.pem" # tls_cert = "/etc/categraf/cert.pem" # tls_key = "/etc/categraf/key.pem" ## Use TLS but skip chain & host verification # insecure_skip_verify = true例如要监控本地 Sentinel 节点(默认端口 26379),配置为:
[[instances]] servers = ["tcp://localhost:26379"]与 Redis 插件一样,它也支持interval_times采集倍率、labels维度标签以及整套可选 TLS 配置。
开箱即用的告警规则
仓库在 integrations/Redis/alerts/redis_by_categraf.json 中为 Redis 监控预置了 6 条 PromQL 告警规则(默认disabled: 1,需在 Nightingale 中启用),每条规则都带有中文排障建议(annotations.action):
| 规则名称 | 核心 PromQL | 告警含义 |
|---|---|---|
| High Redis eviction rate | rate(redis_evicted_keys[5m]) / sum without (db) (redis_keyspace_keys) > 0.1 | key 驱逐比例过高,说明内存接近上限 |
| High Redis memory usage rate | redis_maxmemory > 0 and (redis_used_memory / redis_maxmemory) > 0.85 | 内存使用率超过 85% |
| High Redis Ping latency (above 100 milliseconds) | redis_ping_use_seconds > 0.1 | PING 往返耗时超过 100ms,可能存在阻塞 |
| Low Redis hit rate | rate(redis_keyspace_hits[5m]) / (rate(redis_keyspace_misses[5m]) + rate(redis_keyspace_hits[5m])) < 0.9 | 缓存命中率低于 90% |
| Redis connection refused | rate(redis_rejected_connections[5m]) > 0 | 出现连接被拒绝(如达到 maxclients) |
| Redis has just been restarted, please be aware | redis_uptime_in_seconds < 600 | 实例刚重启(运行不足 10 分钟),需关注冷启动 |
例如"内存使用率过高"规则的完整排障动作(来自规则注解)为:1)INFO memory确认used_memory_rss与碎片率mem_fragmentation_ratio,碎片高可开启activedefrag;2)用redis-cli --bigkeys / --memkeys定位大 key 并拆分或补 TTL;3)检查是否有未设过期时间的 key 持续堆积;4)确认maxmemory-policy后按需扩容内存或分片。这些告警规则已同步在 integrations/Redis/i18n/en_US.json 中提供英文排障文案,便于国际化场景使用。
另外,仓库还提供了面向redis_exporter采集方案的告警规则集 integrations/Redis/alerts/redis_by_exporter.json(规则名带- exporter后缀),其 PromQL 使用 exporter 风格的指标名,例如连接数规则为(redis_connected_clients / redis_config_maxclients) > 0.85、驱逐率规则为rate(redis_evicted_keys_total[5m]) / sum without (db) (redis_db_keys) > 0.1、平均命令耗时规则为sum without (cmd) (rate(redis_commands_duration_seconds_total[5m])) / rate(redis_commands_processed_total[5m]) > 0.25。如果你在环境中使用redis_exporter而非 Categraf 采集,可以直接选用这套规则。
开箱即用的监控大盘
仓库提供了三套 Redis 大盘 JSON,可按采集方案选用:
- integrations/Redis/dashboards/redis_by_categraf.json(Redis by instance):与 Categraf 插件指标配套,按
instance标签过滤。面板覆盖:Redis Uptime、Connected Clients、Memory Used、Max Memory Limit、Commands Executed / sec、Hits / Misses per Sec、Top Commands(topk(5, irate(redis_cmdstat_calls{...}[1m])),展示最热命令)、Total Items per DB(sum(redis_keyspace_keys) by (instance, db))、Expired / Evicted、Expiring vs Not-Expiring Keys、Network I/O。 - integrations/Redis/dashboards/FilterByAddress.json:面板结构与上一套一致,但改用
address标签过滤(变量label_values(redis_uptime_in_seconds, address)),适用于未配置instance标签的采集端。 - integrations/Redis/dashboards/redis_by_exporter.json:面向
redis_exporter采集方案,指标为 exporter 风格(如redis_memory_used_bytes、redis_commands_processed_total、redis_db_keys),同样按instance过滤。
将大盘 JSON 导入 Nightingale(配置好 Prometheus 数据源变量$prom)后,即可在页面上直观查看每个 Redis 实例的运行状态。这与 README 中"建议通过 labels 配置 instance 标签以便复用监控大盘"的建议形成闭环:大盘按标签过滤 → 采集端按标签打标 → 实例维度可视化。
快速落地 Checklist
结合上述内容,接入 Nightingale Redis 监控的完整流程可归纳为:
- 在采集端编写
conf/input.redis/redis.toml,为每个 Redis 实例配置一个[[instances]]块(address+username/password+ 全局唯一的instance标签); - 集群场景:把集群内所有节点全部列入
instances,并附加redis_clus标签标识集群归属; - Sentinel 场景:另配置
redis_sentinel插件,servers使用[protocol://][:password]@address[:port]格式; - 需要 TLS 时,在实例上开启
use_tls并配置证书相关参数; - 在 Nightingale 中导入 redis_by_categraf.json(或 FilterByAddress 版本)大盘查看数据;
- 导入并启用 redis_by_categraf.json 中的告警规则,结合注解中的排障动作处理告警。
【免费下载链接】nightingaleNightingale is to monitoring and alerting what Grafana is to visualization.项目地址: https://gitcode.com/GitHub_Trending/ni/nightingale
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考