CLUSTER FAILOVER

强制副本对其主节点执行手动故障转移。

语法

CLUSTER FAILOVER [FORCE | TAKEOVER]

引入版本:3.0.0

复杂度摘要:O(1)

此命令只能发送到 Redis 集群副本节点,强制副本启动其主实例的手动故障转移。

当您想要用其副本之一替换当前主数据库时,请使用手动故障转移,即使主数据库尚未发生故障。将命令发送到您要升级的副本。 Redis 集群通过确保副本在接管之前已处理主数据库的完整复制流,安全地执行故障转移并避免数据丢失。

手动故障转移的工作原理如下:

  1. 副本告诉主服务器停止处理客户端请求。1。主节点将其当前的复制偏移量发送到副本节点。
  2. 副本会等待,直到达到相同的复制偏移量,这确认它已处理来自主副本的所有数据。
  3. 副本启动故障转移,从大多数主节点获取新的配置纪元,并广播新配置。
  4. 旧主节点接收配置更新,解锁其客户端,并开始返回重定向消息,以便客户端连接到新主节点。

仅当新主节点处理完完整复制流后,此过程才会将客户端从旧主节点移动到新主节点。

可选参数

FORCE | TAKEOVER

FORCE 在不与主节点协调的情况下启动故障转移,以在主节点无法访问时使用。 TAKEOVER 另外还绕过了授权故障转移所需的集群共识。

详细说明

主节点宕机时的手动故障转移

命令行为可以通过两个选项进行修改:FORCE 和 TAKEOVER。

如果给出了 FORCE 选项,则副本不会与主服务器执行任何可能无法访问的握手,而只是从上面的第 4 点开始启动故障转移。当您想要在 primray 不再可达时启动手动故障转移时,这非常有用。

但是,使用 FORCE 要求大多数主副本都可用于授权故障转移并为将成为主副本的副本生成新的配置纪元。

没有集群共识的手动故障转移

在某些情况下,这还不够,并且您希望副本在不与集群其他部分达成任何协议的情况下进行故障转移。现实世界的用例是将不同数据中心中的副本大规模提升为主节点,以便执行数据中心切换,同时所有主节点都已关闭或隔离。

TAKEOVER 选项暗示了 FORCE 暗示的一切,但也不使用任何集群授权来进行故障转移。接收 CLUSTER FAILOVER TAKEOVER 的副本将改为:

  1. 单方面生成一个新的configEpoch,仅获取当前可用的最大历元,并且如果其本地配置历元还不是最大的话则递增它。
  2. 为其自身分配其主节点的所有哈希槽,并将新配置传播到尽快可达的每个节点,并最终传播到每个其他节点。

请注意,TAKEOVER 违反了 Redis 集群的最后故障转移获胜原则,因为副本生成的配置纪元在多个方面违反了配置纪元的正常生成:

  1. 不能保证它实际上是更高的配置纪元,因为,例如,我们可以在少数情况下使用 TAKEOVER 选项,也不会执行任何消息交换来生成新的配置纪元。
  2. 如果我们生成的配置纪元恰好与另一个实例发生冲突,最终我们的配置纪元或具有相同纪元的另一个实例将使用 配置epoch碰撞解决算法 移走。

因此,应谨慎使用 TAKEOVER 选项。

实施细节及注意事项

  • 除非指定了 TAKEOVER 选项,否则 CLUSTER FAILOVER 不会同步执行故障转移。它仅安排手动故障转移,绕过故障检测阶段。
  • OK 回复并不能保证故障转移一定会成功。
  • 仅当集群中的大多数主节点都将其称为副本时,副本才能升级为主节点。如果副本是刚刚添加到集群中的新节点(例如升级后),则集群中的所有主节点可能还不知道它。要检查主节点是否知道新副本,您可以将 CLUSTER NODES 或 CLUSTER REPLICAS 发送到每个主节点,并检查它是否显示为副本,然后再将 CLUSTER FAILOVER 发送到副本。
  • 要检查故障转移是否确实发生,您可以使用 ROLE、INFO REPLICATION(成功故障转移后指示“role:master”)或 CLUSTER NODES 来验证发送命令后集群的状态是否已更改。
  • 要检查故障转移是否失败,请检查副本日志中的 Manual failover timed out,如果副本在几秒钟后放弃,则会记录该日志。

Redis Software 与 Redis Cloud 兼容性

Redis
软件
Redis
Cloud
说明
❌ 标准
❌主动-主动
❌ 标准
❌主动-主动

返回值

RESP2

简单字符串回复:如果命令被接受并且将尝试手动故障转移,则为 OK。如果操作无法执行,例如,如果客户端连接到已经是主节点的节点,则会出现错误。

RESP3

简单字符串回复:如果命令被接受并且将尝试手动故障转移,则为 OK。如果操作无法执行,例如,如果客户端连接到已经是主节点的节点,则会出现错误。

资料来源:Redis 官方 CLUSTER FAILOVER 文档;中文内容参考 Redis 文档许可。