RedisInsight连集群需手动开启Cluster模式并填入可通信的master节点地址;redis_exporter须启用--redis.cluster.enabled参数才能采集集群拓扑;Grafana中需用redis_cluster_node_role和redis_cluster_node_master_id等指标反映主从关系。

RedisInsight连不上集群:常见连接配置错在哪
RedisInsight 默认只认单节点,连集群必须显式开启集群模式。它不会自动发现 cluster nodes 列表,也不会帮你解析 redis.conf 里的 cluster-enabled yes —— 这个配置对客户端完全透明。
- 必须手动在 RedisInsight 的“Add Redis Database”里勾选
Cluster模式(不是默认选项) - 填写的 host:port 必须是集群中任意一个已上线且可通信的 master 节点,不能填 sentinel 地址或 proxy
- 如果集群启用了密码,得在
Password栏填入requirepass值;若用 ACL,账号需有cluster权限(如ACL SETUSER myuser on >mypass ~* &allcommands) - 防火墙常拦
CLUSTER NODES返回的内部 IP:确保所有节点返回的cluster nodes输出里,IP 是客户端能直连的地址(通过cluster-announce-ip或 bind + announce 配置修正)
Prometheus 抓不到 Redis 集群指标:exporter 怎么配才对
redis_exporter 默认以单实例模式运行,不主动执行 CLUSTER INFO 或 CLUSTER NODES,所以你看到的 metrics 全是单点数据,拓扑关系为零。
- 启动时必须加
--redis.cluster.enabled参数,否则它永远只连你给的那一个地址,不会做集群发现 - 它会自动向首个节点发
CLUSTER SLOTS,再逐个拨号采集每个 slot owner —— 所以所有 master 节点的地址都得能被 exporter 进程网络可达 - 若集群跨子网,注意
redis_exporter抓到的节点 IP 可能来自CLUSTER NODES输出,而那个 IP 不一定对外可访问;此时要配合--redis.addr显式映射(如--redis.addr=10.0.1.10:6379=192.168.5.10:6379) - 抓取间隔别设太短:
CLUSTER SLOTS+ N 次INFO是 O(N) 开销,30s 是安全下限
Grafana 面板看不到主从关系:哪些指标真正反映拓扑
Prometheus 里 redis_instance_info{role="master"} 或 redis_connected_clients 这类指标只能告诉你“这个实例是什么角色”,但无法表达“谁是谁的 slave”。
- 真正承载拓扑信息的是
redis_cluster_node_role(来自redis_exporterv1.30+)和redis_cluster_node_master_id—— 后者非空即表示该节点是 slave,值为对应 master 的 node id - 用
redis_cluster_nodes_count{role="master"}和redis_cluster_nodes_count{role="slave"}可快速核对数量是否匹配,避免漏节点 - 想画出连线图?Grafana 不支持原生拓扑图,得靠插件(如
grafana-polystat-panel)或导出到 Neo4j;更实际的做法是用redis_cluster_node_state == 1(online)过滤掉失效节点,再按redis_cluster_node_master_id分组聚合
为什么自定义面板总显示“部分节点离线”,但 redis-cli cluster nodes 没问题
这不是数据采集错了,而是时间窗口和状态判断逻辑不一致。Prometheus 抓取是周期性的,而 redis-cli cluster nodes 是瞬时快照。
-
redis_exporter对每个节点的连通性判断基于最后一次抓取是否成功;如果某个 slave 因 GC 暂停、慢日志阻塞或网络抖动错过一次 scrape,它的up就变 0,面板立刻标红 -
redis_cluster_node_state是从CLUSTER NODES解析来的字符串字段(如fail,handshake,noaddr),但 exporter 不会每秒刷新——它依赖 scrape 周期,中间状态就丢了 - 最容易被忽略的一点:Grafana 的
last()函数默认取最近 5m 内最后一个点,如果你的 scrape interval 是 30s,而某节点恰好在最近 5m 内断过 2 次,last()很可能返回 0,但它其实在 10 秒前已经恢复了
拓扑可视化真正的难点不在怎么画,而在怎么定义“此刻这个节点算不算在线”——监控系统的时间粒度、Redis 自身状态同步延迟、网络中间设备的干扰,三者叠加后,“在线”本身就成了一个带模糊边界的判断。










