Redis--RDB机制和AOF机制持久化以及数据备份

Redis只把数据放在内存中,是没有办法应对一些灾难性的故障,如redis挂掉或者redis服务器所在机器没了。这个时候Redis如何应对故障的发生。

解决方式:Redis把内存中的数据存到磁盘中,再从磁盘上备份到其他地方。国外亚马逊的S3,国内阿里云的ODPS。之后可以另外启动一个redis服务器,将备份的数据在拷贝到磁盘,在读入到redis内存中。

 如图:


Redis使用RDB机制和AOF机制进行持久化

如图:



Redis使用RDB机制持久化

一、如何配置RDB持久化机制

1、修改redis.conf配置文件,来配置持久化

save 60 1000   表示每隔60秒如果有100条以上数据发生变化就生成新的dump.rdb文件

save 600 100   表示每隔600秒如果有100条以上数据发生变化就生成新的dump.rdb文件

dump.rdb文件其实就是当前redis内存中完整的数据快照,这个操作也被称之为snapshotting,快照。dump.rdb,每次生成一个新的快照,都会覆盖之前的老快照。

save可以设置多个,就是多个snapshotting检查点,每到一个检查点,就会去check一下,是否有指定的key数量发生了变更,如果有,就生成一个新的dump.rdb文件。也可以手动调用save或者bgsave命令,同步或异步执行rdb快照生成

 



二、RDB持久化机制的工作流程

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

(2)fork一个子进程出来

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

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

 

三、基于RDB持久化机制的数据恢复实验

1、在redis中保存几条数据,立即停掉redis进程,再重启redis,看刚插入的数据是否存在。

2、命令redis-cli SHUTDOW;使用这种方式停掉redis,是一种安全退出的模式,redis在退出的时候会将内存中的数据立即生成一份完整的rdb快照。

3、在redis中再保存几条新的数据,用kill-9粗暴杀死redis进程,模拟redis故障异常退出,导致内存数据丢失的场景。这次就发现,redis进程异常被杀掉,数据没有进dump文件,几条最新的数据就丢失了

4、手动设置一个save检查,save 5 1;写入几条数据,等待5秒钟,会发现自动进行了一次dumprdb快照,在dump.rdb中发现了数据

5、异常停掉redis进程,再重新启动redis,看刚才插入的数据还在。

 

 

Redis使用AOF机制持久化

AOF是AppendOnly File的缩写,是Redis系统提供了一种记录Redis操作的持久化方案,在AOF生成的文件中,将忠实记录发生在Redis的操作,从而达到在Redis服务器重启或者当机之后,继续恢复之前数据状态的机制。

而且即使AOF和RDB都开启的情况下,redis重启的时候,也是优先通过AOF进行数据恢复的,因为AOF数据比较完整

一、AOF持久化的配置

AOF持久化,默认是关闭的,默认是打开RDB持久化。需要在redis.conf配置文件中修改appendonly属性改为yes来打开AOF持久化机制,在生产环境里面,一般来说AOF都是要打开的,不然随时可能丢数据。


打开AOF持久化机制之后,redis每次接收到一条写命令,就会写入日志文件中,数据先写入os cache的,然后每隔一定时间再fsync一下,将数据存入appendonly.aof文件中。

AOF的fsync的三种策略:

(1)always: 每次写入一条数据就执行一次fsync。每次写入一条数据,立即将这个数据对应的写日志fsync到磁盘上去,性能非常非常差,吞吐量很低; 如果确保说redis里的数据一条都不丢,就只能这样做。

mysql --> 内存策略,大量磁盘,QPS(每秒钟的请求数量)大概在1000~2000条

redis --> 内存,磁盘持久化,QPS一般来说,上万条数据数量也没有问题

(2)everysec: 每隔一秒执行一次fsync。每秒将os cache中的数据fsync到磁盘,这个最常用的,生产环境一般都这么配置,性能很高,QPS还是可以上万的

(3)no: 不主动执行fsync。仅仅redis负责将数据写入oscache就撒手不管了,然后后面os自己会时不时有自己的策略将数据刷入磁盘,不可控了。

 

二、AOF持久化的数据恢复实验

1、先仅仅打开RDB,写入一些数据,然后kill-9杀掉redis进程,接着重启redis,发现数据没了,因为RDB快照还没生成

2、打开AOF的开关,启用AOF持久化

3、写入一些数据,观察AOF文件中的日志内容。之后就可以在appendonly.aof文件中看到刚写的日志,它们其实就是先写入os cache的,然后1秒后才fsync到磁盘中,只有fsync到磁盘中了,才是安全的。要不然光是在os cache中,机器只要重启,就什么都没了。

3、kill -9杀掉redis进程,重新启动redis进程,发现数据被恢复回来了,就是从AOF文件中恢复回来的。redis进程启动的时候,直接就会从appendonly.aof中加载所有的日志,把内存中的数据恢复回来。

 

三、AOF持久化的rewrite操作

redis中的数据其实有限的,很多数据可能会自动过期,可能会被用户删除,可能会被redis用缓存清除的算法清理掉。redis中的数据会不断淘汰掉旧的,就一部分常用的数据会被自动保留在redis内存中。

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

redis 2.4之前,需要手动开发脚本crontab,通过BGREWRITEAOF命令去执行AOF rewrite,在redis 2.4之后,会自动进行rewrite操作。可以在redis.conf中,可以配置rewrite策略:

auto-aof-rewrite-percentage100

auto-aof-rewrite-min-size64mb

 

比如说上一次AOF rewrite之后,是128mb,然后就会接着128mb继续写AOF的日志,如果发现增长的比例,超过了之前的100%,256mb,就可能会去触发一次rewrite,但是此时还要去跟min-size,64mb去比较,256mb > 64mb,才会去触发rewrite。

四、AOF破损文件的修复

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

 

注意:AOF和RDB同时工作

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

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

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

4、在有rdb的dump和aof的appendonly的同时,rdb里也有部分数据,aof里也有部分数据,这个时候其实会发现,rdb的数据不会恢复到内存中

 

企业级的数据备份

一、企业级的持久化的配置策略

1、在企业中,RDB的生成策略,用默认的即可。

save 60 10000 :确保RDB最多丢1分钟的数据,就每隔1分钟都生成一个快照。低峰期,数据量很少,也没必要。

2AOF一定要打开,fsync策略选择everysec

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

auto-aof-rewrite-min-size 64mb: 根据你的数据量来定,16mb,32mb

 

二、企业级的数据备份方案

RDB非常适合做冷备,每次生成之后,就不会再有修改了

 

数据备份方案

(1)写crontab定时调度脚本去做数据备份

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

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

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

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

本文是个人在学习redis教程过程中,整理的资料,仅供参考。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值