首页 > 其他 > 详细

reids - 持久化

时间:2020-05-11 13:11:41      阅读:52      评论:0      收藏:0      [点我收藏+]

持久化

持久化类型

  • RDB
    • 全量备份
    • 在指定的时间间隔内生成数据集的时间点快照
  • AOF
    • 增量备份
    • 记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。
    • 可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。
  • AOF+RDB
    • 还原优先级: AOF>RDB

RDB

  • 保存文件名:dump.rdb

  • 命令:

    save 60 1000
    # 60秒内有至少有1000个键被改动则自动保存一次数据集
    
    • SAVE:阻塞主进程进行备份
    • BGSAVE:fork子进程进行备份,主进程不阻塞
  • 运作方式:

    • fork创建多进程
    • 子进程将现有新内容写到临时文件
    • 用新RDB替换旧RDB,删除旧RDB文件

优点

  • 保存某个时间点上的紧凑的数据集,可以还原到不同的版本
  • 适用于灾难恢复:因为备份文件即数据,可以加密传输
  • RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。

缺点

  • 需要保存整个数据集的状态,比较耗时,一旦发生故障停机,剩余数据丢失
  • 在数据集比较庞大时,fork() 可能会非常耗时

AOF

  • 保存文件名:dump.rdbappendonly.aof

  • 命令

    • 开启:

      #配置文件
      appendonly yes
      
    • 重写:在不打断服务客户端的情况下, 对 AOF 文件进行重建(rebuild)

      • 重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合

      • 创建新AOF时,新命令追加到旧AOF

      • 新AOF文件创建完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作

      • 即使重写过程中发生停机,现有的 AOF 文件也不会丢失

        $BGREWRITEAOF
        
  • 运作方式:

    • fork创建多进程
    • 子进程开始将现有新内容写到临时文件
      • 备份时新的命令,父进程在缓存中和旧AOF文件中同时记录
      • 重写完成将缓存中的所有数据追加到新AOF
    • 用新AOF代替旧AOF,删除旧AOF

优点

  • 数据完整性好:你可以设置不同时间间隔的备份策略,默认策略为每秒钟一次,在这种配置下,最多只会丢失一秒钟的数据
  • 增量备份,宕机包含了未写入完整的命令 redis-check-aof 也可以修复。
  • AOF 文件体积变得过大时,后台自动重写
  • AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂并修改
    • 比如执行了FLUSHALL, 只要 AOF 文件未被重写, 那么只要停止服务器, 移除 AOF 文件末尾的FLUSHALL命令, 并重启 Redis ,即可恢复

缺点

  • AOF 文件的体积通常要大于 RDB 文件的体积
  • AOF 的速度可能会慢于 RDB

RDB切换到AOF

  1. 开启redis.conf中的AOF功能

  2. 为最新的 dump.rdb 文件创建一个备份,将备份放到一个安全的地方

  3. 执行以下两条命令

    redis-cli> CONFIG SET appendonly yes
    # 开启AOF,Redis阻塞,直到初始AOF文件创建完成,之后命令请求追加到AOF文件
    redis-cli> CONFIG SET save ""
    # 关闭RDB功能,也可以不关闭同时使用
    

Redis数据备份

官方建议策略创建定时任务脚本:

  • 每小时将一份RDB备份到一个文件夹, 每天将一份RDB备份到另一个文件夹
  • 每次执行定期任务脚本时, 使用 find命令来删除过期的快照
  • 至少每天一次, 将RDB备份到其他服务器
  • 远程灾备时文件传送完成应该比对文件的SHA1校验和来确认文件是否传送完整,还需要一个独立的警报系统,在传送备份文件出错时通知你

恢复时AOF文件出错

  • 出错情况

    服务器可能在程序正在对 AOF 文件进行写入时停机, 如果停机造成了 AOF 文件出错, 那么 Redis 在重启时会拒绝载入这个 AOF 文件, 从而确保数据的一致性不会被破坏。

  • 解决方法

    • 为现有的 AOF 文件创建一个备份

    • 使用 Redis 附带的 redis-check-aof 程序,对原来的 AOF 文件进行修复

      $cp appendonly.aof appendonly.aof.bak
      $redis-check-aof --fix appendonly.aof
      
    • 使用 diff -u 对比修复后的 AOF 文件和原始 AOF 文件的备份

    • 重启 Redis 服务器

Tips

  • BGSAVE和BGREWRITEAOF不可以同时执行
    • 可以防止两个 Redis 后台进程同时对磁盘进行大量的 I/O 操作
    • 如果BGSAVE时BGREWRITEAOF, 服务器返回OK,并预定执行BGREWRITEAOF,BGSAVE执行完毕后执行BGREWRITEAOF

reids - 持久化

原文:https://www.cnblogs.com/yangjunh/p/redis-persistence.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!