集群节点

Syntax
CLUSTER NODES
Available since:
3.0.0
Time complexity:
O(N) where N is the total number of Cluster nodes
ACL categories:
@slow,

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

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

请注意,通常希望获取集群哈希槽和节点地址之间映射的客户端应使用CLUSTER SLOTS代替。 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: 客户端应联系的节点地址以运行查询,以及使用的集群总线端口。 :0@0 当此节点ID的地址不再已知时,可以预期,因此标记为 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: 用于节点到节点集群总线的链接状态。使用此链接与节点通信。可以是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文件中的键与节点哈希槽配置不匹配)或在重新分片操作进行时传达错误。这两种状态是导入中迁移中

这两种状态的含义在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 回复

Bulk string reply: the serialized cluster configuration.
RATE THIS PAGE
Back to top ↑