*Redis shutdown 命令

*语法

SHUTDOWN [NOSAVE | SAVE] [NOW] [FORCE] [ABORT]

该命令的行为如下:

  • 如果有任何副本在复制中滞后:
    • 通过执行带有 WRITE 选项的 CLIENT PAUSE 暂停尝试写入的客户端。
    • 等待最多配置的 shutdown-timeout(默认 10 秒)让副本赶上复制偏移量。
  • 停止所有客户端。
  • 如果至少配置了一个 保存点,则执行阻塞 SAVE。
  • 如果启用了 AOF,则刷新 Append Only File。
  • 退出服务器。

如果启用了持久化,此命令可确保 Redis 关闭时不会丢失任何数据。

注意:配置为不在磁盘上持久化的 Redis 实例(未配置 AOF,也没有 "save" 指令)在 SHUTDOWN 时不会转储 RDB 文件,因为通常您不希望仅用于缓存的 Redis 实例在关闭时阻塞。

另请注意:如果 Redis 收到 SIGTERMSIGINT 信号之一,则执行相同的关闭序列。另请参阅 信号处理

*修饰符

可以指定可选修饰符来更改命令的行为。具体来说:

  • SAVE 将强制进行数据库保存操作,即使没有配置保存点。
  • NOSAVE 将阻止数据库保存操作,即使配置了一个或多个保存点。
  • NOW 跳过等待滞后的副本,即绕过关闭序列中的第一步。
  • FORCE 忽略任何通常会阻止服务器退出的错误。有关详细信息,请参阅以下部分。
  • ABORT 取消正在进行的关闭,不能与其他标志组合使用。

*SHUTDOWN 失败的情况

当配置了保存点或指定了 SAVE 修饰符时,如果无法保存 RDB 文件,关闭可能会失败。然后,服务器将继续运行以确保不会丢失数据。可以使用 FORCE 修饰符绕过此问题,导致服务器无论如何都会退出。

当启用 Append Only File 时,关闭可能会失败,因为系统处于不允许安全地立即持久化到磁盘的状态。

通常,如果有一个 AOF 子进程正在执行 AOF 重写,Redis 将直接终止它并退出。但是,在某些情况下这样做是不安全的,除非指定了 FORCE 修饰符,否则 SHUTDOWN 命令将被拒绝并返回错误。这种情况发生在以下情况:

  • 用户刚刚打开了 AOF,服务器触发了第一次 AOF 重写以创建初始 AOF 文件。在这种情况下,停止将导致完全丢失数据集:一旦重新启动,服务器可能已启用 AOF 但没有任何 AOF 文件。
  • 启用了 AOF 的副本与其主节点重新连接,执行完全重新同步,并重新启动 AOF 文件,触发初始 AOF 创建过程。在这种情况下,不完成 AOF 重写是危险的,因为从主节点接收的最新数据集将丢失。新的主节点实际上可能是一个不同的实例(如果使用 REPLICAOFSLAVEOF 命令重新配置了副本),因此完成 AOF 重写并从正确的数据集开始(服务器终止时内存中的数据集)非常重要。

在某些情况下,我们只想尽快终止 Redis 实例,无论其内容如何。在这种情况下,可以使用命令 SHUTDOWN NOW NOSAVE FORCE。在 7.0 之前的版本中,没有 NOWFORCE 标志,正确的命令组合是发送 CONFIG appendonly no 后跟 SHUTDOWN NOSAVE。第一个命令将关闭 AOF(如果需要),并终止正在活动的 AOF 重写子进程。第二个命令将不会有任何问题,因为 AOF 已不再启用。

*最小化数据丢失的风险

从 Redis 7.0 开始,服务器在关闭前等待滞后副本最多可配置的 shutdown-timeout,默认 10 秒。这在未配置保存点且禁用 AOF 的情况下,提供了最小化数据丢失风险的最佳努力。在 7.0 版本之前,关闭负载较重的主节点在无盘设置中更有可能导致数据丢失。为了最小化此类设置中的数据丢失风险,建议在关闭主节点之前手动触发 FAILOVER(或 CLUSTER FAILOVER),将主节点降级为副本并提升其中一个副本为新的主节点。

*行为变更历史

  • >= 7.0.0: 引入退出前等待滞后副本。

*返回信息

Simple string reply: 如果指定了 ABORT 并且关闭已中止,则返回 OK。成功关闭时,不返回任何内容,因为服务器退出且连接已关闭。失败时返回错误。