redis-持久化

Redis 持久化

[toc]

Redis 是基于内存的k-v服务,内存在断电时无法保存数据,因此需要做数据的备份操作。

Redis 有两种备份方式:

  • 内存快照的持久化保存 RDB
    • 适合全量复制,容灾备份,每日周期性定时执行(间隔6小时)
    • 压缩后的二进制文件,恢复速度快
    • 耗时长,无法做到实时备份
  • 记录修改操作日志的持久化保存 AOF
    • 实时备份(1s 一次)

RDB

内存快照的二进制压缩格式

RDB 备份流程

redis-持久化_第1张图片

  1. 执行bgsave 命令,判断RDF 或 AOF子进程是否在运行,如果存在则直接退出;
  2. 主进程fork 产生子进程,子进程用来执行备份操作(会阻塞主进程);
  3. 子进程根据父进程生成的临时快照文件来创建 RDB 文件,替换旧 RDB 文件;
  4. 子进程发送完成信号给父进程,父进程会统计相关信息;

linux 进程中的 fork :
fork函数得到的子进程从父进程的继承了整个进程的地址空间,包括:进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。

fork 不会拷贝父进程的物理空间,会共用

RDB 什么情况下会被触发?

触发 RDB 备份 主要是两个命令: savebgsave

  • save:
    • 主线程去执行 RDB 备份,所以无法响应请求;
  • bgsave:
    • 子进程去执行备份,只在fork 阶段产生阻塞;

所以,我们只需要知道 bgsave 什么时候触发调用就行。

  • 配置save m n :即 m 秒内数据集被修改了n次,则触发bgsave
  • 从节点的全量复制:主节点会将RDB文件传递到从节点
  • debug reload
  • 执行 shutdown
  • 从节点需要全量复制时???

AOF 默认是关闭的,但优先级高于 RDB

相关的指令

运行期指定 RDB 文件保存地址

config set dir {newDir}

AOF

append only file

日志记录修改操作,可以实时记录备份

AOF 备份流程

redis-持久化_第2张图片

  1. 写入命令会追加到 aof_buf 缓冲区中;
  2. 根据对应的策略 写入到硬盘;
  3. 当文件过于大时,会重写 AOF 文件;
  4. 重启优先加载 AOF 文件;

AOF 备份-1.命令写入

  • 先写入缓存区,然后再备份到硬盘中;

  • 直接写入文本协议格式

AOF 备份-2.文件同步策略

同步策略: 配置 appendfsync 参数

  • always
  • everysec (默认配置, 1s 执行一次写入)
  • no

AOF 备份-3.重写机制

重写的主要点:

  • 被删除的无效数据不需要在写入
  • 过期数据不需要在写入
  • 多条命令可以合并

手动触发重写命令bgrewriteaof

AOF 备份-4. 重启加载

比 RDB 优先级别高

如何配置相关参数?

  1. 开启 AOF功能
    配置 appendonly yes

AOF 什么情况下会被触发?

根据备份策略,一般是定时触发

你可能感兴趣的:(redis-持久化)