关闭
SHUTDOWN [NOSAVE | SAVE] [NOW] [FORCE] [ABORT]
- 从以下位置开始可用:
- 1.0.0
- 时间复杂度:
- O(N) 保存时,其中 N 是保存数据时所有数据库中的 key 总数,否则为 O(1)
- ACL 类别:
-
@admin
,@slow
,@dangerous
,
命令行为如下:
- 如果复制中存在滞后的副本:
- 通过执行
CLIENT PAUSE
使用WRITE
选择。 - 等待配置的
shutdown-timeout
(默认为 10 秒),以便副本赶上复制偏移量。
- 通过执行
- 停止所有客户端。
- 如果至少配置了一个保存点,则执行阻止 SAVE。
- 如果启用了 AOF,则刷新 Append Only 文件。
- 退出服务器。
如果启用了持久性,则此命令将确保 Redis 已关闭 没有任何数据丢失。
注意:配置为不在磁盘上持久化的 Redis 实例(无 AOF
configured,也不是 “save” 指令)都不会转储 RDB 文件SHUTDOWN
如
通常,您不希望仅用于缓存的 Redis 实例在以下时间阻塞
关闭。
另请注意:如果 Redis 收到其中一个信号SIGTERM
和SIGINT
,则执行相同的关闭顺序。
另请参阅 信号处理。
修饰 符
可以指定可选修饰符来更改命令的行为。 具体说来:
- SAVE 将强制执行数据库保存作,即使未配置保存点也是如此。
- NOSAVE 将阻止数据库保存作,即使配置了一个或多个保存点。
- NOW 跳过等待滞后副本,即它绕过了关闭序列中的第一步。
- FORCE 会忽略通常会阻止服务器退出的任何错误。 有关详细信息,请参阅以下部分。
- ABORT 取消正在进行的关闭,并且不能与其他标志结合使用。
SHUTDOWN 失败的条件
配置保存点或指定 SAVE 修饰符时,如果无法保存 RDB 文件,则关闭可能会失败。 然后,服务器继续运行以确保不会丢失数据。 可以使用 FORCE 修饰符绕过此作,从而导致服务器无论如何都退出。
启用 Append Only File 后,关闭可能会失败,因为 系统处于不允许安全立即持续存在的状态 在磁盘上。
通常,如果有 AOF 子进程执行 AOF 重写,Redis 将简单地杀死它并退出。 但是,在某些情况下,这样做是不安全的,除非指定了 FORCE 修饰符,否则 SHUTDOWN 命令将被拒绝并显示错误。 这在以下情况下发生:
- 用户刚刚开启了 AOF,服务器触发了第一次 AOF 重写,以创建初始 AOF 文件。在这种情况下,停止将导致数据集完全丢失:重新启动后,服务器可能会启用 AOF,而根本没有任何 AOF 文件。
- 启用了 AOF 的副本,重新连接其主副本,执行完全重新同步,然后重新启动 AOF 文件,从而触发初始 AOF 创建过程。在这种情况下,不完成 AOF 重写是危险的,因为从 master 收到的最新数据集将丢失。新的主服务器实际上甚至可以是不同的实例(如果使用 REPLICAOF 或 SLAVEOF 命令来重新配置副本),因此完成 AOF 重写并从表示服务器终止时内存中数据集的正确数据集开始非常重要。
在某些情况下,我们只想尽快终止 Redis 实例,无论其内容是什么。 在这种情况下,可以使用命令 SHUTDOWN NOW NOSAVE FORCE。 在 7.0 之前的版本中,NOW 和 FORCE 标志不可用,正确的命令组合是发送 CONFIG appendonly no,然后发送 SHUTDOWN NOSAVE。 第一个命令将根据需要关闭 AOF,如果有一个活动 AOF 重写子项,则终止 AOF 重写子项。 第二个命令执行不会有任何问题,因为 AOF 不再启用。
最大限度地降低数据丢失的风险
从 Redis 7.0 开始,服务器会等待滞后副本,直到shutdown-timeout
,默认情况下为 10 秒,然后关闭。
这提供了最大努力,在未配置保存点且禁用 AOF 的情况下,将数据丢失的风险降至最低。
在版本 7.0 之前,在无盘设置中关闭负载较重的主节点更可能导致数据丢失。
为了最大限度地降低此类设置中数据丢失的风险,建议触发手动FAILOVER
(或CLUSTER FAILOVER
) 将主节点降级为副本,并将其中一个副本提升为新的主节点,然后再关闭主节点。
行为更改历史记录
>= 7.0.0
:引入了在退出前等待滞后副本的功能。
RESP2/RESP3 回复
简单的字符串回复:OK
如果指定了 ABORT 并且 shutdown 已中止。成功关闭后,不会返回任何内容,因为服务器退出并且连接已关闭。失败时,将返回错误。历史
- 从 Redis 版本 7.0.0 开始:添加了
NOW
,FORCE
和ABORT
修饰 符。