SHUTDOWN

用法
SHUTDOWN [ [ NOSAVE | SAVE ] [ NOW ] [ FORCE ] | ABORT ]
复杂度
保存时为 O(N),其中 N 是保存数据时所有数据库中键的总数,否则为 O(1)
始于
1.0.0
ACL 类别
@admin, @dangerous, @slow

命令行为如下

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

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

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

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

修饰符

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

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

SHUTDOWN 失败的条件

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

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

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

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

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

最小化数据丢失的风险

服务器在关闭前会等待滞后的副本,最长可达可配置的 shutdown-timeout(默认为 10 秒)。这提供了一种尽力而为的方式,在未配置保存点且禁用 AOF 的情况下,最大程度地降低数据丢失的风险。在 7.0 版本之前,在无盘设置中关闭一个负载很重的主节点更有可能导致数据丢失。为了在这种设置中最小化数据丢失的风险,建议在关闭主节点之前,触发手动 FAILOVER(或 CLUSTER FAILOVER)以将主节点降级为副本,并将其中一个副本提升为新的主节点。

RESP2/RESP3 回复

简单字符串回复:如果指定了 ABORT 且关闭被中止,则返回 OK。成功关闭时,不返回任何内容,因为服务器退出且连接关闭。失败时,返回错误。

历史

版本 更改
7.0.0

添加了 NOWFORCEABORT 修饰符。