本文链接:http://www.cnblogs.com/zhenghongxin/p/9050219.html

  • 使用两种备份方案

备份方案选择RDB和AOF同时进行备份,必须打开AOF的持久化机制,除非能接受在故障环境下丢失几分钟的数据。

在redis重启的时候,是优先通过AOF进行数据恢复的,因为AOF数据比较完整。

  • RDB的生成策略

要修改的是该条命令:

save  

该条命令是60秒内,如果有1万条命令执行,那么就进行快照备份。这个值略大,可以根据自己的业务量而定,可以调小至1000。但也同时意味着,在一分钟内,如果命令执

行了999条,且在最后一秒redis挂掉,该分钟内的命令将会全部丢失。

注意不要用:redis-cli SHUTDOWN
这样的方式去测试,这是一种安全退出的模式,redis会安全生成dump.rdb

它的工作流程:

()redis根据配置自己尝试去生成rdb快照文件
()fork一个子进程出来
()子进程尝试将数据dump到临时的rdb快照文件中
()完成rdb快照文件的生成之后,就替换之前的旧的快照文件dump.rdb,每次生成一个新的快照,都会覆盖之前的老快照
  • AOF的生成策略

当AOF开启之后,redis每次接收到一条写命令,就会写入日志文件中,先写入系统的 os cache中,然后隔一段时间再fsync一下。

 fsync的策略有三种:

always: 每次写入一条数据,立即将这个数据对应的写日志fsync到磁盘上去,性能非常非常差,吞吐量很低; 
     如果说确保说redis里的数据一条都不丢,那就只能这样了 everysec: 每秒将os cache中的数据fsync到磁盘,这个最常用的,生产环境一般都这么配置,性能很高,QPS还是可以上万的 no:就是直接写入os cache就不管了,让linux自带的机制去将数据刷入磁盘,这样很不可控

因此我们要配置为everysec。

 接着配置两条命令:

auto-aof-rewrite-percentage
auto-aof-rewrite-min-size 64mb

redis 2.4之前,还需要手动,开发一些定时任务脚本,通过BGREWRITEAOF命令去执行AOF rewrite,但是redis 2.4之后,会自动进行rewrite操作

也就是说在上一次AOF rewrite之后,日志大小是128mb,接着再往里面写日志,当总日志大小增长的比例,超过了之前的100%,即达到256mb后,就会触发rewrite操作。

注意,此时还要跟 auto-aof-rewrite-min-size 比较大小,256M 大于 64m,可以触发rewrite操作。这两条命令,可以根据业务进行调节大小,或者保持默认值

  •  定时任务备份方案(重要)

并不是说让redis自动进行持久化备份就可以的,而是要另开脚本,进行更细致的备份。

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

 * * * * sh /usr/local/redis/copy/redis_rdb_copy_hourly.sh

redis_rdb_copy_hourly.sh

#!/bin/sh 

cur_date=`date +%Y%m%d%k`       # 年月日时进行备份
rm -rf /usr/local/redis/snapshotting/$cur_date # 先删除原有日期底下的备份目录文件
mkdir /usr/local/redis/snapshotting/$cur_date # 创建该目录
cp /var/redis//dump.rdb /usr/local/redis/snapshotting/$cur_date #将快照备份 del_date=`date -d -48hour +%Y%m%d%k` # 48小时前的目录文件名
rm -rf /usr/local/redis/snapshotting/$del_date # 删除48小时前的目录

 2 )每天copy一次备份

  * * * sh /usr/local/redis/copy/redis_rdb_copy_daily.sh

redis_rdb_copy_daily.sh

#!/bin/sh 

cur_date=`date +%Y%m%d`  #年月日进行备份
rm -rf /usr/local/redis/snapshotting/$cur_date #先删除原有的目录
mkdir /usr/local/redis/snapshotting/$cur_date #创建该目录
cp /var/redis//dump.rdb /usr/local/redis/snapshotting/$cur_date //备份cp del_date=`date -d -1month +%Y%m%d` #仅保留近一个月的数据
rm -rf /usr/local/redis/snapshotting/$del_date #删除

3)每天一次将所有数据上传一次到远程的云服务器上去

原理跟第2点一样,只是不是用cp,而是用scp或rsync等命令将文件备份到远程安全服务器

以上只给了rdb的备份,aof的备份脚本基本一致。

  •  数据恢复方案(重要)

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

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

   如果AOF没有破损,可以直接基于AOF恢复的

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

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

     找到RDB最新的一份备份,小时级的备份可以了,小时级的肯定是最新的,copy到redis里面去,就可以恢复到某一个小时的数据

(4)如果当前机器上的所有RDB文件全部损坏,那么从远程的云服务上拉取最新的RDB快照回来恢复数据

恢复的过程:

(1)优先用appendonly.aof去恢复数据

(2)停止redis,关闭aof (为什么要关闭?如果不关闭,启动redis后,redis会生成一份新的可能为空的aof强行覆盖目录下的aof,导致恢复失败)

(3)拷贝备份文件,重启redis

(4)命令行修改redis配置,开启aof (redis config set )

-------------------------------------------------------------------------------------

AOF的重写机制

随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入AOF重写机制压缩文件体积。AOF文件重写是把Rdis进程内的数据转化为写命令同步到

新AOF文件的过程。

重写后的AOF文件为什么可以变小?有如下原因:

(1)进程内已经超时的数据不再写入文件。

(2)旧的AOF文件含有无效命令,如del key1、hdel key2、srem keys、set a111、set a222等。重写使用进程内数据直接生成,这样新的AOF文件只保留最终数据的写入命令。

(3)多条写命令可以合并为一个,如:lpush list a、lpush list b、lpush list c可以转化为:lpush list a b c。为了防止单条命令过大造成客户端缓冲区溢出,对于list、set、hash、zset等类型操作,以64个元素为界拆分为多条。

(4)AOF重写降低了文件占用空间,除此之外,另一个目的是:更小的AOF文件可以更快地被Redis加载。

redis 数据备份持久化方案的更多相关文章

  1. Redis数据备份和重启恢复

    一.对Redis持久化的探讨与理解 目前Redis持久化的方式有两种: RDB 和 AOF 首先,我们应该明确持久化的数据有什么用,答案是用于重启后的数据恢复. Redis是一个内存数据库,无论是RD ...

  2. Redis数据备份、安全、管理服务器笔记

    Redis 数据备份与恢复 Redis SAVE 命令用于创建当前数据库的备份. 实例 redis > SAVE OK 恢复数据 如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 ...

  3. 【转】Redis数据备份和重启恢复

    一.对Redis持久化的探讨与理解 目前Redis持久化的方式有两种: RDB 和 AOF 首先,我们应该明确持久化的数据有什么用,答案是用于重启后的数据恢复.Redis是一个内存数据库,无论是RDB ...

  4. REDIS数据备份集群部署和双集群同步工具redis-migrate-tool

    REDIS 版本 < 4.0 笔者用的是 v=3.0.7 REDIS集群创建镜像:registry.cn-shenzhen.aliyuncs.com/cp_m/redis-trib:0.1.3 ...

  5. [Redis] redis数据备份恢复与持久化

    数据库备份,使用save命令,将会在redis的安装目录中生成dump.rdb 例如:在我的目录下 redis/src/dump.rdb 使用命令config get dir,获取当前redis的安装 ...

  6. redis之(十二)redis数据的持久化

    [一]redis的数据为什么要持久化 --->redis的存取数据性能高,是由于将所有数据都存储在内存中.当redis重启的时候,存储在内存中的数据就容易丢失. --->把redis作为数 ...

  7. (三)Redis两种持久化方案

    Redis的持久化策略:2种 RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘.RDB是Redis默认采用的持久化方 ...

  8. redis数据备份还原

    安装ruby yum install ruby rubygems ruby-devel -y 安装rvm gpg2 --keyserver hkp://pool.sks-keyservers.net ...

  9. Unity常见的三种数据本地持久化方案

    做游戏的时候常常会有数据配置或者存读档的需求,本文整理了常用的几种解决方案,分别是Unity自带的PlayerPrefs类,XML文件和Json文件. 一. PlayerPrefs 这是Unity自带 ...

随机推荐

  1. Spring框架的AOP技术(注解方式)

    1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包 * 先引入Spring框架开发的基本开发包 * 再引入Spring框架的AOP的开发包 * spring的传统AOP的开发的包 * sp ...

  2. 官网类原型模板分享——Apple

    苹果公司是美国一家高科技公司,引领全球数码产品设计潮流,是世界最具价值的品牌. 此原型正是取自苹果公司官网,网站主要以展示产品为主,排版方式采用大图配简练的文字,清爽简洁的同时突出产品优势,增大产品的 ...

  3. 使用delphi 开发多层应用(二十二)使用kbmMW 的认证管理器

    从kbmmw 4.4 开始,增加了认证管理器,这个比原来的简单认证提供了更多的功能.细化了很多权限操作. 今天对这一块做个介绍. 要做一个认证管理,大概分为以下5步: 1.  定义你要保护的资源,一般 ...

  4. 594. Longest Harmonious Subsequence

    方法一:用一个map来辅助,代码简单,思路清晰 static int wing=[]() { std::ios::sync_with_stdio(false); cin.tie(NULL); ; }( ...

  5. js如何实现网站title的滚动效果

    var text=document.title;//获得页面的标题            var timerID;//定时器            function newtext() {       ...

  6. s111 stark组件

    内容回顾: 1. 类当做key 2. django中的model所在app名称.以及小写类名. def index(request): # print(m1.UserInfo,m1.UserInfo. ...

  7. modelsim编译altera的库

    http://www.cnblogs.com/LJWJL/p/3515586.html 在modelsim的安装目录下,把配置文件modelsim.ini的只读属性去掉,然后在modelsim中运行T ...

  8. Windows10+Python3+BeautifulSoup4 安装

    用正则表达式来提取网页中的内容是相当麻烦的,这里介绍一个可以从HTML或XML文件中提取数据的Python库:Beautiful Soup.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的 ...

  9. setTimeout问题

    function fn(argu1){ alert(argu1); } setTimeout(fn, 1000, 12); setTimeout从第三个参数开始,之后的参数都是fn的.fn不用加(), ...

  10. 手动设置3G的wifi迷你无线路由

    1.插入中兴的3G无线网卡,终端上显示如下内容: ~ >: usb 1-1.3: new full speed USB device number 11 using s3c2410-ohci u ...