Redis持久化的意义
主要是为了做容灾,故障恢复。保证高可用性。
Redis的数据如果只存储在内存当中,那如果发生了灾难性故障后,内存里的数据就会全部丢失。导致大量的请求直接涌入数据库当中,造成数据库瞬时间的高并发,数据库扛不住大量请求的处理,就会产生故障,进而导致系统发生故障。
Redis的持久化方式
RDB
定时的全量复制,会将当前redis内存中的所有数据进行备份,生成一份dump.rdb快照文件存入磁盘中。
优点
(1)定时的全量复制,会生成多个数据文件,每个文件代表某个时刻的redis的数据,适合做冷备。
(2)复制是通过fork一个子进程进行处理,因为复制的是当前Redis内部的所有数据,且为异步,可保证redis的高性能。
(3)相对于AOF持久化机制,直接基于RDB数据文件来恢复重启后的redis进程,会更快速。
缺点
(1)会造成一段时间内数据的丢失(因为RDB方式是定时全量复制,可能这段时间内的数据还未备份到rdb文件,就会造成这段时间内数据丢失)。
(2)每次fork子进程执行RDB快照文件生成的时候,如果数据文件过大,会影响客户端提供的服务的暂停时长。
AOF
通过设置,可以让redis在每隔一秒钟,将当前写入的redis命令以append-only(追加)的模式下写入AOF文件。
AOF的每一次的rewrite,并不是基于之前旧的AOF文件指令去进行合并的,而是基于当前redis内存中的数据去进行指令的重新构建。
优点
(1)更好地保证数据的不丢失:因为AOF是将redis的写入命令按每隔1秒的时间进行fsync操作(同步),所以最多丢失1秒钟的数据。
(2)AOF日志文件以append-only模式写入,不是随机写磁盘,减少了磁盘寻址的开销,写入性能高,文件不易破损,即使破损,也易恢复。
(3)AOF有rewrite机制,能够防止AOF日志文件过大导致影响客户端的读写操作。
(4)可以通过修改AOF文件内容,处理因为误删除导致的问题(比如flushall清空redis数据)的紧急修复。
缺点
(1)对于同一份数据,AOF的数据文件大小大于RDB文件大小。
(2)AOF的写QPS性能低于RDB的写QPS性能。
(3)具有一定的脆弱性。比如进行数据恢复,没有恢复一模一样的数据。
RDB和AOF持久化选择
(1)不要只使用RDB,因为可能会丢失很多数据。
(2)也不要只使用AOF,因为AOF不适合做冷备,不能像RDB能够快速恢复数据。
(3)应该综合使用AOF和RDB两种持久化方式。AOF用来保证数据不丢失,作为数据恢复的第一选择。RDB能够在AOF文件丢失或破损的情况下,进行快速恢复。