Redis持久化之 --- AOF

Redis的持久化AOF(Append only File )

因为RDB的不完美,有可能会丢失一部分数据的问题(最多丢失15分钟的数据,现在最多丢失1秒钟的数据)AOF是一种文件,他会记录(写操作)你的操作语句。

以日志的形式来记录每一个写操作,将Redis执行过的所有写指令记录下来(读操作不会记录)
只需追加文件但不可以改写文件,Redis启动之初会读取该文件重新构建数据
换言之
Redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

AOF保存的是appendonly.app 文件

AOF启动/修复/恢复

正常修复:
启动:修改appendonly 默认值,默认值是no 修改为yes。
将有数据的aof文件复制一份保存到对应目录(config get dir 也就是Redis的安装路径)
恢复:重启Redis 然后重新加载
异常修复:
启动:修改appendonly 默认值,默认值是no 修改为yes。
备份被写坏的AOF文件
修复:Redis-check-aof --fix 进行修复(Redis-check-aof --fix appendonly.aof 是修复appendonly.aof 文件的)
恢复:重启Redis然后重新加载

Rewrite

Rewrite是什么鬼:
AOF采用文件追加的方式,文件会越来越大为避免出现这种情况,新增了一个重写的机制,当AOF文件的大小超过了所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令,可以使用命令 bgrewrieaaof
重写原理:
AOF文件持续增长而过大时,会fork出一天新进程来将文件重写(也是先写临时文件最后在rename)
遍历新进程的内存中数据,每条记录有一条set语句。重写aof文件的操作,并没用读取旧的aof文件。
而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点相似。
触发机制
Redis会记录上次重写时的aof大小,默认配置是当aof文件大小的上次rewrite后的大小的一倍且文件大于64M时会触发。
这是Redis.conf配置的位置:

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb (一般起步都是3GB)

优势

每秒同步
appendfsync always 同步持久化 每次发生数据变更会被立即记录到磁盘,性能比较差但数据完整性好
每秒修改同步:
appendfsync everysec 异步操作,每秒记录 如果一秒内宕机,有数据丢失
不同步:
appendfsync no 从不同步

劣势

相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb
aof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同。

总结

  1. AOF文件时一个只进行追加的日志文件
  2. Redis可以再AOF文件体积变得过大时,自动的在后台对AOF进行重写
  3. AOF文件有序的保存了对数据库执行的所有写入操作,这些写入操作以Redis协议的格式保存,因此AOF文件的内容非常容易被人读懂,对文件进行分析也很轻松。

  1. 对于相同的数据集来说,AOF文件的体积通常要大于RDB
  2. 根据所使用的fsync策略,AOF的速度可能会慢于RDB5. 根据所使用的fsync策略,AOF的速度可能会慢于RDB

RDB和AOF的持久化总结

Rdb持久化方式能够在指定的时间间隔能对你的数据进行快照存储。

AOF持久化方式记录每次对服务器的写操作,当服务器重启的时候会重新执行这些命令恢复原始的数据
AOF命令以Redis协议追加保存每次写的操作到文件末尾,Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大

只做缓存:如果你希望你的数据在服务器运行的时候存在,你也可以不适用任何持久化方式,在这种情况下,当Redis重启的时候会先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据要完整。

同时开启两种持久化方式:RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件,那要不要只是使用AOF呢?当然是不建议,因为RDB更适合用于备份 数据库(AOF在不断变化,不好备份)
快速重启,而且不会有AOF可能潜在的bug,留着作为一个万一的手段。

性能建议

因为RDB文件只用作后备用途,建议只在slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留save 900 1 这条规则。

如果Enabled AOF,好处是在恶劣情况下也会丢失不超过两秒数据,启动脚本较简单只load自己的AOF文件就可以了,

代价一是带来了持续的IO,二是AOF rewrite的最后将rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。

只要硬盘许可,应该尽量减少AOF rewrite的频率,AOF重写的基础大小默认值64M太小的,可以设到5G以上。默认超过原大小1000%

大小时重写可以改到适当的数值。

如果不Enable AOF,仅靠Master-SlaveReplication实现高可用性也可以。能省掉一大笔IO也减少了rewrite时带来的系统波动。

代价是如果Master/Slave同时倒掉,会丢失十几分钟的数据,启动脚本也要比较两个Master/Slave中的RDB文件,载入较新的那个。

新浪微博就选用了这种架构。

rdb文件 与 aof文件是可以共同存在的。

两个文件同时存在时,首先找到的是aof文件。

猜你喜欢

转载自blog.csdn.net/liguangix/article/details/87462471