更新时间:2022-10-07 22:45:00
本文档提供的信息是有关Redis是如何应对不同POSIX系统下产生的信号异常,比如SIGTERM
,SIGSEGV
等等。
本文档中的信息只适用于Redis2.6或更高版本。
SIGTERM信号会让Redis安全的关闭。Redis收到信号时并不立即退出,而是开启一个定时任务,这个任务就类似执行一次SHUTDOWN命令的。 这个定时关闭任务会在当前执行命令终止后立即施行,因此通常有有0.1秒或更少时间延迟。
万一Server被一个耗时的LUA脚本阻塞,如果这个脚本可以被SCRIPT KILL命令终止,那么定时执行任务就会在脚本被终止后立即执行,否则直接执行。
这种情况下的Shutdown过程也会同时包含以下的操作:
万一RDB文件保存失败,Shutdown失败,Server则会继续运行以保证没有数据丢失。自从Redis2.6.11之后,Redis不会再次主动Shutdown,除非它接收到了另一个SIGTERM信号或者另外一个SHUTDOWN命令
Redis接收到以下几种信号时会崩溃:
如果以上信号被捕获,Redis会终止所有正在进行的操作,并进行以下操作:
当一个正在进行AOF重写的子进程被信号终止,Redis会把它当成一个错误并丢弃这个AOF文件(可能是部分或者完全损坏)。AOF重写过程会在以后被重新触发。
当一个正在执行RDB文件保存的子进程被终止Redis会把它当做一个严重的错误,因为AOF重写只会导致AOF文件冗余,但是RDB文件保存失败会导致Redis不可用。
如果一个正在保存RDB文件的子进程被信号终止或者自身出现了错误(非0退出码),Redis会进入一种特殊的错误状态,不允许任何写操作。
此错误状态只需被清楚一次就可以进行成功创建数据库文件。
但是有时用户希望可以在不触发错误的情况下终止保存RDB文件的子进程。自从Redis2.6.10之后就可以使用信号SIGUSR1,这个信号会被特殊处理:它会像其他信号一样终止子进程,但是父进程不会检测到这个严重的错误,照常接收所有的用户写请求。