1、概述
redis支持两种持久化方式,rdb和aof。rdb是数据库某一时刻的快照,aof是Append Only File,aof通过写命令记录数据库的状态。目前我们线上没开rdb,主从redis都开启了aof everysec。
2、RDB
有两个命令可以生成RDB文件,一个是save,另一个是bgsave。
save命令会阻塞redis进程,直到生成rdb文件,阻塞期间不能处理任何命令,一般线上很少使用。
bgsave命令的保存工作是由子进程执行的,子进程生成rdb文件的过程中,主进程仍然可以处理客户端的命令。
用户可以通过redis配置来设置rdb的保存频率,服务器是通过执行bgsave来生成rdb文件的。
save 900 1:服务器在900秒之内,对数据库至少进行了1次修改
save 300 10:服务器在300秒之内,对数据库至少进行了10次修改
save 60 10000:服务器在60秒之内,对数据库至少进行了10000次修改
3、aof
aof记录的是redis接收到的客户端写请求,当redis接收到写命令时,会先记录到内存的aof_buf缓冲区的末尾,当满足配置的aof持久化策略时,就会写入或同步到磁盘中。
always:每个事件循环将aof_buf缓冲区中的内容写入并同步到aof文件。
everysec:每个事件循环将aof_buf缓冲区中的内容写入到aof文件,每1秒同步一次。
no:每个事件循环将aof_buf缓冲区中的内容写入到aof文件,但并不对aof文件进行同步,同步交给系统处理。
aof文件里面有很多失效的数据,会占用大量的空间,redis会根据配置对aof文件进行重写。
no-appendfsync-on-rewrite no 在aof文件重写时appendfsync选项是否设置成no,如果设置成no将会将同步磁盘的工作交给系统,如果redis挂了有一些写记录是没有同步到aof文件中的,会丢失部分数据,如果设置不设置成no将会根据appendfsync同步数据,两个进程同时向磁盘同步数据会出现写抖动。
auto-aof-rewrite-percentage 100 当前aof文件大小是上次日志重写得到aof文件大小的二倍时,自动启动新的日志重写过程。
auto-aof-rewrite-min-size 64mb 当前aof文件启动重写过程的最小值,避免刚刚启动reids时由于文件尺寸较小导致频繁的重写。
aof重写是通过子进程进行的,重写过程中如果redis收到新的写命令将会记录到重写缓冲区中,主进程定期调用wait3函数等待子进程退出,并将重写缓冲区中的日志记录到新的aof文件中。
4、其它
redis启动的时候,优先加载aof文件,如果aof没有aof文件,再加载rdb文件。
网友评论