Redis持久化之AOF(Append Only File)
Redis的持久化
Redis是一个基于内存的数据库,它的数据是存放在内存中,内存有个问题就是关闭服务或者断电会丢失。
Redis的数据也支持写到硬盘中,这个过程就叫做持久化。
Redis提供了2种不同形式的持久化方式。
- RDB(Redis DataBase)
- AOP(Append Of File)
AOF是什么
以日志的形式来记录每个写操作(增量保存),将redis执行过的所有写指令记录下来(读操作不记录),只允追加文件但不可改写文件,redis启动之初会读取该文件重新构造数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
AOF持久化流程
- 客户端的请求写命令会被append追加到AOF缓冲区内
- AOF缓冲区会根据AOF持久化策略[always,everysec,no]将操作sync同步到磁盘的AOF文件中
- AOF文件大小超过重写策略或手动重写时,会对AOF文件进行重写(rewrite),压缩AOF文件容量
- redis服务器重启时,会重新load加载AOF文件中的写操作达到数据恢复的目的
AOF如何开启
可以在redis.conf文件中对AOF进行配置:
# 是否开启AOF,yes:开启,no:不开启,默认为no
appendonly no# aof文件名称,默认为appendonly.aof
appendfilename "appendonly.aof"# aof文件所在目录,默认./ 表示执行启动命令时所在的目录,
# 比如我们在/opt目录中,去执行redis-server /etc/redis.conf
# 来启动redis,那么dir此时就是/opt目录
dir ./
AOF和RDB同时开启,怎么办
AOF和RDB同时开启,系统默认取AOF的数据(数据不会存在丢失)
AOF启动/修复/恢复
- AOF的备份机制和性能虽然和RDB不同,但是备份和恢复的操作同RDB一样,都是拷贝备份文件,需要恢复时再拷贝到Redis工作目录下,启动系统即加载。
- 正常恢复
- 修改默认的appendonly no,改为yes
- 将有数据的aof文件复制一份保存到对应的目录(查看目录:config get dir)
- 恢复:重启redis然后重新加载
- 异常恢复
- 修改默认的appendonly no,改为yes
- 如遇到aof文件损坏,通过
/usr/local/bin/redis-check-aof --fix appendonly.aof
进行恢复
AOF同步频率设置
可以在redis.config中配置AOF同步的频率,如下:
# appendfsync always
appendfsync everysec
# appendfsync no
appendfsync always:每次写入立即同步
始终同步,每次redis的写入都会立刻记入日志;性能较差但数据完整性比较好
appendfsync everysec:每秒同步
每秒同步,每秒记录日志一次,如果宕机,本秒数据可能丢失;更新的命令会放在内存中AOF缓冲区,每秒将缓冲区的命令追加到AOF文件
appendfsync no:不主动同步
redis不主动进行同步,把同步交给操作系统
AOF优势
- 备份机制更稳健,丢失数据概率更低
- 可读的日志文本,通过操作AOF文件,可以处理误操作
AOF劣势
- 比RDB占用更多的磁盘空间
- 恢复备份速度要慢
- 每次读写都同步的话,有一定的性能压力
- 存在个别bug,造成不能恢复
- AOF文件是一个只进行追加的日志文件
RDB与AOF
- 官方推荐2个都启用。
- 如果对数据不敏感,可以单独用RDB。
- 不建议单独使用AOF,因为可能会出现BUG。
- 如果只是做纯内存缓存,可以都不用。