cluster-announce-ip 172.30.0.101 # 节点对外广播的 IP 地址,用于集群间通信
cluster-announce-port 6379 # 节点对外广播的服务端口
cluster-announce-bus-port 16379 # 节点用于集群总线通信的端口
复制代码
1.3.2 编写 docker-compose.yml
首先创建网络,并将网段分配为 172.30.0.0/24。接下来设置每个节点,包括设置文件映射、端口映射以及容器的固定 IP 地址。设置固定 IP 地址是为了便于后续的观察和操作。端口映射可以选择设置或不设置,设置的目标是方便通过宿主机的 IP 加映射的端口进行访问,而通过容器自身的 IP 地址加默认端口 6379 也同样可以访问。
集群中的所有节点会通过定期发送心跳包来进行通信。
步调形貌1节点 A 向节点 B 发送 ping 包,节点 B 会返回一个 pong 包。ping 和 pong 除了消息范例不同外,其他内容相同,包罗集群设置信息(如节点 ID、所属分片、节点角色是主节点还是从节点、从节点的主节点 ID、持有的哈希槽位图等)。2每个节点每秒钟会随机向部分节点发送 ping 包,而不是向所有节点发送,避免当节点数量较多时心跳包过多。例如,在 9 个节点的集群中,如果每个节点都向其他所有节点发送心跳包,则会产生 72 组通信,且通信量随节点数按 N^2 增长。3当节点 A 向节点 B 发送 ping 包,但未能收到 B 的 pong 相应时,A 会尝试重置与 B 的 TCP 毗连。如果重置后仍然失败,A 会将 B 标志为 PFAIL 状态(即主观下线)。4A 将 B 标志为 PFAIL 后,会通过 Redis 内置的 Gossip 协议与其他节点通信,确认 B 的状态。每个节点维护自己的“下线列表”,但由于网络视角不同,各节点的下线列表大概有所不同。5如果 A 发现多数节点(超过集群总节点数的一半)也认为 B 是 PFAIL,则 A 会将 B 标志为 FAIL(即客观下线),并将此消息同步到其他节点,其他节点接收后也会将 B 标志为 FAIL。 至此,节点 B 被彻底判定为故障节点。在某些环境下,节点的故障大概会导致整个集群进入宕机状态(称为 fail 状态)。以下三种环境会导致集群宕机:第一,某个分片的所有主节点和从节点都故障;第二,某个分片的主节点故障,但没有从节点进行替补;第三,超过半数的主节点故障。集群的焦点原则是确保每个哈希槽(slots)都能正常工作,包管数据的存取功能不受影响。
1.3.5 故障迁移
当节点 B 故障,并且节点 A 将 B 的 FAIL 消息同步给集群中的其他节点时,根据 B 的角色处理方式不同:如果 B 是从节点,则无需进行故障迁移;如果 B 是主节点,则由 B 的从节点(如 C 和 D)触发故障迁移。故障迁移的过程是将从节点提升为主节点,以继续支持 Redis 集群的正常运行。
步调形貌1从节点会首先判断自己是否具有参选资格。如果从节点与主节点通信中断的时间超过设定阈值(数据差别过大),则失去竞选资格。2具有参选资格的从节点(如 C 和 D)会进入休眠状态一段时间。休眠时间由以下公式计算:500ms 底子时间 + [0, 500ms] 的随机时间 + 排名 * 1000ms。排名基于数据同步偏移量(offset),offset 值越大,排名越靠前(休眠时间越短)。3当某个从节点(如 C)的休眠时间竣事后,C 会向集群中的所有节点发起拉票哀求。只有主节点才有投票资格。4主节点会将自己的票投给 C(每个主节点只有 1 票)。当 C 得到的票数超过主节点总数的一半时,C 会被提升为新的主节点。C 随后会执行 slaveof no one,并指示 D 执行 slaveof C,完成主从切换。5C 会将自己成为主节点的信息同步给集群中的其他节点,所有节点都会更新其本地生存的集群结构信息。 1.3.6 集群扩容