Nightingale 集成 Redis 监控:基于 Categraf 的 info 采集、多实例与集群监控完整指南
2026/9/15 19:30:24 网站建设 项目流程

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_memoryredis_connected_clientsredis_uptime_in_seconds),再统一上报到 Nightingale。这一点可以从仓库自带的监控大盘得到印证:integrations/Redis/dashboards/redis_by_categraf.json中的所有面板查询都基于redis_前缀指标,例如redis_uptime_in_secondsredis_connected_clientsredis_used_memoryredis_total_commands_processedredis_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" }

各字段含义:

配置项说明
addressRedis 实例地址,格式ip:port
usernameRedis 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_tlstls_min_version(默认 "1.2")、tls_catls_certtls_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 raterate(redis_evicted_keys[5m]) / sum without (db) (redis_keyspace_keys) > 0.1key 驱逐比例过高,说明内存接近上限
High Redis memory usage rateredis_maxmemory > 0 and (redis_used_memory / redis_maxmemory) > 0.85内存使用率超过 85%
High Redis Ping latency (above 100 milliseconds)redis_ping_use_seconds > 0.1PING 往返耗时超过 100ms,可能存在阻塞
Low Redis hit raterate(redis_keyspace_hits[5m]) / (rate(redis_keyspace_misses[5m]) + rate(redis_keyspace_hits[5m])) < 0.9缓存命中率低于 90%
Redis connection refusedrate(redis_rejected_connections[5m]) > 0出现连接被拒绝(如达到 maxclients)
Redis has just been restarted, please be awareredis_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,可按采集方案选用:

  1. 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。
  2. integrations/Redis/dashboards/FilterByAddress.json:面板结构与上一套一致,但改用address标签过滤(变量label_values(redis_uptime_in_seconds, address)),适用于未配置instance标签的采集端。
  3. integrations/Redis/dashboards/redis_by_exporter.json:面向redis_exporter采集方案,指标为 exporter 风格(如redis_memory_used_bytesredis_commands_processed_totalredis_db_keys),同样按instance过滤。

将大盘 JSON 导入 Nightingale(配置好 Prometheus 数据源变量$prom)后,即可在页面上直观查看每个 Redis 实例的运行状态。这与 README 中"建议通过 labels 配置 instance 标签以便复用监控大盘"的建议形成闭环:大盘按标签过滤 → 采集端按标签打标 → 实例维度可视化。

快速落地 Checklist

结合上述内容,接入 Nightingale Redis 监控的完整流程可归纳为:

  1. 在采集端编写conf/input.redis/redis.toml,为每个 Redis 实例配置一个[[instances]]块(address+username/password+ 全局唯一的instance标签);
  2. 集群场景:把集群内所有节点全部列入instances,并附加redis_clus标签标识集群归属;
  3. Sentinel 场景:另配置redis_sentinel插件,servers使用[protocol://][:password]@address[:port]格式;
  4. 需要 TLS 时,在实例上开启use_tls并配置证书相关参数;
  5. 在 Nightingale 中导入 redis_by_categraf.json(或 FilterByAddress 版本)大盘查看数据;
  6. 导入并启用 redis_by_categraf.json 中的告警规则,结合注解中的排障动作处理告警。

【免费下载链接】nightingaleNightingale is to monitoring and alerting what Grafana is to visualization.项目地址: https://gitcode.com/GitHub_Trending/ni/nightingale

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询