Redis-持久化-AOF
1, AOF(Append Only File) 是什么
以日志的形式来记录每个写操作( 增量保存 ),将 Redis 执行的所有写指令记录下来( 读操作不记录 ),
redis启动只初会读取改文件重新构建数据,换言之,redis 重启的话就根据日志文件的内容将写指令从前到后执行一次已完成数据的恢复工作。
2, AOF持久化流程
1)客户端的请求写指令会被append 追加到 AOF 缓冲区内
2)AOF缓冲区根据 AOF 持久化策略【always,everysec,no】将操作 sync 同步到磁盘的 AOF 文件中。
3)AOF 文件大于重写策略或手动重写时,会对 AOF 文件 rewrite 重写,压缩 AOF 文件容量。
4)Redis 服务重启时,会重新 load 加载 AOF 文件中的写操作达到数据恢复的目的。
3. AOF 默认不开启
可以在 redis.conf 中配置文件名称,默认为 appendonly.aof
AOF文件保存的路径与 RDB的路径一致。

4,RDB和 AOF 同时开启
RDB和 AOF 同时开启,系统默认读取 AOF的数据(数据不存在丢失)
5,AOF 启动/修复/恢复
》AOF 备份机制和性能倏然和 RDB不同,但是备份和恢复的操作同 RDB 一样,都是拷贝备份文件,需要回复时再拷贝到redis 工作目录下,启动系统即加载。
》正常恢复
1),修改默认的 appendonly no ,改成 yes
2)将有数据的aof 文件复制一份保存到对应的目录( 查看目录:config get dir )下,
3) 恢复:重启Redis 然后重新加载
》异常恢复
1)修改默认的 appendonly no ,改成 yes
2)如遇到 AOF 文件损坏,通过 ( redis-check-aof 文件路径) /usr/local/bin/redis-check-aof --fix appendonly.aof 进行恢复
3)备份被写坏的AOF 文件,
4) 恢复:重启Redis 然后重新加载
6,AOF同步频率设置
appendfsync always
始终同步,每次 Redis 的写入都会立刻记入日志,性能较差但数据的完整性比较好。
appendfsync everysec
每秒同步,每秒记录日志一次,如果宕机,本秒的数据可能丢失。
appendfsync no
Redis 不会进行同步,把同步时机交给操作系统
7,Rewrite 压缩
1)是什么
AOF 采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当 AOF 文件的大小超过设置值时, Redis会启动 AOF 文件的内容压缩,
· 只保留可以恢复数据的最小指令集,可以使用命令 bgrewriteaof
2) 重写原理,如何实现重写
AOF 文件持续增长而过大时,会fork 出一条新进程来将文件重写( 也是先写临时文件最后在rename ),redis4.0 版本后的重写,是指就是把 RDB的快照,
以二进制的形式附在新的 AOF 头部,作为已有的历史数据,替换掉原来的流水账操作。
no-appendfsync-on-rewrite
如果no-appendfsync-on-rewrite=yes, 不写入aof文件只写入缓存,用户请求不会阻塞,但是在这段时间如果宕机会丢失这段时间的缓存数据。( 降低数据安全性,提高性能 )
如果no-appendfsync-on-rewrite=no, 还是会把数据往磁盘里写,但是遇到重写操作,可能会发生阻塞,(数据安全,但性能降低)
触发机制,何时重写
Redis会记录上次重写时的AOF 文件大小,默认配置是当前 AOF 文件大小是上次rewrite 后大小的一倍且文件大于64M时触发
重写虽然可以节省大量磁盘空间,减少恢复时间。但是每次重写还是有一定负担的,因此设定 Redis 要满足一定条件才进行重写。
auto-aof-rewrite-percentage:设置重写的基准值,文件达到100%时开始重写( 文件是原来重写后文件2倍时触发 )
auto-aof-rewrite-min-size: 设置重写的基准值,最小文件64M,达到这个值开始重写
例如:文件达到70M开始重写,重写后大小为50M,那么下次文件重写条件为 100M
系统载入时或者上次重写完毕时,Redis会记录此时 AOF 文件大小,设为 base_size,
当Redis 的AOF 大于 base_size+ base_size*100% 时,且当前大小大于64M,Redis会对AOF 进行重写
3)重写流程
1,bgrewriteaof触发重写,判断当前是否有 bgsave 或 bgrewriteaof 在进行,如果有,则等待改命令结束后在进行。
2,主进程 fork 出子进程进行重写,保证主进程不会阻塞
3,子进程遍历 Redis 内存中数据到临时文件,客户端的写请求同时写入 aof_buf缓冲区和aof_rewrite_buf 重写缓冲区保证原 AOF 文件完整及新 AOF 文件生成期间的新数据修改动作不会丢失。
4,子进程写完新的 AOF 文件后,向主进程发信号,父进程更新系统信息,
主进程把 aof_rewrite_buf 中的数据写入新的AOF文件中
5,使用新的 AOF 文件覆盖旧的 AOF 文件,完成 AOF 重写。
8,优点
1)备份机制稳健,丢失数据概率较低
2)可读的日志文件,通过操作 AOF 稳健,可以处理误操作。
9,缺点
1)比起 RDB 占用更多的磁盘空间
2) 恢复备份数据较慢
3)每次读写都同步的话,有一定的性能压力
4) 存在个别 BUG ,造成不能恢复
浙公网安备 33010602011771号