CLUSTER NODES

用法
CLUSTER NODES
复杂度
O(N),其中 N 是集群节点的总数
始于
3.0.0
ACL 类别
@slow

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

CLUSTER NODES 提供了所有这些信息,即我们正在联系的节点的当前集群配置,其序列化格式与 Valkey 集群本身用于将集群状态存储到磁盘的格式完全相同(不过磁盘上的集群状态末尾会附加一些额外信息)。

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

序列化格式

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

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 的地址不再已知时(因此被标记为 noaddr),可能会出现 :0@0
  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: 用于节点间集群总线链路的状态。使用此链路与节点通信。可以是 connecteddisconnected
  10. slot: 哈希槽编号或范围。从参数 9 开始,但总共最多可以有 16384 个条目(此限制从未达到)。这是此节点服务的哈希槽列表。如果条目只是一个数字,则按数字解析。如果是一个范围,则采用 start-end 形式,表示该节点负责从 startend(包括起始和结束值)的所有哈希槽。

标志如下

  • 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 文件中的键与节点哈希槽配置不匹配)或正在进行重新分片操作时通信错误。这两种状态是 importingmigrating

这两种状态的含义在 Valkey 规范中有解释,但其要点如下

  • Importing 槽位尚不属于节点的哈希槽,正在进行迁移。节点仅在使用 ASK 命令时才会接受关于这些槽位的查询。
  • Migrating 槽位已分配给节点,但正在迁移到其他节点。如果命令中的所有键都已存在,节点将接受查询,否则它将发出所谓的 ASK 重定向,以强制在新键创建时直接在 importing 节点中创建。

Importing 和 migrating 槽位在 CLUSTER NODES 输出中显示如下

  • Importing 槽位: [slot_number-<-importing_from_node_id]
  • Migrating 槽位: [slot_number->-migrating_to_node_id]

以下是 importing 和 migrating 槽位的一些示例

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

请注意,该格式没有任何空格,因此即使在发出这些特殊槽位时,CLUSTER NODES 输出格式仍是使用空格作为分隔符的普通 CSV。但是,一个完整的格式解析器应该能够处理它们。

请注意

  1. 迁移和 importing 槽位仅添加到标记为 myself 的节点。此信息是节点本地的,仅用于其自身的槽位。
  2. Importing 和 migrating 槽位作为附加信息提供。如果节点分配了给定的哈希槽,它也将作为哈希槽列表中的一个普通数字出现,因此不了解哈希槽迁移的客户端可以跳过这些特殊字段。

注意:如果不是为了向后兼容,Valkey 项目不再使用“master”和“slave”这两个词。不幸的是,在给定命令中,这些词是协议的一部分,因此只有当此 API 自然淘汰时,我们才能删除此类用法。

RESP2/RESP3 回复

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