Redis有两种持久化方案,分别是RDB和AOF,RDB是Redis默认开启的数据持久化的方式,它是通过手动(save-阻塞式,bgsave-异步)或周期性方式保存Redis中的key/value的一种机制,系统启动时会自动开启这种方式的持久化机制.
如何触发RDB方式持久化:
- 基于配置文件中的save规则周期性的执行持久化.
- 手动执行了shutdown操作会自动执行RDB方式持久化.
- 手动调用了save或bgsave指令执行数据持久化.
- 在Master/Slave架构下,当有新的Slave连接Master时,Master会对数据进行RDB方式持久化.
save和bgsave有什么不同:
save命令执行一个同步保存操作,将当前Redis实例的所有数据快照(snapshot)以RDB文件的形式保存到硬盘.
bgsave命令执行之后立即返回OK,然后Reids Fork 出一个新子进程,原来的Redis进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出.
RDB持久化机制有哪些优点:
- RDB文件是经过压缩的二进制文件,占用空间很小,它保存了Redis某个时间点的数据集,很适合做冷备.
- RDB非常适合用于灾难恢复,它只有一个文件,并且内容都非常紧凑,可以(在加密后)将它传送至别的数据中心.
- RDB方式持久化性能较好,执行持久化时可以Fork一个子进程,由子进程处理保存工作,父进程无须执行任何磁盘I/O操作.
RDB持久化机制有哪些缺点:
- RDB方式在服务器发生故障时容易造成数据丢失.实际项目中,我们可以通过配置来控制持久化的频率,但是,如果频率太频繁,可能会对Redis性能产生影响,所以通常可能设置至少5分钟才保存一次快照,这时如果Redis出现宕机等情况,则意味着最多可能丢失5分钟的数据.
- RDB方式使用Fork子进程进行数据的持久化,子进程的内存是Frok操作时父进程中数据快照的大小,如果数据快照比较大的话,Fork开辟内存时,会比较耗时,同时这个Fork是同步操作,所以,这个过程会导致父进程无法对外提供服务.
- RDB持久化过程中Fork操作,可能会导致内存占用加倍,Linux系统Fork子进程采用的是copy-on-write的方式(写时复制,修改前先复制),在Redis执行RDB持久化期间,如果client写入数据频繁,那么将增加Redis占用的内存,最坏情况下,内存的占用将达到原先的2倍.
AOF方式数据持久化机制默认是关闭的,它是通过记录写操作日志的方式,实现Redis数据持久化的一种机制.
如何理解AOF方式中的rewrite操作:
Redis中可以存储的数据是有限的,很多数据可能会自动过期,也可能会被用户删除或被Redis用缓存清除的算法清理掉,也就是说Redis中会不断淘汰掉旧的数据,只有一部分常用的数据会被自动保留在Redis内存中,所以很多之前已经被处理掉的数据,对应的写日志还停留在AOF中,AOF日志文件就 一个,会不断的膨胀,最后导致文件很大.
所以,AOF会自动在后台每隔一定时间做rewrite操作.比如日志里已经存放了100W数据的写日志,但Redis内存现有10W数据,于是,基于内存中当前的10W数据构建一套最新的日志,然后到AOF文件中,覆盖之前的老日志,从而,确保AOF日志不会太大,保持跟Redis内存数据量一致.
AOF有哪些优点:
- AOF比RDB更加可靠.你可以设置不同的fsync策略(no、everysec和always).默认是everysec,在这种配置下,Redis仍然可以保持良好的性能,并且就算计算机发生宕机,最多也只会丢失一秒钟的数据.
- AOF文件是一个基于纯追加模式的日志文件.即使日志因为某些原因而包含了未写入完整的命令(比如写入时磁盘已满,写入中途宕机等),我们也可以使用redis-check-aof工具也可以轻易地修复这种问题.
- 当AOF文件太大时,Redis会自动在后台进行重写,重写后的新AOF文件包含了恢复当前数据所需的最小命令集合.整个重写是绝对安全,因为重写是在一个新的文件上进行,同时Redis会继续往旧的文件追加数据.当新文件重写完毕,Redis会把新旧文件进行切换,然后开始把数据写到新文件上.
- AOF文件有序地保存了对数据库执行的所有写入操作,以Redis协议的格式保存,因此AOF文件的内容非常容易被人读懂,对文件进行分析也很轻松,如果你不小心执行了FLUSHALL命令把所有数据刷掉了,但只要AOF文件没有被重写,那么只要停止服务器,移除AOF文件末尾的FLUSHALL命令,并重启Redis,就可以将数据恢复到FLUSHALL执行之前的状态.
AOF持久化机制有哪些缺点:
对于相同的数据集,AOF文件的大小一般会比RDB文件大,根据所使用的fsync策略,AOF的速度可能会比RDB慢,通常fsync设置为每秒一次就能获得比较高的性能,而关闭fsync可以让AOF的速度和RDB一样快,AOF可能会因为个别命令的原因,导致AOF文件在重新载入时,无法将数据集恢复成保存时的模样.
如何选择Redis的持久化方式:
- 不要仅仅使用RDB,因为这样会导致丢失很多数据.
- 也不要仅仅使用AOF,因为AOF做冷备没有RDB做冷备进行数据恢复快,并且RDB简单粗暴的数据快照方式更加健壮.
- 综合使用AOF和RDB两种持久化机制,用AOF来保证数据不丢失,作为数据恢复的第一选择;用RDB来做不同程度的冷备.