forked from wentaozone/rediscn
-
Notifications
You must be signed in to change notification settings - Fork 0
/
signals.html
90 lines (72 loc) · 7.38 KB
/
signals.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- saved from url=(0039)http://www.redis.cn/topics/signals.html -->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="./Redis中文资料站_files/styles.css" rel="stylesheet" type="text/css">
<link href="http://www.redis.cn/images/favicon.png" rel="shortcut icon">
<script src="./Redis中文资料站_files/jquery.min.1.4.js"></script>
<script src="./Redis中文资料站_files/app.js"></script>
<meta content="width=device-width, minimum-scale=1.0, maximum-scale=1.0" name="viewport">
<title>Redis中文资料站</title>
<meta http-equiv="description" content="redis中文资料站,下载安装redis,查找redis常用命令(commands),选择适合的redis客户端方式,配置redis主从(master-slave),阅读redis官方文档,社区里了解更多redis信息,提交redis的bug。">
</head>
<body class="">
<script src="./Redis中文资料站_files/head.js"></script>
<header> <div class="container"> <a href="http://www.redis.cn/"> <img alt="Redis" height="30" src="./Redis中文资料站_files/redis.png" width="93"> </a> <nav> <a href="http://www.redis.cn/commands.html">命令</a> <a href="http://www.redis.cn/clients.html">客户端</a> <a href="http://www.redis.cn/documentation.html">文档</a> <a href="http://www.redis.cn/community.html">社区</a> <a href="http://www.redis.cn/download.html">下载</a> <a href="https://github.com/antirez/redis/issues" target="_blank">问题</a> <a href="http://redis.com.cn/" target="_blank">论坛</a> <a href="http://www.redis.cn/update.html">更新日志</a> </nav> </div> </header>
<div class="text">
<article id="topic">
<h1>Redis信号处理</h1>
<p>本文档提供的信息是有关Redis是如何应对不同POSIX系统下产生的信号异常,比如<code>SIGTERM</code>,<code>SIGSEGV</code>等等。</p>
<p>本文档中的信息<strong>只适用于Redis2.6或更高版本</strong>。</p>
<h2>SIGTERM信号的处理</h2>
<p><code>SIGTERM</code>信号会让Redis安全的关闭。Redis收到信号时并不立即退出,而是开启一个定时任务,这个任务就类似执行一次<a href="http://www.redis.cn/commands/shutdown.html">SHUTDOWN</a>命令的。
这个定时关闭任务会在当前执行命令终止后立即施行,因此通常有有0.1秒或更少时间延迟。</p>
<p>万一Server被一个耗时的LUA脚本阻塞,如果这个脚本可以被<code>SCRIPT KILL</code>命令终止,那么定时执行任务就会在脚本被终止后立即执行,否则直接执行。</p>
<p>这种情况下的Shutdown过程也会同时包含以下的操作:</p>
<ul>
<li>如果存在正在执行RDB文件保存或者AOF重写的子进程,子进程被终止。</li>
<li>如果AOF功能是开启的,Redis会通过系统调用<code>fsync</code>将AOF缓冲区数据强制输出到硬盘。</li>
<li>如果Redis配置了使用RDB文件进行持久化,那么此时就会进行同步保存。由于保存时同步的,那也就不需要额外的内存。</li>
<li>如果Server是守护进程,PID文件会被移除。</li>
<li>如果Unix域的Socket是可用的,它也会被移除。</li>
<li>Server退出,退出码为0.</li>
</ul>
<p>万一RDB文件保存失败,Shutdown失败,Server则会继续运行以保证没有数据丢失。自从Redis2.6.11之后,Redis不会再次主动Shutdown,除非它接收到了另一个<code>SIGTERM</code>信号或者另外一个<a href="http://www.redis.cn/commands/shutdown.html">SHUTDOWN</a>命令</p>
<h2>SIGSEGV,SIGBUS,SIGFPF和SIGILL信号的处理</h2>
<p>Redis接收到以下几种信号时会崩溃:</p>
<ul>
<li>SIGSEGV</li>
<li>SIGBUS</li>
<li>SIGFPE</li>
<li>SIGILL</li>
</ul>
<p>如果以上信号被捕获,Redis会终止所有正在进行的操作,并进行以下操作:</p>
<ul>
<li>包括调用栈信息,寄存器信息,以及clients信息会以bug报告的形式写入日志文件。</li>
<li>自从Redis2.8(当前为开发版本)之后,Redis会在系统崩溃时进行一个快速的内存检测以保证系统的可靠性。</li>
<li>如果Server是守护进程,PID文件会被移除。</li>
<li>最后server会取消自己对当前所接收信号的信号处理器的注册,并重新把这个信号发给自己,这是为了保证一些默认的操作被执行,比如把Redis的核心Dump到文件系统。</li>
</ul>
<h2>子进程被终止时会发生什么</h2>
<p>当一个正在进行AOF重写的子进程被信号终止,Redis会把它当成一个错误并丢弃这个AOF文件(可能是部分或者完全损坏)。AOF重写过程会在以后被重新触发。</p>
<p>当一个正在执行RDB文件保存的子进程被终止Redis会把它当做一个严重的错误,因为AOF重写只会导致AOF文件冗余,但是RDB文件保存失败会导致Redis不可用。</p>
<p>
如果一个正在保存RDB文件的子进程被信号终止或者自身出现了错误(非0退出码),Redis会进入一种特殊的错误状态,不允许任何写操作。
</p>
<ul>
<li>Redis会继续回复所有的读请求。</li>
<li>Redis会回复给所有的写请求一个<code>MISCONFIG</code>错误。</li>
</ul>
<p>
此错误状态只需被清楚一次就可以进行成功创建数据库文件。
</p>
<h2>不触发错误状态的情况下终止RDB文件的保存</h2>
<p>但是有时用户希望可以在不触发错误的情况下终止保存RDB文件的子进程。自从Redis2.6.10之后就可以使用信号<code>SIGUSR1</code>,这个信号会被特殊处理:它会像其他信号一样终止子进程,但是父进程不会检测到这个严重的错误,照常接收所有的用户写请求。</p>
</article>
</div>
<script src="./Redis中文资料站_files/foot.js"></script>
<footer>
<div class="sponsor">本站资源翻译自<a href="http://redis.io/" target="_blank">redis.io</a>,由<a href="http://www.redis.cn/aboutus.html">redis.cn翻译团队</a>,更新日志请点击<a href="http://www.redis.cn/update.html">这里</a>查看,翻译原文版权归redis.io官方所有,翻译不正确的地方欢迎大家指出。<br>联系Email:<a href="mailto:admin@redis.cn">admin@redis.cn</a>,redis交流群:<a href="http://www.redis.cn/topics/signals.html#">46859267</a> <script src="./Redis中文资料站_files/stat.php" language="JavaScript"></script><script src="./Redis中文资料站_files/core.php" charset="utf-8" type="text/javascript"></script><a href="http://www.cnzz.com/stat/website.php?web_id=3593514" target="_blank" title="站长统计">站长统计</a> </div> </footer>
</body>
</html>