CLUSTER NODES
CLUSTER NODES
- 可用版本
- Redis 开源版 3.0.0
- 时间复杂度
- O(N),其中 N 是集群节点的总数
- ACL 类别
-
@slow
,
Redis Cluster 中的每个节点都有其对当前集群配置的视图,该视图由已知节点集、与这些节点的连接状态、它们的标志、属性和分配的槽位等组成。
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>
每个字段的含义如下
id
:节点 ID,一个 40 个字符的全局唯一字符串,在节点创建时生成且永不更改(除非使用CLUSTER RESET HARD
)。ip:port@cport
:客户端应联系以运行查询的节点地址,以及所使用的集群总线端口。当此节点 ID 的地址不再已知时,可能会出现:0@0
,因此带有noaddr
标志。hostname
:可通过cluster-announce-hostname
设置配置的人类可读字符串。字符串的最大长度为 256 个字符(不包括空终止符)。名称只能包含 ASCII 字母数字字符、'-' 和 '.'。flags
:逗号分隔的标志列表:myself
、master
、slave
、fail?
、fail
、handshake
、noaddr
、nofailover
、noflags
。标志的解释如下。master
:如果节点是副本且已知主节点,则为主节点 ID,否则为“-”字符。ping-sent
:发送当前活跃 ping 的 Unix 时间(毫秒),如果没有待处理的 ping,则为零。pong-recv
:接收到最后一个 pong 的 Unix 时间(毫秒)。config-epoch
:当前节点的配置纪元(或版本)(如果是副本,则为其当前主节点的配置纪元)。每次发生故障转移时,都会创建一个新的、唯一的、单调递增的配置纪元。如果多个节点声称服务相同的哈希槽位,则具有较高配置纪元的节点获胜。link-state
:用于节点间集群总线的链接状态。使用此链接与节点通信。可以是connected
(已连接)或disconnected
(已断开连接)。slot
:一个哈希槽位编号或范围。从参数 9 开始,但总共可能有高达 16384 个条目(未曾达到过此限制)。这是此节点服务的哈希槽位列表。如果条目只是一个数字,则按其解析。如果是一个范围,则格式为start-end
,表示该节点负责从start
到end
(包括start
和end
值)的所有哈希槽位。
标志如下
myself
:你正在连接的节点。master
:节点是主节点。slave
:节点是副本。fail?
:节点处于PFAIL
状态。对于你正在连接的节点来说不可达,但逻辑上仍然可达(未处于FAIL
状态)。fail
:节点处于FAIL
状态。对于将PFAIL
状态提升为FAIL
的多个节点来说不可达。handshake
:不受信任的节点,正在进行握手。noaddr
:此节点没有已知地址。nofailover
:副本不会尝试故障转移。noflags
:没有任何标志。
关于发布的配置纪元的注意事项
副本广播它们主节点的配置纪元(以便在发现其过时时接收 UPDATE
消息),因此副本的实际配置纪元(或多或少没有意义,因为它们不服务哈希槽位)只能通过检查标记为 myself
的节点获取,这是我们请求生成 CLUSTER NODES
输出的节点的条目。其他副本的纪元反映了它们在心跳包中发布的信息,即它们当前正在复制的主节点的配置纪元。
特殊槽位条目
通常与给定节点关联的哈希槽位采用以下格式之一,如上文所述
- 单个数字:3894
- 范围:3900-4000
然而,节点哈希槽位可能处于特殊状态,用于在节点重启后(AOF/RDB 文件中的键与节点哈希槽位配置不匹配)或正在进行重新分片操作时传达错误。这两种状态是 **importing**(导入中)和 **migrating**(迁移中)。
这两种状态的含义在 Redis Specification 中有解释,但这两种状态的要点如下
- **导入中** 的槽位尚未成为节点哈希槽位的一部分,正在进行迁移。节点只有在使用
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 自然废弃时,我们才能移除此类用法。