这里是对初学Redis持久化操作之AOF的一些学习笔记
一.AOF是什么?
AOF即Append Only File。以日志的形式来记录每个写操作(增量保存),将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件。Redis启动之初会读取该文件重新构建数据,换言之,Redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
二.开启AOF
AOF默认是不开启的,可以在redis.conf配置文件中配置开启。默认为appendonly.aof。AOF文件的保存路径同RDB路劲一致。
AOF在redis.conf配置文件中的大致位置是在这个位置
############################## APPEND ONLY MODE ###############################
#......
由于太长,下面就对主要的几点加以说明
appendonly no #默认没有开启,若要开启AOF将no改为yes
appendfilename "appendonly.aof" #AOF生成的文件名
修改配置之后,重启redis-server,那么会发现生成了一个appendonly.aof文件以及如果你的dump.rdb中存在数据。那么重启后,使用redis-cli 的keys * 命令是看不到数据的。
这是因为:AOF和RDB同时开启,系统默认读取AOF的数据(数据不会存在丢失),因为我们是第一次开启AOF,所以重启时并没有数据加载进来。
三.AOF的恢复/修复
AOF恢复:与RDB差不多,重启redis-server的时候,就会加载appendonly.aof文件,并将持久化的数据进行加载进内存中。
AOF修复:如果遇到appendonly.aof文件损坏,可以通过redis/bin下的redis-check-aof--fix appendonly.aof 进行恢复
测试AOF恢复数据:
1.修改redis.conf将 appendonly no 改为 yes
2.启动redis-server(记住要使用该配置文件启动)
3.查看当前目录出现了appendonly.aof文件
4.查看rdb,aof文件
5.启动redis-server,并keys * 查看数据
6.往redis中写值
7.关闭redis-server并查看appendonly.aof文件
8.再次启动redis-server,redis-cli查看数据,依旧存在
9.再次关闭redis-server,并vim打开appendonly.aof文件,数据大致是这样
10.在该文件中添加一句话,保存退出。来模拟该文件出现损坏。
11.启动该redis-server,发现存在错误。
12.使用redis-check-aof命令对该appendonly.aof进行修复
13.启动redis-server,启动redis-cli,成功!
四.AOF中的一些配置
AOF同步频率设置
appendfsync always #始终同步,每次Redis的写操作都会立刻记入日志(性能较差,但数据完整性好)
appendfsync everysec #sec(秒的英文)每秒同步,每秒记入日志一次,如果宕机,该秒数据可能丢失
appendfsync no #Redis不主动进行同步,把同步时机交给操作系统
Rewrite压缩(重写压缩)
重写压缩是如果我们的写操作是类似这种相同命令:set k1 v1 然后 set k2 v2 ,那么就会压缩成set k1 v1 k2 v2 。该重写操作是在Redis4.0之后出现重写。
AOF文件持久增长而过大,会fork出一条新进程来将文件重写(也是先写临时文件最后再替换)。
重写压缩操作触发机制:Redis会记录上次重写时的AOF大小,默认配置是当AOF文件是上次重写大小的1倍且文件大于64M时触发。
重写虽然可以节约大量磁盘空间,减少恢复时间,但是每次重写还是有一定的负担,因此设定Redis要满足一定条件才会进行重写。
auto-aof-rewrite-percentage:设置重写的基准值,文件达到100%时才开始重写(文件是上次重写文件大小的2倍的时候触发)
五.AOF持久化流程
- 客户端的请求是写命令时会被append到AOF缓冲区内
- AOF缓冲区根据AOF持久化策略(always/everysec/no)将操作同步到磁盘的appendonly.aof文件中
- AOF文件大小超过重写策略或手动重写时,会对AOF文件进行重写压缩。
- 重启redis-server时,会加载AOF文件来恢复数据。
六.优势劣势
优势:
- 备份机制更稳健,丢失数据概率更低
- 可读的日志文本,通过操作AOF文件,可以处理误操作
劣势:
- 比RDB占用更多的磁盘空间
- 恢复备份速度要比RDB慢
- 每次读写同步的话,有一定的性能压力
- 存在个别BUG,造成不能恢复