Redis6 持久化之 AOF
1039字约3分钟
2024-08-10
Redis 提供了 2 个不同形式的持久化方式
RDB(Redis DataBase)
AOF(Append Of File)
AOF 介绍
以日志的形式来记录每个写操作(增量保存),将 Redis 执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,Redis 启动之初会读取该文件重新构建数据,换言之,Redis 重启的话会根据日志文件的内容将写指令从前到后执行一次完成数据的恢复工作。
优势
备份机制更稳健,丢失数据概率更低
可读的日志文本,通过操作 AOF 文件,可以处理误操作
劣势
比起 RDB 占用更多的磁盘空间
恢复备份速度要慢
每次读写都同步的话,有一定的性能压力
存在个别 Bug,造成回复不可能
备份
AOF 持久化流程
客户端的请求写命令会被 append 追加到 AOF 缓冲区
AOF 缓冲区根据 AOF 持久化策略[always,everysec,no]将操作 sync 同步到磁盘的 AOF 文件中
AOF 文件大小超过重写策略或手动重写时,会对 AOF 文件 rewrite 重写,压缩 AOF 文件容量
Redis 服务重启时,会重新 load 加在 AOF 文件中的写操作达到数据恢复的目的
AOF 默认不开启
appendonly no
,修改为 yes 开启,默认文件命名是 appendonly.aof
,AOF 文件保存路径与 RDB 路径一致。
AOF 和 RDB 同时开启,系统默认取 AOF 的数据(数据不会存在丢失)
修复 aof 文件
redis-check-aof --fix appendonly.aof
AOF 同步频率设置
appendfsync always
:始终同步,每次 Redis 的写入都会立刻记入日志;性能较差但数据完整性比较好appendfsync everysec
:每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失appendfsync no
:redis 不主动进行同步,把同步时机交给操作系统
Rewrite 压缩
AOF 采用文件追加方式,文件会越来越大,为了避免出现这种情况,新增了重写机制,当 AOF 文件的大小超过了所设定的阈值时,Redis 就会启动 AOF 文件的内容压缩,只保留可以恢复数据的最小指令集,可以使用命令 bgrewriteaof
重写原理:AOF 文件持续增长而过大时,会 fork 出一条新进程来将文件重写(也是先写临时文件最后再替换),redis 4.0 版本后的重写,实际上就是把 rdb 的快照,以二进制的形式附在新的 aof 头部,作为已有的历史数据,替换掉原来的流水账操作。(例如:set a a1
set b b1
合并成一条命令 set a a1 b b1
)
触发条件
auto-aof-rewrite-percentage 100
:设置重写的基准值,文件达到 100% 时重写(文件是原来重写后文件的 2 倍时触发)auto-aof-rewrite-min-size 64mb
:设置重写的基准值,最小文件 46MB。达到这个值开始重写
系统载入的时或者上次重写完毕时,Redis 会记录此时 AOF 大小,设为 base_size,如果 Redis 的 AOF 当前大小 >= base_size + base_size*100%(默认)且当前大小 >= 64MB(默认)
的情况下,Redis 会对 AOF 进行重写
重写流程
bgrewriteaof 触发重写,判断当前是否有 bgsave 或 bgrewriteaof 在运行,如果有,则等待该命令结束后再继续执行
主进程 fork 出子进程执行重写操作,保证主进程不会阻塞
子进程遍历 redis 内存中数据到临时文件,客户端的写请求同时写入 aof_buf 缓冲区和 aof_rewrite_buf 重写缓冲区保证原 AOF 文件完整以及新 AOF 文件生成期间新的数据修改动作不会丢失
子进程写完新的 AOF 文件后,向主进程发信号,父进程更新统计信息。
主进程把 aof_rewrite_buf 中的数据写入到新的 AOF 文件
使用新的 AOF 文件覆盖旧的 AOF 文件,完成 AOF 重写