Redis持久化

Redis持久化

  1. RDB

每间隔一段时间就将内存中的数据集快照写入磁盘,即Snapshot快照,恢复时是将快照文件直接读到内存里。

Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的。

如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。

适合大规模数据,但是可能丢失最后一次数据

  1. AOF

将我们的所有命令都记录下来,history,恢复的时候全部再执行一遍

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

优点:

  1. 每一次修改都会同步,文件完整性更好

  2. 每秒同步一次,可能会丢失一秒的数据

  3. 从不同步,效率最高

缺点:

  1. 相对于数据文件来说,aof远远大于rdb,恢复的速度也比rdb慢

  2. aof运行效率也要比rdb慢,redis默认的配置就是rdb持久化

aof重写

aof默认是文件无限追加,文件会越来越大。

如果大于64mb,那么就会fork新进程重写

如果只做缓存,不需要做持久化。

5、性能建议

因为RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留 save 900 1 这条规则。(900秒内有1个更改就rdb)

如果Enable AoF,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自己的AOF文件就可以了,代价一是带来了持续的IO,二是AOF rewrite 的最后将 rewrite 过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。只要硬盘许可,应该尽量减少AOF rewrite 的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上,默认超过原大小100%大小重写可以改到适当的数值。

如果不Enable AOF,仅靠 Master-Slave Repllcation 实现高可用性也可以,能省掉一大笔IO,也减少了rewrite时带来的系统波动。代价是如果Master/Slave 同时倒掉,会丢失十几分钟的数据,启动脚本也要比较两个 Master/Slave 中的 RDB文件,载入较新的那个,微博就是这种架构。