SHUTDOWN

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

命令行为如下

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

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

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

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

修饰符

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

  • SAVE 将强制执行一次 DB 保存操作,即使没有配置保存点。
  • NOSAVE 将阻止 DB 保存操作,即使配置了一个或多个保存点。
  • 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:引入了在退出前等待滞后副本的功能。

RESP2/RESP3 回复

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

历史

  • 从 Redis 7.0.0 版本开始:添加了 NOWFORCEABORT 修饰符。
评价本页
回到顶部 ↑