群集节点
CLUSTER NODES
- 从以下位置开始可用:
- 3.0.0
- 时间复杂度:
- O(N),其中 N 是 Cluster 节点的总数
- ACL 类别:
-
@slow
,
Redis 集群中的每个节点都有其当前集群配置的视图, 由已知节点的集合给出,我们与此类节点的连接状态 节点、它们的标志、属性和分配的插槽,等等。
CLUSTER NODES
提供所有这些信息,即当前集群
我们正在联系的节点的配置,采用序列化格式
恰好和 Redis Cluster 本身在
order 将群集状态存储在磁盘上(但是,磁盘上的群集状态
在末尾附加了一些额外的信息)。
请注意,通常客户端愿意在 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>
每个字段的含义如下:
id
:节点 ID,一个 40 个字符的全局唯一字符串,在创建节点时生成,并且永远不会再次更改(除非CLUSTER RESET HARD
)。ip:port@cport
:客户端运行查询时应联系的节点地址,以及使用的集群总线端口。:0@0
当此节点 ID 的地址不再已知时,可以预期,因此标记为noaddr
.hostname
:一个人类可读的字符串,可以通过cluster-annouce-hostname
设置。字符串的最大长度为 256 个字符,不包括 null 终止符。名称只能包含 ASCII 字母数字字符、“-”和“.”。flags
:逗号分隔的标志列表:myself
,master
,slave
,fail?
,fail
,handshake
,noaddr
,nofailover
,noflags
.标志说明如下。master
:如果节点是副本,并且主节点已知,则为主节点 ID,否则为“-”字符。ping-sent
:发送当前活动 ping 的 Unix 时间,如果没有挂起的 ping,则为零,以毫秒为单位。pong-recv
:收到最后一个 pong 的 Unix 时间,以毫秒为单位。config-epoch
:当前节点(如果节点是副本,则为当前主节点)的配置纪元(或版本)。每次进行故障转移时,都会创建一个新的、唯一的、单调递增的配置 epoch。如果多个节点声称提供相同的哈希槽,则具有较高配置 epoch 的节点获胜。link-state
:用于节点到节点集群总线的链路的状态。使用此链接与节点通信。可以是connected
或disconnected
.slot
:哈希槽编号或范围。从参数编号 9 开始,但总共可能有多达 16384 个条目(从未达到限制)。这是此节点提供的哈希槽列表。如果条目只是一个数字,则按此方式进行解析。如果它是一个范围,则它采用start-end
,这意味着该节点负责start
自end
包括 Start 和 End 值。
标志包括:
myself
:您正在联系的节点。master
:Node 是主节点。slave
:Node 是一个副本。fail?
:节点位于PFAIL
州。无法访问您正在联系的节点,但在逻辑上仍可访问(不在FAIL
state) 的 S Sfail
:节点位于FAIL
州。对于提升PFAIL
state 设置为FAIL
.handshake
:不受信任的节点,我们正在握手。noaddr
:此节点的地址未知。nofailover
:副本不会尝试故障转移。noflags
:完全没有标志。
关于已发布配置 epoch 的说明
副本广播其主节点的配置 epoch(为了获得UPDATE
message (如果发现它们已过时),则
replica (这或多或少没有意义,因为它们不提供哈希槽)
只能通过检查标记为myself
,即
我们要求生成的节点CLUSTER NODES
输出。另一个
replica epoch 反映它们在心跳数据包中发布的内容,即
配置纪元。
特殊插槽条目
通常,与给定节点关联的哈希槽采用以下格式之一, 如上所述:
- 单号:3894
- 范围:3900-4000
但是,节点哈希槽可以处于特殊状态,用于在节点重启后(AOF/RDB 文件中的键与节点哈希槽配置不匹配)或正在进行重新分片作时传达错误。这两个状态是 import 和 migating。
Redis 规范中解释了这两种状态的含义,但这两种状态的要点如下:
- 导入 slot 还不是 nodes 哈希 slot 的一部分,正在进行迁移。仅当
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,带有空格作为分隔符,即使发出此特殊槽也是如此。但是,该格式的完整解析器应该能够处理它们。
请注意:
- 迁移槽和导入槽仅添加到标记为
myself
.此信息是节点自身插槽的本地信息。 - 导入和迁移槽作为附加信息提供。如果节点分配了给定的哈希槽,它也将是哈希槽列表中的一个普通数字,因此不知道哈希槽迁移的客户端可以跳过这个特殊字段。
关于本手册页和命令名称中使用的单词 slave 的说明:从 Redis 5 开始,如果不是为了向后兼容,Redis 项目不再使用单词 slave。不幸的是,在这个命令中,slave 这个词是协议的一部分,所以只有当这个 API 被自然弃用时,我们才能删除此类事件。