CLUSTER NODES

语法
CLUSTER NODES
可用版本
3.0.0
时间复杂度
O(N),其中 N 是集群节点的总数
ACL 类别
@slow,

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

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

请注意,通常情况下,希望获取集群哈希槽位与节点地址之间映射关系的客户端应该使用 CLUSTER SLOTS 而不是 CLUSTER NODESCLUSTER 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-announce-hostname 设置配置的人类可读字符串。该字符串的最大长度为 256 个字符,不包括空终止符。名称只能包含 ASCII 字母数字字符、'-' 和 '.'。
  4. flags:一个逗号分隔的标志列表:myselfmasterslavefail?failhandshakenoaddrnofailovernoflags。标志将在下面解释。
  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 的所有哈希槽位,包括 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 文件中的键与节点哈希槽位配置之间不匹配)或正在进行重新分片操作时传达错误。这两个状态是**导入**和**迁移**。

这两个状态的含义在 Redis 规范中有所解释,但这两个状态的要点如下:

  • **导入**的槽位尚未成为节点哈希槽位的一部分,正在进行迁移。节点只有在使用ASK命令时才会接受关于这些槽位的查询。
  • **迁移**的槽位已分配给节点,但正在迁移到其他节点。如果命令中的所有键都已存在,节点将接受查询,否则它将发出所谓的**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 时才能删除这些出现的地方。

RESP2/RESP3 回复

批量字符串回复:序列化后的集群配置。
RATE THIS PAGE
Back to top ↑