*Redis failover 命令
*语法
FAILOVER [TO_ [FORCE]] [ABORT] [TIMEOUT_]
此命令将启动当前连接的主服务器与其副本之一之间的协调故障转移。 故障转移不是同步的,而是后台任务将处理协调故障转移。 它旨在限制故障转移期间的数据丢失和集群不可用性。 此命令类似于非集群 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 以开始直接从新主服务器复制。
*可选参数
以下可选参数用于修改故障转移流程的行为:
TIMEOUTmilliseconds -- 此选项允许指定主服务器在waiting-for-sync状态等待的最大时间,然后中止故障转移尝试并回滚。 这旨在设置 Redis 集群可以经历的写入中断的上限。 故障转移通常发生在不到一秒的时间内,但如果有大量写入流量或副本已经在消费复制流方面落后,则可能需要更长时间。 如果未指定此值,超时可以视为"无限"。TOHOST PORT -- 此选项允许指定一个特定的副本,通过其主机和端口,进行故障转移。主服务器将专门等待此副本赶上其复制偏移量,然后故障转移到它。FORCE-- 如果同时设置了TIMEOUT和TO选项,还可以使用 force 标志来指示一旦超时时间过去,主服务器应该故障转移到目标副本而不是回滚。 这可用于在限制写入中断的情况下,尽最大努力进行无数据丢失的故障转移。
注意:如果目标副本拒绝 PSYNC FAILOVER 请求,主服务器将始终回滚。
*故障转移中止
故障转移命令旨在安全地防止数据丢失和损坏,但可能会遇到某些无法自动修复的场景并可能卡住。
为此,存在 FAILOVER ABORT 命令,它将中止正在进行的故障转移并将主服务器恢复到其正常状态。
如果在 waiting-for-sync 状态发出,该命令没有副作用,但在 failover-in-progress 状态可能会引入多主服务器场景。
如果遇到多主服务器场景,您将需要手动识别哪个主服务器具有最新数据,并将其指定为主服务器,并让其他副本成为副本。
注意:在故障转移进行期间,REPLICAOF 被禁用,这是为了防止与故障转移的意外交互可能导致数据丢失。