FAILOVER

用法
FAILOVER [ TO host port [ FORCE ] ] [ ABORT ] [ TIMEOUT milliseconds ]
复杂度
O(1)
6.2.0
ACL 类别
@admin, @dangerous, @slow

此命令将启动当前连接的主节点与其某个副本之间的协调故障转移。故障转移不是同步的,而是由后台任务处理协调故障转移。它旨在限制故障转移期间集群的数据丢失和不可用性。此命令类似于非集群 Valkey 的 CLUSTER FAILOVER 命令,并且与 Sentinel 提供的故障转移支持相似。

默认故障转移流程的具体细节如下

  1. 主节点将内部启动一个 CLIENT PAUSE WRITE,这将暂停传入的写入并防止复制流中累积新数据。
  2. 主节点将监控其副本,等待副本指示其已完全消费复制流。如果主节点有多个副本,它将只等待第一个副本赶上。
  3. 主节点随后将自身降级为副本。这样做是为了防止任何双主节点情景。注意:主节点不会丢弃其数据,因此如果副本在下一步拒绝故障转移请求,它将能够回滚。
  4. 之前的主节点将向目标副本发送一个特殊的 PSYNC 请求,即 PSYNC FAILOVER,指示目标副本成为主节点。
  5. 一旦之前的主节点收到 PSYNC FAILOVER 被接受的确认,它将解除客户端的暂停。如果 PSYNC 请求被拒绝,主节点将中止故障转移并恢复正常。

INFO replication 中的字段 master_failover_state 可用于跟踪故障转移的当前状态,其值如下

  • no-failover:没有正在进行的协调故障转移。
  • waiting-for-sync:主节点正在等待副本赶上其复制偏移量。
  • failover-in-progress:主节点已将自身降级,并尝试将所有权移交给目标副本。

注意:在 failover-in-progress 阶段,主节点首先将自己降级为副本,然后通知副本将自己升级为主要节点。这两个步骤是异步过程,可能导致两个节点同时作为副本存在。在这种情况下,对于支持 REDIRECT(明确执行 CLIENT CAPA REDIRECT)的客户端,重定向结果可能会在两个副本之间来回跳动,直到目标副本完成将自身提升为主节点的过程。为避免这种情况,在 failover-in-progress 阶段,我们暂时暂停需要重定向的客户端,直到副本真正成为主节点,然后恢复执行。

如果之前的主节点连接了额外的副本,它们将继续从它作为链式副本进行复制。您需要手动在这些副本上执行 REPLICAOF 以开始直接从新的主节点复制。

可选参数

以下可选参数用于修改故障转移流程的行为

  • TIMEOUT 毫秒 -- 此选项允许指定主节点在 waiting-for-sync 状态下等待的最大时间,超过该时间将中止故障转移尝试并回滚。这旨在为 Valkey 集群可能遇到的写入中断设置上限。故障转移通常在不到一秒内发生,但如果写入流量很大或副本在消费复制流方面已经落后,则可能需要更长时间。如果未指定此值,则超时可被视为“无限”。

  • TO 主机 端口 -- 此选项允许通过主机和端口指定一个特定的副本进行故障转移。主节点将专门等待此副本赶上其复制偏移量,然后向其进行故障转移。

  • FORCE -- 如果同时设置了 TIMEOUTTO 选项,还可以使用 force 标志来指定一旦超时,主节点应故障转移到目标副本而不是回滚。这可用于在不丢失数据的情况下尽力尝试故障转移,但会限制写入中断。

注意:如果目标副本拒绝 PSYNC FAILOVER 请求,主节点将始终回滚。

故障转移中止

故障转移命令旨在确保数据不丢失和不损坏,但可能会遇到一些无法自动修复并可能陷入困境的情况。为此,存在 FAILOVER ABORT 命令,它将中止正在进行的故障转移并将主节点恢复到其正常状态。如果在 waiting-for-sync 状态下发出此命令,则没有副作用,但在 failover-in-progress 状态下可能会引入多主节点情景。如果遇到多主节点情景,您需要手动识别哪个主节点拥有最新数据并将其指定为主节点,并拥有其他副本。

注意:在故障转移进行中时,REPLICAOF 会被禁用,这是为了防止与故障转移发生意外交互,可能导致数据丢失。

RESP2/RESP3 回复

简单字符串回复:如果命令被接受且正在进行协调故障转移,则返回 OK。如果操作无法执行,则返回错误。