故障转移
FAILOVER [TO host port [FORCE]] [ABORT] [TIMEOUT milliseconds]
- 可用时间
- 6.2.0
- 时间复杂度
- O(1)
- ACL 类别
-
@admin
,@slow
,@dangerous
,
此命令将在当前连接的主服务器与其一个副本之间启动协调故障转移。故障转移不是同步的,而是一个后台任务将处理协调故障转移。它旨在限制故障转移期间集群的数据丢失和不可用性。此命令类似于非集群 Redis 的 CLUSTER FAILOVER
命令,类似于哨兵提供的故障转移支持。
默认故障转移流程的具体细节如下
- 主服务器将在内部启动
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
。如果操作无法执行,则为错误。