Redis持久化-原理
2020-04-22 10:27:06 0 举报
redis持久化流程图
作者其他创作
大纲/内容
修改key
子进程
否
是否开启AOF
客户端
是
处理客户端请求
子线程
fork
生成RDB文件
当主线程fork出子线程后,父子线程会共享一份内存数据,主线程对客户端请求的读操作直接读取数据返回,当客户端对key有更新操作时,会将该数据所在内存页复制一份,对复制的内存页进行操作,子线程一直处理那个时间点分离出来的内存数据。那一部分数据相当于一瞬间凝固,也是成为快照的原因。
redis server
对该数据所在的内存页进行复制,对复制的内存页操作
客户端执行bgsave命令
call函数
记录统计状态和指标
是否正在执行AOF重写
fork进程
内存数据
主线程
RDB快照
执行完退出
将命令写入aof_buf中
AOF重写
bgrewriteaof命令
1、redis的每一个命令执行都会调用call函数,如果开启了aof配置,就会同步的将命令写入到aof_buf缓冲区中2、将缓冲区的写入文件会使用操作系统提供的write函数执行,但是write函数只是将数据保存在内核的缓冲区中,真正写入文件还需要调用fsync函数,调用fsync的频率,有配置文件中的appendfsync控制,分为三种:no:不执行,有操作系统负责刷到磁盘,数据安全最低,redis效率最高always:每执行一次写入就fsync一次,数据安全性最高,但是redis效率降低everysec:每秒执行一次,数据折中方案。3、AOF重写,随着redis运行,aof文件会越来越大,对同一个key的操作可能有很多次,aof重写通过fork出一个子进程来执行,重写不会对原文件进行修改和读取,子进程对所有数据库中所有的键各自生成一条相应的执行命令,最后将重写开始后父进程继续执行的命令进行回放,生成一个新的AOF文件。
将命令写入aof_rewrite_buf_blocks中
创建管道
COW机制
配置:auto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb
调用rewrite-AppendOnlyFile
在子进程处理重写时,主进程还会积累一些命令,这些命令将会在执行完重写后,有主进程通过管道分批发送到子进程,完成回放。然后,子线程退出后,还会有少量的命令,这些命令在主线程进行回放就可以了。子进程重写完,会生成一个新的aof文件,主线程会把重写缓冲区的数据写入到新的文件,然后替换旧的aof文件
进入主循环
结束
save 配置
AOF原理
0 条评论
下一页