Redis04-持久化AOF

1、什么是AOF

  • AOF(Append Only File)是Redis的另一种持久化方式,通过记录所有写操作命令(以文本形式追加到文件)来实现数据持久化。与RDB快照不同,AOF更注重数据操作的完整性,适合需要高安全性的场景。
  • 同时开启RDB和AOF,当redis重启的时候会优先载入AOF文件来恢复原始的数据, 因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整

2、AOF的持久化流程

  • 所有的写入命令会追加到aof_buf(缓冲区)中。
  • AOF缓冲区根据appendfsync参数的配置,将命令同步到硬盘的AOF文件中。
  • 随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的。
  • 当Redis服务重启时,可以加载AOF文件进行数据恢复。
    image

3、AOF重写(rewrite)

AOF采用文件采用追加方式,文件会越来越大为避免出现此种情况,新增了重写机制, 当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩

3.1、手动触发重写

直接调用bgrewriteaof命令

3.2、自动触发重写

  • 两个参数同时满足会触发aof
  • auto-aof-rewrite-min-size:表示运行AOF重写时文件最小体积,默认为64MB
  • auto-aof-rewrite-percentage:定义了AOF 文件大小相比上次重写后的增长比例,例如:100表示比之前大小增加了一倍

3.3、AOF重写流程

image

1.执行AOF重写请求。如果当前进程正在执行AOF重写,直接返回,如果当前进程正在执行bgsave操作,重写命令延迟到bgsave完成后再执行

2.父进程执行fork创建子进程

3.1主进程fork操作完成后,继续响应其他命令,所有修改命令继续写入AOF缓冲区并根据appendfsync策略同步到旧的AOF文件

3.2在fork开始到结束期间,父进程依然响应命令,Redis使用"AOF重写缓冲区"保存这部分新数据

4.子进程按照命令合并规则将内存快照的数据写入到新的AOF文件。每次写入硬盘数据量由aof-rewrite-incremental-fsync控制,默认为32MB,防止单次刷盘数据过多造成硬盘阻塞

5.1新AOF文件写入完成后,子进程发送信号给父进程,父进程更新统计信息

5.2父进程把AOF重写缓冲区的数据写入到新的AOF文件。

5.3使用新AOF文件替换老文件,完成AOF重写。

3.4、重写后的AOF文件为什么会变小?

1.进程内已经超时的数据不会写入AOF文件
2.重写后的AOF文件是当前进程中数据转化为的写命令
3.重写可以将多条写命令合并为一个,为了防止命令写入的数据过大造成客户端缓冲区溢出,重写程序在处理list、set、hash、zset类型的键时,会检查元素个数,默认以64个元素为界拆分为多条命令执行

4、配置文件

  • 默认配置文件vim /etc/redis/redis.conf
  • AOF持久化开启且存在AOF文件时,优先加载AOF文件
  • AOF关闭或AOF文件不存在时,加载RDB文件
# 启用aof
appendfilename "appendonly.aof"    # 指定文件名
appendonly yes                     # 启用aof ,默认no

# AOF文件记录写操作的方式
appendfsync always               # 有新写操作立即记录,同时将数据写入硬盘中,即*.rdb中
appendfsync everysec             # 每秒记录一次,同时将数据写入硬盘中,即*.rdb中
appendfsync no                   # 不往*.rdb中记录

# 默认配置当aof文件是上次rewrite后大小的1倍且文件大于64M时触发
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

5、使用AOF恢复redis数据

正常恢复

  • 修改默认的appendonly no,改为yes
  • 将有数据的aof文件复制一份保存到对应目录(查看目录:config get dir)
  • 重启redis

异常恢复

  • 修改默认的appendonly no,改为yes
  • 备份被写坏的AOF文件,防止修复失败
  • 如遇到AOF文件损坏,通过redis-check-aof --fix appendonly.aof进行恢复,该命令扫描指定文件,丢弃无法解析的命令(仅保留完整可执行的命令)
  • 重启redis

6、AOF优点缺点

aof优点

  • 可以灵活的设置同步持久化appendfsync always或异步持久化appendfsync everysec
  • 宕机时,仅可能丢失1秒的数据

aof的缺点

  • AOF文件的体积通常会大于RDB文件的体积,RDB是压缩存放的
  • 执行fsync策略时的速度可能会比RDB慢
posted @ 2024-05-10 10:34  立勋  阅读(236)  评论(0)    收藏  举报