Redis持久化存根

redis 持久化:

   redis提供了两种持久化方式:1、RDB;2、AOF

    一、RDB:

redis默认持久化方式,在指定的时间间隔内生成数据集快照(point-in-time snapshot)需要在reids.conf中设置配置参数如下图

Redis持久化存根

上图中21,22,23行

21行:在900毫秒内有1次change就执行一次save;22,23同理

运作流程:

Redis持久化存根

流程描述:

  1. 判断是否有正在执行快照的子进程,如果有直接返回,如果没有父进程直接fork出一个子进程
  2. 父进程fork出子进程后会继续响应命令(正常工作),不会阻塞
  3. 子进程创建RDB文件,快照完毕后替换旧文件,通知父进程
  4. 父进程将同步过程中响应的数据同步到新RDB文件,快照完毕

RDB优缺点:

   优点:RDB是一个紧凑压缩的二进制文件,代表了某个时间点的数据快照,可将文件存储文件服务器等,可用于某个时间点的快速容灾,恢复速度快

   缺点:备份需要开启子进程,并且是全量备份,需要时间较长,无法做到秒级备份,两次备份之间数据容易丢失

二、AOF:

以命令的形式持久化,将所有的写操作命令以redis协议的格式追加到AOF文件的尾部,随着写入操作的不断增加AOF文件不断变大,这时候需要重写AOF文件(删除无效key,同一个key操作多次只保留最后一次等);

AOF默认关闭,如要开启需手动修改redis.conf配置文件如图:

Redis持久化存根

红框内appendionly   no  默认是no,只需要改成yes就可以打开AOF持久化方式

appendfilename 为AOF文件名可自定义

运作流程:

Redis持久化存根

流程描述

  1. 所有的写入命令追加到AOF缓冲区
  2. AOF缓冲区数据根据一定策略同步到硬盘AOF文件
  3. AOF文件根据重写策略 进行重写压缩
  4. 服务器启动时加载AOF文件恢复数据

AOF追加写命令触发条件有3种:

Redis持久化存根

AOF重写机制触发条件:

手动触发:直接调用bgrewriteaof命令。

自动触发:是按照已下两个条件来判断是否触发重写

  1. 根据auto-aof-rewrite-min-size:当aof文件大于多少字节后触发重写,默认64mb
  2. auto-aof-rewrite-percentage:当文件大小超过百分比触发。默认100,意味着文件超过2倍触发重写。

默认:第一次超过64mb重写,第二次超过64mb并且auto-aof-rewrite-min-size*2时重写---未验证

重写的运作流程:

Redis持久化存根

流程描述:

  1. 发起AOF重写请求,如果存在AOF重写进程直接返回,如果存在保存AOF进程则等待本次保存结束后发起
  2. 父进程fork子进程
  3. 主进程
    1. 继续之前AOF文件追加流程
    2. 同步复制操作到AOF重写缓冲区,防止重写过程中新写入数据丢失
  4. 子进程新建AOF文件,根据重写策略重写AOF文件
  5. 子进程重写AOF文件后
    1. 子进程通知主进程,更新统计信息(重写使用时间,重写后文件大小等信息)
    2. 将主进程写入AOF缓冲区的信息同步到新AOF文件
    3. 新AOF文件替换旧AOF文件重写完成

三、重启加载:

运作流程:

Redis持久化存根

流程说明:

  1. 服务重启,检查是否开启AOF持久化
  2. 存在:加载AOF文件,加载成功,启动成功
  3. 不存在:检查是否存在RDB持久化方式,不存在:启动成功;存在加载RDB快照启动成功
  4. RDB/AOF存在错误时。启动失败

数据文件损坏的时候如何修复

对于错误格式的AOF文件,先进行备份,然后采用redis-check-aof--fix命令进行修复,修复后使用diff-u对比数据的差异,找出丢失的数据,有些可以人工修改补全。AOF文件可能存在结尾不完整的情况,比如机器突然掉电导致AOF尾部文件命令写入不全。Redis为我们提供了aof-load-truncated配置来兼容这种情况,默认开启。加载AOF时,当遇到此问题时会忽略并继续启动

参考文献

参考文献