redis持久化备份

最近在搞redis备份,所以就记录一下。大家都知道redis持久化有两种方式RDB与
AOF。RDB就是按照一定规则,符合规则就执行快照,如果在下一次执行快照执行前服务
器挂了,那就惨了,距离上一次快照到当前服务器挂掉这一段时间的数据就没了,所以
RDB适合做一些不太重要的数据备份;AOF就是当客户端输入命令时,redis在执行命令
同时会将该命令写入备份文件中,实时性备份,不会像RDB那样丢数据,但是性能可能
比RDB稍弱,不过都在可接受范围内。RDB与AOF备份的文件夹是同一个文件夹以及
RDB与AOF备份后的文件名,在redis配置文件(redis.conf)可以查看:
    dir /usr/local/redis/db/    //RDB、AOF备份文件夹
    dbfilename dump.rdb       //RDB备份文件名
    appendfilename "appendonly.aof" //AOF备份文件名


    1 RDB:当符合一定条件时,redis会自动生成快照,会在以下几种情况生成
    快照:
        1)根据规则自动生成快照(用户自定义的条件,在redis.conf配置)
        2)用户执行SAVE或BGSAVE
        3)执行flushall
        4)执行主从复制的时候(replication)

    解释
    1) 自定义条件,可以在redis的配置文件(redis.conf)中配置,
    找到如下代码:
        save 900 1    //900秒内至少执行1次,就会生成快照
        save 300 10   //300秒内至少执行10次,就会生成快照
        save 60 10000 //60秒内至少执行10000,就会生成快照
    【注】:这里可以配置多个条件,但是他们之间都是“或”的关系,
    当配置好这些条件后,redis自动会判断,达到这些条件会自动生成
    快照。
    2)在终端执行redis-cli,然后执行SAVE或者BGSAVE,redis会
    立即去生成快照,在做定时备份的时候,其实脚本中核心备份代码,
    也是"redis-cli SAVE""redis-cli BGSAVE" 。SAVE与
    BGSAVE的区别在于,SAVE:同步阻塞,在执行SAVE命令时,redis
    直接就去执行备份同时不会接受执行客户端发来的请求;而BGSAVE则
    会异步在后台去执行备份,客户端发来请求接受执行不影响,如何查
    看BGSAVE是否完成,执行LASTSAVE返回最后一次备份完成时间戳。
    3)flushall,会删除redis库中所有内容,同时不管你是否触发在
    redis中自定的多个save条件,只要自定义条件不是空,redis就会
    执行一次快照。
    【注】:这里flushall快照指的是,会将备份文件中所有内容也全部
    同步删除,所以执行这个命令一定要注意,当然,如果你开启了aof,
    这个时候还是可以恢复的,这个后面讲。
    4)在执行主从复制初始化的时候,无论是否设置自定义条件,都会生
    成快照,这个详细的我会写在主从复制那篇文章。

 2  AOF:当客户端执行一条命令时候,同时会把该命令写入AOF的备份文
 件中,等重启redis时候,会执行该备份文件中所有命令同步到内存中,
 对重要的数据可以用到此备份方式,当然性能会比RDB稍弱,不过都在可
 接受范围内,默认redis是不会开启AOF备份的,想要开启就要去
 redis.conf中找到如下:
     appendonly no -->appendonly yes //改为yes,开启AOF
     appendfilename "appendonly.aof" //aof备份文件

   关于AOF同步硬盘数据的问题:客户端每次执行操作时候,AOF都会将命令记录在
   AOF备份文件中,事实上由于操作系统缓存机制,数据并没有真正写入磁盘,而是
   进入了系统的硬盘缓存,默认情况下系统30秒执行一次同步,如果30秒内系统异常
   退出,则会导致内容丢失,一般启用AOF持久化都很难容忍这样的损失,这就要求
   redis在写入AOF文件后主动要求系统将缓存内容同步到硬盘中,在redis配置文件
   中通过参数:
       appendfsync everysec //每秒执行一次同步操作(推荐,默认)
       appendfsync always //每次执行写入都会同步,最慢
       appendfsync no //系统自己处理,30秒一次

 【注】:如果同时开启了RDB与AOF,当恢复数据的时候会优先以AOF,这里有人可
 能会问,如果之前一直没有开启AOF而是用了一段时间RDB之后才想起来去开启AOF,
 那之前的数据AOF是不是会丢失?这里也有解决办法,开启AOF时候,先将以前数据
 同步到AOF备份文件中,然后后面数据会自动追加到该文件后面。 

  命令开启:redis-cli config set appendonly yes,**不会丢**
  修改配置文件开启:appendonly yes,   会丢

  方法一:先备份RDB的备份文件,然后执行命令开启,
  redis-cli config set appendonly yes,然后会将以前数据操作同步AOF
  备份文件,这时去修改redis配置文件appendonly yes,然后重启redis
  方法二:先备份RDB的备份文件,然后执行bgrewriteaof手动同步以前数据到     AOF备份文件,然后停止redis,这时去修改redis配置文件appendonly yes,
  然后重启redis


 【题外话】flushall在AOF备份模式下恢复,上面我提到如果没有开启AOF,单单使
 用了RDB情况下使用了flushall,那备份快照中内容也会被删除,但是如果开启了
 AOF,由于AOF只是记录命令,就算你执行了flushall命令,也不会删除AOF备份文
 件中保存的命令,只会在AOF备份文件中新加一条命令,flushall,这个时候你去
 AOF备份文件中将此命令删除,然后重启redis,redis会重新读取AOF备份内容加载
 到内存,数据又回来了!!!虚惊一场~~~,不过还是不要在服务器上使用flushall
 这个命令。   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值