Redis Cluster 的通信流程涉及多个关键环节,以下是其深入剖析:
-
载入配置文件
- 当 Redis 以集群模式启动时,会读取配置文件(通常为
redis.conf
)。在配置文件中,与集群相关的选项会被读取并启用,如cluster-enabled yes
表示启用集群模式。 - 关键配置项包括集群节点的 IP 地址、端口号、集群总线端口号(用于节点间通信)、集群配置文件路径(如果存在的话,用于持久化集群配置)等。
- 当 Redis 以集群模式启动时,会读取配置文件(通常为
-
节点握手
- 当一个节点启动时,它会尝试与集群中的其他节点进行握手,建立起彼此间的连接。
- 握手过程包括节点身份认证、交换集群配置信息(如节点ID、IP地址、端口、负责的槽位等)。
- 通过
CLUSTER MEET
命令或者自动发现机制(如通过共享的配置文件)建立连接。
-
Gossip 协议
- Redis Cluster 使用 Gossip 协议来传播节点状态信息。每个节点周期性地随机选择其他节点发送 gossip 消息,包括自己和邻居节点的状态信息。
- Gossip 消息包括:ping(保持心跳)、pong(回应 ping)、meet(新增节点)、fail(标记节点失败)、update(更新节点配置信息)等。
-
分配槽
- Redis Cluster 将数据分布在16384个槽位上,每个节点负责一部分槽位。
- 在集群初始化时,节点需要分配槽位。可以通过手动分配,也可以使用
redis-trib.rb
工具或CLUSTER ADDSLOTS
命令进行自动分配。 - 分配槽位完成后,客户端通过计算键的哈希值并模以槽位总数,来定位键所属的节点。
-
节点发现与槽位迁移
- 当新节点加入集群或已有节点离开时,集群会动态调整槽位分配。
- 如果一个节点离线或主观下线,其他节点通过 Gossip 协议感知并重新分配其负责的槽位。
- 当节点再次上线时,它会通过 Gossip 协议了解集群的最新状态,并可能进行槽位数据的迁移。
-
客户端与集群通信
- 客户端连接任意节点时,会收到一份完整的槽位映射表,此后客户端根据键的位置直接找到正确的节点进行操作。
- 对于跨槽位的操作(如集合操作中有键分布在不同节点),客户端会透明地处理这些操作,将命令转发到相应的节点。
在源码层面,上述流程涉及的关键文件主要有 cluster.c
和相关网络通信、数据结构处理的部分。在代码中,可以看到节点握手的实现、槽位管理、Gossip 机制的实现细节以及客户端命令如何在集群环境下的路由和执行。