关闭

Syntax
SHUTDOWN [NOSAVE | SAVE] [NOW] [FORCE] [ABORT]
Available since:
1.0.0
Time complexity:
O(N) when saving, where N is the total number of keys in all databases when saving data, otherwise O(1)
ACL categories:
@admin, @slow, @dangerous,

命令行为如下:

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

如果启用了持久化,此命令确保Redis在没有任何数据丢失的情况下关闭。

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

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

修饰符

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

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

SHUTDOWN 失败的条件

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

当仅追加文件启用时,关闭可能会失败,因为系统处于不允许立即安全持久化到磁盘的状态。

通常情况下,如果有一个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: 引入了在退出前等待滞后副本的功能。

RESP2/RESP3 回复

Simple string reply: OK if ABORT was specified and shutdown was aborted. On successful shutdown, nothing is returned because the server quits and the connection is closed. On failure, an error is returned.

历史

  • 从 Redis 7.0.0 版本开始:添加了 NOWFORCEABORT 修饰符。
RATE THIS PAGE
Back to top ↑