CLUSTER NODES

返回节点的集群配置。

语法

CLUSTER NODES

引入版本:3.0.0

复杂度摘要:O(N)

Redis 集群中的每个节点都有其当前集群配置的视图,由一组已知节点、我们与这些节点的连接状态、它们的标志、属性和分配的插槽等给出。

CLUSTER NODES 以序列化格式提供所有这些信息,即我们正在联系的节点的当前集群配置,该格式恰好与 Redis 集群本身使用的序列化格式完全相同,以便在磁盘上存储集群状态(但是磁盘上的集群状态在末尾附加了一些附加信息)。

请注意,通常愿意获取集群哈希槽和节点地址之间映射的客户端应使用 CLUSTER SHARDS。 CLUSTER NODES 提供更多信息,应用于管理任务、调试和配置检查。 redis-cli 也使用它来管理集群。

序列化格式

该命令的输出只是一个以空格分隔的 CSV 字符串,其中每一行代表集群中的一个节点。以下是 Redis 7.2.0 上的输出示例。

07c37dfeb235213a872192d90877d0cd55635b91 127.0.0.1:30004@31004,hostname4 slave e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 0 1426238317239 4 connected
67ed2db8d677e59ec4a4cefb06858cf2a1a89fa1 127.0.0.1:30002@31002,hostname2 master - 0 1426238316232 2 connected 5461-10922
292f8b365bb7edb5e285caf0b7e6ddc7265d2f4f 127.0.0.1:30003@31003,hostname3 master - 0 1426238318243 3 connected 10923-16383
6ec23923021cf3ffec47632106199cb7f496ce01 127.0.0.1:30005@31005,hostname5 slave 67ed2db8d677e59ec4a4cefb06858cf2a1a89fa1 0 1426238316232 5 connected
824fe116063bc5fcf9f4ffd895bc17aee7731ac3 127.0.0.1:30006@31006,hostname6 slave 292f8b365bb7edb5e285caf0b7e6ddc7265d2f4f 0 1426238317741 6 connected
e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 127.0.0.1:30001@31001,hostname1 myself,master - 0 0 1 connected 0-5460

每行由以下字段组成:

<id> <ip:port@cport[,hostname]> <flags> <master> <ping-sent> <pong-recv> <config-epoch> <link-state> <slot> <slot> ... <slot>

各字段含义如下:

  1. id:节点ID,40个字符的全局唯一字符串,在创建节点时生成,并且不会再次更改(除非使用CLUSTER RESET HARD)。
  2. ip:port@cport:客户端应联系以运行查询的节点地址以及使用的集群总线端口。当该节点 ID 的地址不再已知时,可以预期会出现 :0@0,因此用 noaddr 进行标记。
  3. hostname:人类可读的字符串,可以通过 cluster-annouce-hostname 设置进行配置。字符串的最大长度为 256 个字符,不包括空终止符。该名称可以包含 ASCII 字母数字字符、“-”和“.”仅有的。
  4. flags:逗号分隔标志列表:myself、master、slave、fail?、fail、handshake、noaddr、nofailover、noflags。标志的解释如下。
  5. master:如果节点是副本,并且主节点已知,则为主节点 ID,否则为“-”字符。
  6. ping-sent:发送当前活动 ping 的 Unix 时间,如果没有待处理的 ping,则为零,以毫秒为单位。
  7. pong-recv:最后接收到的 pong 的 Unix 时间,以毫秒为单位。
  8. config-epoch:当前节点(或当前主节点,如果该节点是副本)的配置纪元(或版本)。每次发生故障转移时,都会创建一个新的、唯一的、单调递增的配置纪元。如果多个节点声称服务相同的哈希槽,则具有较高配置纪元的节点获胜。
  9. link-state:用于节点到节点集群总线的链路状态。使用此链接与节点进行通信。可以是 connected 或 disconnected。
  10. slot:哈希槽编号或范围。从参数号 9 开始,但总共最多可以有 16384 个条目(从未达到限制)。这是该节点服务的哈希槽列表。如果条目只是一个数字,则按此进行解析。如果是范围,则格式为start-end,表示该节点负责从start到end的所有哈希槽,包括起始值和结束值。

标志是:

  • myself:您正在联系的节点。
  • master:节点是主节点。
  • slave:节点是副本。
  • fail?:节点处于PFAIL状态。您正在联系的节点无法访问,但逻辑上仍然可以访问(不处于 FAIL 状态)。
  • fail:节点处于FAIL状态。将 PFAIL 状态提升为 FAIL 的多个节点无法访问。
  • handshake:不受信任的节点,我们正在握手。
  • noaddr:该节点没有已知地址。
  • nofailover:副本不会尝试故障转移。
  • noflags:根本没有标志。

关于已发布配置纪元的注释

副本广播其主节点的配置纪元(以便在发现它们过时时获取 UPDATE 消息),因此副本的真实配置纪元(或多或少没有意义,因为它们不提供哈希槽)只能通过检查标记为 myself 的节点来获取,这是我们要求生成 CLUSTER NODES 输出的节点的条目。其他副本纪元反映了它们在心跳数据包中发布的内容,即它们当前正在复制的主副本的配置纪元。

特殊槽位入口

通常,与给定节点关联的哈希槽采用以下格式之一,如上所述:

  1. 单号:3894
  2. 范围:3900-4000

但是,节点哈希槽可以处于特殊状态,用于在节点重新启动后(AOF/RDB 文件中的键与节点哈希槽配置不匹配)或正在进行重新分片操作时传达错误。这两个状态是导入和迁移。

Redis 规范中解释了这两种状态的含义,但这两种状态的要点如下:

  • 导入 槽还不是节点哈希槽的一部分,正在进行迁移。仅当使用 ASK 命令时,节点才会接受有关这些插槽的查询。
  • 迁移 时隙已分配给该节点,但正在迁移到其他节点。如果命令中的所有键都已存在,则节点将接受查询,否则它将发出所谓的 询问重定向,以强制直接在导入节点中创建新键。

导入和迁移槽在 CLUSTER NODES 输出中发出,如下所示:

  • 导入槽位: [slot_number-<-importing_from_node_id]
  • 迁移槽: [slot_number->-migrating_to_node_id]

以下是导入和迁移插槽的几个示例:

  • [93-<-292f8b365bb7edb5e285caf0b7e6ddc7265d2f4f]
  • [1002-<-67ed2db8d677e59ec4a4cefb06858cf2a1a89fa1]
  • [77->-e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca]
  • [16311->-292f8b365bb7edb5e285caf0b7e6ddc7265d2f4f]

请注意,该格式没有任何空格,因此即使发出此特殊槽,CLUSTER NODES 输出格式也是纯 CSV,并以空格作为分隔符。然而,完整的格式解析器应该能够处理它们。

请注意:

  1. 迁移和导入槽仅添加到标记为myself的节点。该信息对于节点来说是本地的,针对其自己的时隙。
  2. 导入和迁移槽作为 附加信息 提供。如果节点分配了给定的哈希槽,它也将是哈希槽列表中的一个普通数字,因此不知道哈希槽迁移线索的客户端可以跳过这个特殊字段。

关于本手册页中使用的“slave”一词和命令名称的注释:从Redis 5开始,如果不是为了向后兼容,Redis项目不再使用slave这个词。不幸的是,在这个命令中,slave 这个词是协议的一部分,所以只有当这个 API 自然被弃用时,我们才能删除这种情况。

Redis Software 与 Redis Cloud 兼容性

Redis
软件
Redis
Cloud
说明
✅ 标准
✅ 主动-主动
✅ 标准
✅ 主动-主动
仅支持 OSS集群API。

返回值

RESP2

批量字符串回复:序列化集群配置。

RESP3

批量字符串回复:序列化集群配置。

资料来源:Redis 官方 CLUSTER NODES 文档;中文内容参考 Redis 文档许可。