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