Redis中的AOF工作流程
AOF(append only file):以独立日志的方式记录每次写的命令,重启时再重新执行AOF文件中的命令达到恢复数据的目的。
AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式。
以下是AOF工作流程图:
文章图片
一、开启AOF
Redis中默认不开启AOF,appendonly yes,是开启的配置。
文件的名字默认为appendonly.aof,可以通过参数appendfilename来设置。
目录也是通过dir来设置。
二、命令写入append
所有写入命令会追加到aof_buf(缓冲区)中。
三、文件同步sync
AOF缓冲区,根据策略向硬盘做同步。由参数appendfsync控制,常规使用everysec选项:
- always:命令写入aof_buf后,直接调用系统的fsync操作同步到AOF文件。
- everysec:命令写入aof_buf后,调用系统的write操作,write操作完成后线程返回。fsync同步文件操作由专门线程每秒调用一次。
- no:命令写入aof_buf后调用系统的write操作,不对AOF文件做fsync同步,同步硬盘操作由操作系统负责,通常同步周期最长30秒。
- 手动触发:直接调用bgrewriteaof。
- 自动触发:根据auto-aof-rewrite-min-size(默认64M)和auto-aof-rewrite-percentage参数确定自动触发时机。
- 自动触发时机 = (aof_current_size > auto-aof-rewrite-min-size) && (aof_current_size / aof_base_size) > auto-aof-rewrite-percentage。
- 当前AOF文件大小:aof_current_size。
- 上一次重写后的AOF文件空间大小:aof_base_size。
- 其中aof_current_size和aof_base_size可以在命令info persistence的结果中查看到。
文章图片
AOF重写流程如下:
- 执行AOF重写请求。
- 如果当前进程正在执行AOF重写,请求不执行,直接返回。
- 如果当前进程正在执行bgsave操作,重写命令延迟到bgsave完成之后再执行。
- 主进程执行fork操作完成后,继续响应其他命令。所有修改命令继续写入aof_buf缓冲区中并根据appendfsync策略同步到硬盘,保证原有AOF机制正确性。
- fork操作运用写时复制技术,子进程只能共享fork操作时的内存数据。子进程根据内存快照,按照命令合并规则写入到新的AOF文件。每次写入硬盘数据量由aof-rewrite-incremental-fsync控制,默认为32M。
- 父进程将重写缓冲区内的数据写入到新的AOF文件中。
- 使用新的AOF文件替换老文件,完成AOF重写。
文章图片
如上图,流程说明:
- AOF持久化开启且存在AOF文件时,优先加载AOF文件。
- AOF关闭或者AOF文件不存在时,加载RDB文件。
- 加载AOF/RDB文件成功后,Redis启动成功。
- AOF/RDB文件存在错误时,Redis启动失败并打印错误信息。
AOF文件结尾不完整的情况下:可以使用aof-load-truncated配置来兼容这种情况。
【Redis中的AOF工作流程】转载地址:https://blog.csdn.net/jiangxiulilinux/article/details/104908226
推荐阅读
- 热闹中的孤独
- JS中的各种宽高度定义及其应用
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- Android中的AES加密-下
- 放下心中的偶像包袱吧
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- C语言浮点函数中的modf和fmod详解
- C语言中的时间函数clock()和time()你都了解吗
- 如何在Mac中的文件选择框中打开系统隐藏文件夹