AOF持久化 : 每当有修改数据库的命令执行时,服务器就会将执行的命令写入到AOF文件末尾,但这并不意味着AOF文件持久化不会丢失任务数据,当一条命令真正被写入硬盘里,这条命令才不会因为down机而丢失,丢失命令的数量取决于命令被写入硬盘的时间
开启AOF持久化会清空redis内部数据
在目前常见的操作系统中,执行系统调用write函数,将一些内容写入到某个文件中时,为了提高效率,系统通常不会直接将内容写入到硬盘里,而是先将内容放入一个内存缓冲区(buffer)里面,等到缓冲区被填满,或者用户执行fsync调用和fdatasync调用时才将存储在缓冲区里的内容真正写入硬盘里。
appendfsync
为了控制redis服务器在遇到意外down机时丢失数据量,redis为AOF持久化提供了appendfsync选项
-
always : 服务器每写入一个命令,就调用一次fdatasync,将缓冲区里面的命令写入到硬盘中,在这种模式下,服务器即时down机,也不会丢失任何已经成功执行的命令数据
-
everysec : 服务器每一秒重调一次fdatasync,将缓冲区里面的命令写入到硬盘里,在这种模式下,服务器即时down机,最多只丢失一秒内执行的命令数据,默认值 : everysec
-
no : 服务器不主动调用fdatasync,由操作系统决定,在这种模式下,服务器down机时丢失命令数据不确定
命令 |
always |
everysec |
no |
优点 |
不丢失数据 |
每秒一次fsync,丢失一秒数据 |
|
缺点 |
IO开销较大,一般的SATA盘只有几百TPS |
丢一秒数据 |
不可控 |
appendonly yes #是否开启AOF持久化 默认关闭
appendfilename "appendonly.aof" #AOF持久化文件名
appendfsync everysec #触发条件
no-appendfsync-on-rewrite yes #正在导出rdb快照的过程中,是否停止同步aof 默认no
dir /bigdiskpath #文件保存路径
auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小,增长100%时,重写
auto-aof-rewrite-min-size 64mb #aof文件,至少64M时,重写
/*
auto-aof-rewrite-percentage 指定触发重写所需的AOF文件体积百分比,当AOF文件的体积大于 auto-aof-rewrite-min-size指定的体积时,
并且超过上一次重写之后的AOF文件的 percentage %时,就会重新触发AOF重写(如果服务器刚刚启动不久,还没有进行AOF重写,
那么使用服务器启动时载入的AOF文件的体积作为基准值),将这个值设置为0表示关闭自动AOF重写
当AOF文件大于64MB之后才考虑进行AOF重写
*/
127.0.0.1:6379> set yhq 123
OK
127.0.0.1:6379> set qhh 123
OK
127.0.0.1:6379> exit
[root@localhost redis-5.0.2]# cat /lamp/redis-5.0.2/appendonly.aof
*2
$6
SELECT
$1
0
*3
$3
set
$3
yhq
$3
123
*3
$3
set
$3
qhh
$3
123
AOF文件重写(压缩) : bgrewriteaof
AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条set语句。重写AOF文件的操作,并没有读取旧的AOF文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的AOF文件,这点和快照有点类似。
1.减少硬盘占用量
2.加快恢复速度
auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小,增长100%时,重写
auto-aof-rewrite-min-size 64mb #aof文件,至少64M时,重写
127.0.0.1:6379> bgrewriteaof
Background append only file rewriting started
-rw-r--r--. 1 root root 790 Dec 15 19:43 appendonly.aof
[root@localhost redis-5.0.2]# ll appendonly.aof
-rw-r--r--. 1 root root 116 Dec 15 19:44 appendonly.aof
触发机制
1.客户端向服务端发送bgrewriteaof命令
2.通过配置项 auto-aof-rewrite-min-size 设置触发aof重写的最小体积(避免对体积过小的AOF文件重写)
3.通过配置项 auto-aof-rewrite-percentage 设置增长率
AOF追加阻塞
AOF阻塞定位
1.redis日志
Asynchronous AOF fsync is tasking too long(disk is busy?). #异步AOF fsync任务太长(磁盘忙吗?).
Writing the AOF buffer without waiting got fsync to complete. #在不等待的情况下写入AOF缓冲区使fsync完成。
this may slow downRedis #这可能会减慢redis的速度
2.info persistence
aof_delayed_fsync : 100
3.top