nosql----redis持久化详解

nosql----redis持久化详解

redis持久化的意义在于故障恢复

        redis的数据是储存在内存的,假如redis突然down掉,又或者服务器主机突然断电故障。这时候内存里面的数据就会全部丢失了。

        这时候大量的请求在缓存中都无法命中,在redis中无法找到缓存数据,这些请求就会去到后方的mysql,持续高压高并发的状态使mysql也陷入崩溃的状态。到这里,就算想恢复redis的数据也做不到了,因为redis的数据就是从mysql来的。这就是缓存的雪崩效应。

持久化就是将储存在内存的数据,保留一份储存在硬盘,以应对灾难性的故障。

一.持久化类型

RDB

        相当于redis里面的数据快照,每隔一段时间把数据库里面的数据进行一次全量快照。当用redis-cli shutdown这种方式来退出redis,redis会立马生成一份当前时刻的rdb文件。

AOF

        redis生成一个AOF文件,当一条新的数据插入redis里面,redis会实时把数据写进AOF文件里面。在这个过程里面,还会经过一个小小的步骤,那就是redis会把数据先写进oscache里面(因为系统写文件一般都是先把数据写进系统缓存中)然后定期执行一次fsync操作把数据写进文件里面,也就是磁盘里面。

        当redis里面的数据库达到了redis设置的内存大小的限制时候,会用淘汰算法释放一些数据。而AOF里面记录的是redis的所有写的操作,当这个AOF文件的大小也达到一定的程度的时候,redis会根据现有的数据,新建一份AOF文件,然后把旧的AOF文件删除掉,后续的记录工作全部是在新的AOF文件上执行,这个是redis的rewrite操作。

        AOF机制对每条写入的命以append-only的模式写入到日志文件中,当redis重启的时候,可以通过回放AOF日志中的写入指令去重构整个数据库。

        如果想单纯将redis作为缓存系统来使用,可以把AOF和RDB全部禁止掉,而AOF和RDB都可以把内存中的数据写进磁盘里面。如果同时开启RDB和AOF机制,redis会默认使用AOF来恢复数据,因为AOF相对来说更加完善。

二.两种持久化机制的优缺点

RDB:

优点:

1.RDB机制非常适合做冷备份,可以定制备份出一份数据文件,然后把这份数据文件传输到云服务器中作为数据备份。相对于AOF来说,RDB由redis定期生成一个备份文件,每个文件都代表着当前时刻的全部数据,操作起来比较方便。RDB每次备份出来的dump.rdb都会覆盖掉原本的rdb文件,因此想要备份每个时刻的rdb文件,需要定期得修改rdb文件的名称并推送到云服务中。如果AOF想每个时刻都备份一份数据的话,还需要自行编写脚本。

2.RDB机制对redis的性能影响不大,因为RDB是每隔一段时间在会把内存的数据写进磁盘里面,而AOF则是相对来说比较频繁地往磁盘里面写入数据,其中会有时间开销。

3.直接基于RDB机制来恢复redis速度更快,因为RDB本身就是一份数据文件,而AOF是redis写的操作。

缺点:

1.RDB机制一般是没五分钟备份一次,如果redis宕机,那么可能丢失近五分钟的数据,不适合作为第一恢复方案。

2.执行生产数据快照文件的时候,假如数据量特别大,可能会导致客户端提供服务暂停几毫秒甚至几秒。

AOF

优点:

1.AOF可以更好地保护数据不丢失,一般AOD会没隔1秒,通过一个后台线程执行一次fsync操作,当redis宕机,最多丢失1秒钟的数据。

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

3.AOF日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写,因为rewrite log的时候,会基于现有数据创建新的日志文件,这过程旧的日志文件继续写入,当新日志ready的时候,进行日志交替即可。

4.当操作人员不小心flushall掉所有数据,这个时候可以把AOF文件备份出来,把里面的flushall操作删掉,然后重新导入到redis中,即可完成数据恢复

缺点:

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

2.AOF开启后,支持的写入QPS会比RDB支持的写入QPS低,因为AOF一般配置fsync每隔一秒执行一次,其中会有性能消耗。

3.以前AOF发生过bug,就是通过AOF记录的日志没有恢复出与之前一模一样的数据出来。所以基于命令日志的这种备份模式相对于RDB这种数据备份模式来说,还是比较脆弱的,容易出现预期之外的bug。

所以综合来说,一般在做redis持久化的时候,要把RDB和AOF两种模式同时打开,以此来弥补相对的缺点。

三.模拟故障

RDB机制

在配置文件中,通过save条目来配置RDB的检查点

save  每隔多少秒  有多少个key发生变化

满足条件则生成一份rdb快照文件。

 

模拟在redis中插入条目

redis-cli  shutdown  安全停掉redis

redis-server  /usr/local/redis/etc/redis.conf重启redis

数据还在

此时插入新的数据

粗暴杀死redis模拟redis故障

ps -ef | grep redis

kill -9 34397

重启redis

数据丢失了

在redis配置文件中添加监控点

save 5 1

重启redis

再次插入新的数据

等待五秒,并杀死redis。

重启redis

数据没有丢失

 

原文地址:https://www.cnblogs.com/QicongLiang/p/10174517.html