FAILOVER
FAILOVER [TO host port [FORCE]] [ABORT] [TIMEOUT milliseconds]
- 可用版本
- Redis Open Source 6.2.0
- 时间复杂度
- O(1)
- ACL 类别
-
@admin
,@slow
,@dangerous
,
该命令将在当前连接的主节点与其一个副本之间启动协调故障转移。故障转移不是同步的,而是由一个后台任务来处理协调故障转移。它旨在限制集群在故障转移期间的数据丢失和不可用性。该命令类似于非集群 Redis 的 CLUSTER FAILOVER
命令,类似于 sentinel 提供的故障转移支持。
默认故障转移流程的具体细节如下:
- 主节点将在内部启动
CLIENT PAUSE WRITE
,这将暂停传入的写入并防止新数据在复制流中累积。 - 主节点将监视其副本,等待副本指示其已完全消费复制流。如果主节点有多个副本,它将只等待第一个副本赶上。
- 然后主节点将把自己降级为副本。这样做是为了防止任何双主节点场景。注意:主节点不会丢弃其数据,因此如果副本在下一步拒绝故障转移请求,它将能够回滚。
- 前主节点将向目标副本发送一个特殊的 PSYNC 请求,即
PSYNC FAILOVER
,指示目标副本成为主节点。 - 一旦前主节点收到确认
PSYNC FAILOVER
已被接受,它将解除客户端暂停。如果 PSYNC 请求被拒绝,主节点将中止故障转移并恢复正常状态。
INFO replication
中的 master_failover_state
字段可用于跟踪当前的故障转移状态,其值如下:
no-failover
: 没有正在进行的协调故障转移。waiting-for-sync
: 主节点正在等待副本赶上其复制偏移量。failover-in-progress
: 主节点已将自身降级,并正尝试将所有权移交给目标副本。
如果前主节点连接了额外的副本,它们将继续作为链式副本从它复制数据。您需要手动在这些副本上执行 REPLICAOF
以直接从新主节点复制。
可选参数
以下可选参数用于修改故障转移流程的行为:
-
TIMEOUT
毫秒 -- 此选项允许指定主节点在waiting-for-sync
状态下等待的最大时间,超过此时间后将中止故障转移尝试并回滚。这旨在为 Redis 集群可能经历的写入中断设置上限。故障转移通常在不到一秒的时间内发生,但如果写入流量很大或副本在消费复制流方面已经落后,则可能需要更长时间。如果未指定此值,则超时可被视为“无限”。 -
TO
主机 端口 -- 此选项允许通过指定副本的主机和端口来指定要故障转移到的特定副本。主节点将专门等待此副本赶上其复制偏移量,然后故障转移到它。 -
FORCE
-- 如果同时设置了TIMEOUT
和TO
选项,也可以使用 force 标志来指定,一旦超时时间到,主节点应故障转移到目标副本而不是回滚。这可用于在没有数据丢失的情况下尽力进行故障转移,但限制写入中断。
注意:如果目标副本拒绝了 PSYNC FAILOVER
请求,主节点将始终回滚。
中止故障转移
故障转移命令旨在确保数据不丢失和不受损坏,但可能会遇到一些无法自动修复并可能卡住的场景。为此,存在 FAILOVER ABORT
命令,它将中止正在进行的故障转移并将主节点返回其正常状态。如果在 waiting-for-sync
状态下发出此命令则没有副作用,但在 failover-in-progress
状态下可能引入双主节点场景。如果遇到双主节点场景,您将需要手动确定哪个主节点具有最新数据,并将其指定为主节点,并将其他节点设为副本。
注意:在故障转移进行期间,REPLICAOF
被禁用,这是为了防止与故障转移发生意外交互,从而可能导致数据丢失。
RESP2/RESP3 回复
简单字符串回复:如果命令被接受且正在进行协调故障转移,则返回OK
。如果操作无法执行,则返回错误。