Redis内核基于时间点的备份恢复和基于AOF日志的增量同步机制设计

直播视频回顾

Redis内核支持基于时间点的备份恢复

Redis内存数据库,须有一种机制能够把内存中的数据持久化到硬盘上,再将硬盘中数据备份到备份系统中,才能去做恢复。Redis原生的持久化机制包括RDB持久化和AOF持久化两种。

RDB持久化

RDB持久化触发方式有两种:

  • 手动触发:执行BGSAVE命令;
  • 自动触发:配置SAVE选项,在指定时间内发生指定次数的key修改,自动进行后台RDB SAVE。

RDB持久化流程如下:

在做RDB SAVE时需要fork一个子进程,每次RDB SAVE生成一个对应时间点的内存快照文件。

AOF持久化


  • 配置appendonly选项,可以动态开关;
  • 和RDB持久化不太一样的是,每一次的写操作命令都会追加到aof文件中,根据配置的appendfsync选项不同,会有不同aof文件刷新策略;
  • Redis通过AOF Rewrite的方式来“紧凑”AOF,解决持续追加导致AOF文件过大的问题。

当前备份恢复方式

现在Redis内核能够支持的备份方式有两种:

1. 备份RDB:执行BGSAVE命令 -> Fork子进程 -> 生成rdb文件 -> 备份rdb文件;

2. 备份AOF:根据aof大小判断是否需要先做一次AOF Rewrite,备份aof,AOF Rewrite同样需要Fork子进程。

两种方式都是备份一个全量数据文件,通常不会选择备份aof,rdb格式更为紧凑,备份开销更小。

恢复时,创建实例,从备份系统拉取全量的aof或rdb文件到实例数据目录,恢复数据。

当前内核备份恢复方式只能做全量数据的备份和恢复,fork子进程生成全量快照的方式开销比较大。

应用场景举例

如果能够不管几点上线,都能恢复Redis数据到那个时间点,场景中的问题将不再存在。

Redis基于时间点的备份恢复

我们的目标就是要恢复数据到任意时间点,我们做了基于AOF改造的增量日志,禁用AOF Rewrite,日志按照配置大小自动切分。除了每个命令执行的历史日志要保存下来,还需要添加一些额外的信息,比如:

  • 根据系统时间戳命名AOF,AOF中除了包含原有的Redis协议格式的命令(Oplog),每个Oplog还对应了一个Header;
  • Header中包含多个字段,其中timestamp记录了命令执行时的时间戳,基于任意时间点恢复时就依赖于该信息;
  • server_id、opid和dbid是为后面讲的主从同步优化所设计,reserved为保留字段;
  • Oplog Header以二进制的形式用Redis命令封装,保持AOF协议格式不变。

AOF日志管理

AOF会按固定大小做切分,我们需要将AOF日志进行管理,主要有以下三点:

1. 使用AOF Index索引文件记录Redis当前维护的AOF文件;

2. 使用专门的清理命令删除AOF,同时维护AOF index文件的正确性;

3. BGSAVE完成时需要记录RDB文件对应的AOF日志名和文件写入偏移,这个信息保存在rdb index文件中。

本地定时BGSAVE

我们也需要本地定时BGSAVE机制,AOF会越变越大,仍然需要某种方式来“紧凑”AOF日志,比如AOF Rewrite方式复合式进程重写AOF日志,Redis实例在本地也需要保存一份持久化的全量数据,重启时从AOF日志恢复数据是不现实的。

对此,我们引入Cron BGSAVE,当AOF日志的增长量满足一定条件时,触发BGSAVE,生成RDB文件,该RDB文件对应的时间点之前的AOF日志在本地都是不需要的,只要已经上传到备份系统,即可删除。

备份恢复流程

时间点备份恢复的流程如图所示,左侧假如有一个Redis-Server实例,追加写AOF6文件,接着实时备份AOF日志,上传到备份空间中,同时也有定时全量备份,每一个RDB文件会对应一个RDB文件写入偏移,每个AOF文件会有一个起始时间;右侧指定要恢复的时间点,Redis顺序加载RDB、AOF到指定地点。

备份和原来全量备份的区别在于,需要实时持续地把Redis生成的AOF增量日志不断的备份下来,我们也要有删除的机制,比如保存一个星期或一个月的情况。

Redis基于AOF日志的增量同步机制设计

Redis原生同步机制主要有两种,全量同步和增量同步。

全量同步

全量同步代价非常大,全量同步意味着有一个空的Redis实例挂上来后,Master需要做一次BGSAVE,还需要网络传输RDB文件,发送给slave,大量占用主库带宽、cpu资源,大内存时fork会导致redis hang住,虽然fork是写实复制,但需要copy页表,如果内存比较大,页表也会比较大。

增量同步

Redis在2.8中引入了增量同步机制,是为了解决网络偶尔的抖动导致需要全量同步的问题。

增量同步机制实现比较简单,master和slave之间维护一个一致的同步offset,此外,master还在内存里面维护了一个同步buffer,保存了最近一段时间内的更新命令日志,当slave断链重连时,会根据自己的同步偏移从master的同步buffer直接拉取数据,完成同步。

理想情况下,这个流程同步很快,代价很低,但是当网络断开时间较长时,或主库写入非常大时,同步Buffer会将历史数据覆盖掉,仍然需要全量同步。而且,现有的增量同步机制,也没有解决一主多从场景下,主从切换,其他从需要从新主全量同步的问题。

应用场景举例

有不少使用Redis的业务的重要性很高,譬如说金融业务,都有跨机房,甚至跨地域灾备的需求,而跨机房或跨地域的网络质量往往很难保证。

假设有一天,Redis业务的杭州主机房和深圳的备机房之间的光纤被人挖断了,网络中断数小时,恢复后,深圳机房所有的备实例同时发起全量同步,导致的后果很可能是:主库所在机器带宽、cpu打满,甚至有些机器会直接OOM,而备又还没有完成同步,后果可能是灾难性的,对此,我们该如何处理呢?

基于AOF日志的增量同步(AOF PSYNC

由于现有机制存在的问题,以及真实场景中业务需求的推动,我们想到不依赖于具体内存的Buffer,用增量日志做增量同步,那么,基于AOF日志的增量同步是怎么实现的呢?具体原理解释如下:

  • 当主从同步断开,需要拉取增量时,会先选择尝试基于同步偏移从主库同步buffer获取数据,如果同步buffer缺少增量数据,会开始从AOF日志获取增量;
  • AOF PSYNC以AOF日志中的opid作为同步基准,slave继承从主库同步过来的opid,并记录在自己的AOF日志中;
  • 使用opid作为同步基准是因为对于带过期时间的命令,Redis写AOF和写同步buffer的字节序列不一样,Redis在写AOF时会转换设置过期时间的命令为PEXPIREAT;
  • AOF日志中的dbid,决定了AOF中的每条命令写入的db是哪个。AOF PSYNC同步完成后,会同步master和slave间的同步偏移。

AOF PSYNC流程

1. Master收到Slave的AOF PSYNC请求后,会使用后台线程来查找offset,避免server hang住;

2. 根据slave发送的opid查找到起始的AOF文件后会异步的通知主线程;

3. 主线程会异步发送一个或多个AOF文件给SLAVE,发送完成后,需要同步aof buffer;

4. 如果slave给定的opid在master的AOF中不存在(AOF可能被异常删除),会发起全量同步。

阿里云Redis服务

与其它Redis对比,阿里云Redis服务具备高可靠、高性能、高扩展、易用的特点。

时间: 2024-10-06 08:23:07

Redis内核基于时间点的备份恢复和基于AOF日志的增量同步机制设计的相关文章

【TSPITR】RMAN表空间基于时间点的自动恢复

[RMAN]TSPITR--RMAN表空间基于时间点的自动恢复 1.1  BLOG文档结构图       1.2  前言部分   1.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① TSPITR表空间基于时间点的自动恢复 ② logminer的简单应用   本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力. 1.2.2  实验环境介绍   目标库:11.2.0.3 

不完全恢复之--基于时间恢复

探索ORACLE不完全恢复之--基于时间恢复 作者:吴伟龙   Name:Prodence Woo QQ:286507175  msn:hapy-wuweilong@hotmail.com 基于时间(time)恢复 基于时间的恢复将数据库恢复到备份点与失败点之间的某个时间点.基于时间的恢复不仅在介质失败的时候使用,也可以在数据库正常运行的时候使用.例如:某个用户误删除了某个表的数据,这个时候我们可以通过基于时间的恢复来将删除的数据恢复出来,示例如下:   1.查看当前用户下的表,只有一张WWL0

基于时间点的不完全恢复的例子

说到不完全恢复,一般有三种场景,基于时间点的不完全恢复,基于scn的不完全恢复,基于cancel的不完全恢复. 三种情况都是不完全恢复采用的方式,而不完全恢复都是在完全恢复的过程中出现了这样那样的错误,数不胜数,基本就是归档,redo损坏丢失,控制文件丢失,备份的问题,手工失误等等. 我们可以举一个不完全恢复的案例,其实在实际操作的过程中还是有一些值得总结和学习的地方. 第一步准备基本的数据.目前我们可以看到在表空间data上只有一个表new_recover SQL> select owner,

基于Linux下 Oracle 备份策略(RMAN)

基于Linux下 Oracle 备份策略(RMAN) --********************************** -- 基于Linux下 Oracle 备份策略(RMAN) --**********************************       对于 Oracle 数据库的备份与恢复,尽管存在热备,冷备以及逻辑备份之外,使用最多的莫过于使用RMAN进行备份与恢复.而制定RMAN备份策略则是基于数据库丢失的容忍程度,即恢复策略来制定.在下面的备份策略中,给出的是一个通用

MongoDB秒级备份恢复(SDCC上海站数据库核心技术与应用实战峰会分享PPT)

本文是我3月18日在CSDN举办的SDCC上分享的PPT内容,主要介绍如何对MongoDB复制集及分片集群实现任意时间点的备份恢复,猛击这里下载PDF版本

云数据库Redis版备份恢复解决方案上线,数据可靠性全面升级!

阿里云云数据库Redis版致力于为用户提供稳定可靠.性能卓越.可弹性伸缩的数据库服务,并提供全套的容灾切换.故障迁移.在线扩容.性能优化的数据库解决方案. 云数据库Redis版采用双击热备的架构保证服务高可用,并且提供了持久化机制来保证数据可靠性.但是随着越来越多的业务开始使用Redis作为最终的持久化存储引擎,用户对于数据可靠性就提出了更高的需求.经过一段时间的打磨,我们正式推出了Redis备份恢复解决方案,全面的升级云数据库Redis的数据可靠性.   1.     数据备份一键式操作 由于

Oracle技术:基于时间点的表空间恢复

TSPITR(表空间时间点恢复)用于将一个或多个表空间恢复到过去某个时间点的状态,而其他表空间仍然保持现有状态. TSPITR 相关的概念和术语: (1) TSPITR (Tablespace Point-In-Time Recover).TSPITR 是表空间时间点恢复的英文缩写格式,它表示将一个或多个表空间恢复到过去时间点的状态,而其他 表空间仍然保持现有状态. (2) TSPITR 实现方法.当实现表空间时间点恢复时,既可以使用用户管理的表空间时间点恢复方法,也可以使用RMAN 管理的表空

RAC 数据库恢复到单实例下并且基于时间点恢复

RAC 下基于时间点的恢复1.源库进行备份 我这里进行了2次备份2.拷贝2次的备份集到目标机器上,在目标机器上建立好SPFILE.3.使用recover controlfile from 进行控制文件恢复,这个没什么好说的确定好控制文件所在备份集进行恢复就可以了.4.重新命名进行恢复 run {set newname for datafile '+DATA/rac/datafile/system.270.790795355' to '/home/oradba/db/rac/system.dbf'

Oracle技术:手动实现表空间基于时间点的恢复

实验说明: (1)先创建2个表空间. create tablespace user01 datafile '/opt/oracle/oradata/ocp/user01.dbf' size 1M; create tablespace user02 datafile '/opt/oracle/oradata/ocp/user02.dbf' size 1M; (2)在每个表空间上各创建一张表. create table scott.customers (cust_id int,cust_name v