Redis(2)Redis的持久化

RDB

RDB持久化机制,对redis中的数据执行周期性的持久化。

RDB持久化配置:

在redis.conf文件去配置持久化。

save 60 1000

每隔60s,如果有超过1000个key发生了变更,那么就生成一个新的dump.rdb文件,就是当前redis内存中完整的数据快照。

也可以手动调用save或者bgsave命令,同步或异步执行rdb快照生成。

save可以设置多个,就是多个snapshotting检查点,每到一个检查点,就会去check一下,是否有指定的key数量发生了变更,如果有,就生成一个新的dump.rdb文件。

RDB的工作流程:

1、redis根据配置自己尝试去生成rdb快照文件。

2、fork一个子进程出来。

3、子进程尝试将数据dump到临时的rdb快照文件中。

4、完成rdb快照文件的生成之后,就替换之前的旧的快照文件。

2.1.3 RDB的优缺点

RDB的优点:

1、RDB会生成多个数据文件,每个数据文件都代表了某一个时刻中redis的数据,这种多个数据文件的方式,非常适合做冷备,可以将这种完整的数据文件发送到一些远程的安全存储上去。

2、RDB对redis对外提供的读写服务,影响非常小,可以让redis保持高性能,因为redis主进程只需要fork一个子进程,让子进程执行磁盘IO操作来进行RDB持久化即可。

3、相对于AOF持久化机制来说,直接基于RDB数据文件来重启和恢复redis进程,更加快速。

RDB的缺点:

1、如果想要在redis故障时,尽可能少的丢失数据,那么RDB没有AOF好。一般来说,RDB数据快照文件,都是每隔5分钟,或者更长时间生成一次,这个时候就得接受一旦redis进程宕机,那么会丢失最近5分钟的数据。

2、RDB每次在fork子进程来执行RDB快照数据文件生成的时候,如果数据文件特别大,可能会导致对客户端提供的服务暂停数毫秒,或者甚至数秒。

AOP

AOF机制对每条写入命令作为日志,以append-only的模式写入一个日志文件中。

AOF持久化配置:

AOF持久化,默认是关闭的,默认是打开RDB持久化。

appendonly yes,可以打开AOF持久化机制。

打开AOF持久化机制之后,redis每次接收到一条写命令,就会写入日志文件中,当然是先写入os cache的,然后每隔一定时间再fsync一下。而且即使AOF和RDB都开启了,redis重启的时候,也是优先通过AOF进行数据恢复的,因为aof数据比较完整。

AOF的fsync策略,有三种策略可以选择,

always:每次写入一条数据,立即将这个数据对应的写日志fsync到磁盘上去,性能非常非常差,吞吐量很低。

everysec:每秒将os cache中的数据fsync到磁盘,这个最常用的,生产环境一般都这么配置,性能很高。

no:仅仅redis负责将数据写入os cache就不管了,然后后面os自己会时不时有自己的策略将数据刷入磁盘。

AOF rewrite:

AOF会自动在后台每隔一定时间做rewrite操作,比如日志里已经存放了针对100w数据的写日志了。redis内存只剩下10万。基于内存中当前的10万数据构建一套最新的日志到AOF中覆盖之前的老日志,确保AOF日志文件不会过大,保持跟redis内存数据量一致。

在redis.conf中,可以配置rewrite策略。

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

比如说上一次AOF rewrite之后,是128mb,然后就会接着128mb继续写AOF的日志,如果发现增长的比例,超过了之前的100%,256mb,就可能会去触发一次rewrite。

但是此时还要去跟min-size,64mb去比较,256mb > 64mb,才会去触发rewrite。

1、redis fork一个子进程。

2、子进程基于当前内存中的数据,构建日志,开始往一个新的临时的AOF文件中写入日志。

3、redis主进程,接收到client新的写操作之后,在内存中写入日志,同时新的日志也继续写入旧的AOF文件。

4、子进程写完新的日志文件之后,redis主进程将内存中的新日志再次追加到新的AOF文件中。

5、用新的日志文件替换掉旧的日志文件。

AOF破损文件的修复:

如果redis在append数据到AOF文件时,机器宕机了,可能会导致AOF文件破损。用redis-check-aof --fix命令来修复破损的AOF文件。

AOF的优点:

1、AOF可以更好的保护数据不丢失,一般AOF会每隔1秒,通过一个后台线程执行一次fsync操作,最多丢失1秒钟的数据。

2、AOF日志文件以append-only模式写入,所以没有任何磁盘寻址的开销,写入性能非常高,而且文件不容易破损,即使文件尾部破损,也很容易修复。

3、AOF日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写。

4、AOF日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。

AOF的缺点:

1、对于同一份数据来说,AOF日志文件通常比RDB数据快照文件更大。

2、AOF开启后,支持的写QPS会比RDB支持的写QPS低,因为AOF一般会配置成每秒fsync一次日志文件,当然,每秒一次fsync,性能也还是很高的。

3、以前AOF发生过bug,就是通过AOF记录的日志,进行数据恢复的时候,没有恢复一模一样的数据出来。

4、数据恢复的时候,会比较慢,还有做冷备,定期的备份,不太方便。

RDB和AOF的选择

AOF和RDB同时工作:

1、如果RDB在执行snapshotting操作,那么redis不会执行AOF rewrite; 如果redis再执行AOF rewrite,那么就不会执行RDB snapshotting。

2、如果RDB在执行snapshotting,此时用户执行BGREWRITEAOF命令,那么等RDB快照生成之后,才会去执行AOF rewrite。

3、同时有RDB snapshot文件和AOF日志文件,那么redis重启的时候,会优先使用AOF进行数据恢复,因为其中的日志更完整。

如何选择持久化机制:

综合使用AOF和RDB两种持久化机制,用AOF来保证数据不丢失,作为数据恢复的第一选择; 用RDB来做不同程度的冷备,在AOF文件都丢失或损坏不可用的时候,还可以使用RDB来进行快速的数据恢复。

数据恢复具体操作:

停止redis,关闭aof,拷贝rdb备份,重启redis,确认数据恢复,直接在命令行热修改redis配置,打开aof,这个redis就会将内存中的数据对应的日志,写入aof文件中,此时aof和rdb两份数据文件的数据就同步了。

数据备份和数据恢复

持久化的配置策略:

RDB的生成策略,用默认的。

save 60 10000:如果你希望尽可能确保说,RDB最多丢1分钟的数据,那么尽量就是每隔1分钟都生成一个快照。

AOF一定要打开,fsync,everysec。

auto-aof-rewrite-percentage 100: 就是当前AOF大小膨胀到超过上次100%,上次的两倍。

auto-aof-rewrite-min-size 64mb: 根据数据量来定。

数据备份方案:

1、写crontab定时调度脚本去做数据备份。

2、每小时都copy一份rdb的备份,到一个目录中去,仅仅保留最近48小时的备份。

3、每天都保留一份当日的rdb的备份,到一个目录中去,仅仅保留最近1个月的备份。

4、每次copy备份的时候,都把太旧的备份给删了。

5、每天晚上将当前服务器上所有的数据备份,发送一份到远程的云服务上去。

数据恢复方案:

1、如果是redis进程挂掉,那么重启redis进程即可,直接基于AOF日志文件恢复数据。

2、如果是redis进程所在机器挂掉,那么重启机器后,尝试重启redis进程,尝试直接基于AOF日志文件进行数据恢复。

AOF没有破损,也是可以直接基于AOF恢复的。

AOF append-only,顺序写入,如果AOF文件破损,那么用redis-check-aof fix。

3、如果redis当前最新的AOF和RDB文件出现了丢失/损坏,那么可以尝试基于该机器上当前的某个最新的RDB数据副本进行数据恢复。

猜你喜欢

转载自blog.csdn.net/qq40988670/article/details/86595711