*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 收到 SIGTERM 和 SIGINT 信号之一,则执行相同的关闭序列。另请参阅 信号处理。
*修饰符
可以指定可选修饰符来更改命令的行为。具体来说:
- 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 重写是危险的,因为从主节点接收的最新数据集将丢失。新的主节点实际上可能是一个不同的实例(如果使用 REPLICAOF 或 SLAVEOF 命令重新配置了副本),因此完成 AOF 重写并从正确的数据集开始(服务器终止时内存中的数据集)非常重要。
在某些情况下,我们只想尽快终止 Redis 实例,无论其内容如何。在这种情况下,可以使用命令 SHUTDOWN NOW NOSAVE FORCE。在 7.0 之前的版本中,没有 NOW 和 FORCE 标志,正确的命令组合是发送 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。成功关闭时,不返回任何内容,因为服务器退出且连接已关闭。失败时返回错误。