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