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 收到 SIGTERM
或 SIGINT
信号之一,将执行相同的关闭序列。另请参阅信号处理。
修饰符
可以指定可选修饰符来改变命令的行为。具体如下:
- 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 重写是危险的,因为从主节点接收到的最新数据集将会丢失。新的主节点甚至可能是不同的实例(如果使用 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
:引入了在退出前等待滞后副本的功能。
RESP2/RESP3 回复
简单字符串回复:如果指定了 ABORT 且关闭被中止,则返回OK
。成功关闭时,不返回任何内容,因为服务器退出且连接已关闭。失败时,返回错误。历史
- 从 Redis 7.0.0 版本开始:添加了
NOW
、FORCE
和ABORT
修饰符。