关闭
SHUTDOWN [NOSAVE | SAVE] [NOW] [FORCE] [ABORT]
- 可用版本
- 1.0.0
- 时间复杂度
- O(N) 当保存时,其中 N 是所有数据库中键的总数,否则为 O(1)
- ACL 类别
-
@admin
,@slow
,@dangerous
,
该命令的行为如下
- 如果有任何副本在复制方面落后
- 通过执行
客户端暂停
并使用写入
选项来暂停尝试写入的客户端。 - 等待配置的
shutdown-timeout
(默认值为 10 秒)的时间,以使副本赶上复制偏移量。
- 通过执行
- 停止所有客户端。
- 如果至少配置了一个 **保存点**,则执行阻塞式保存。
- 如果启用了 AOF,则刷新追加只写文件。
- 退出服务器。
如果启用了持久化,此命令确保 Redis 在没有数据丢失的情况下关闭。
注意:配置为不在磁盘上持久化的 Redis 实例(未配置 AOF 也不配置“save”指令)不会在 关闭
时转储 RDB 文件,因为通常您不希望仅用于缓存的 Redis 实例在关闭时阻塞。
另请注意:如果 Redis 接收 SIGTERM
和 SIGINT
中的一个信号,则执行相同的关闭顺序。另请参见 信号处理。
修饰符
可以指定可选的修饰符来更改命令的行为。具体来说
- **保存** 将强制执行数据库保存操作,即使未配置任何保存点。
- **不保存** 将阻止数据库保存操作,即使配置了一个或多个保存点。
- **现在** 跳过等待滞后的副本,即它绕过关闭顺序中的第一步。
- **强制** 忽略任何通常会阻止服务器退出的错误。有关详细信息,请参见下一节。
- **中止** 取消正在进行的关闭,并且不能与其他标志组合使用。
SHUTDOWN 失败的条件
当配置了保存点或指定了 **保存** 修饰符时,如果无法保存 RDB 文件,则关闭可能会失败。然后,服务器继续运行以确保没有数据丢失。这可以通过使用 **强制** 修饰符来绕过,从而导致服务器无论如何退出。
当启用追加只写文件时,关闭可能会失败,因为系统处于无法安全地立即持久化到磁盘的状态。
通常,如果有一个 AOF 子进程正在执行 AOF 重写,Redis 将简单地杀死它并退出。但是,在某些情况下,这样做是不安全的,除非指定了 **强制** 修饰符,否则将拒绝 **关闭** 命令并显示错误。这发生在以下情况下
- 用户刚刚打开了 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` 修饰符。