🌲 持久化机制

吞佛童子2022年10月10日
  • db
  • 持久化
大约 2 分钟

🌲 持久化机制

持久化机制RDBAOF
实时性🐳🐳🐳🐳🐳🐳
文件大小一个 紧凑 的二进制文件 dump.rdb,🐬🐬🐬🐬🐬🐬
恢复速度🐋🐋🐋🐋🐋🐋
作用冷备,容灾性好,可拷贝到远程机器用于容灾恢复热恢复

1. RDB

1) 工作方式

  1. fork 子进程
    • 基于 当前进程 复制 一个子进程,主进程 & 子进程 共享内存中的 代码块 & 数据块
    • 父进程 处理 客户端请求,会修改现有内存数据
    • 子进程 进行 数据持久化 工作,不修改现有内存数据,对数据进行遍历读取,然后 序列化 到磁盘中
  2. Copy on Write
    • 实现 数据段 页面的分离
    • 当 父进程 对其中一个页面进行修改前,会先复制一份原有数据,然后对 复制页面 进行修改,子进程仍旧使用 原有数据 进行持久化

2) 指令

  • save
    • 阻塞当前 Redis 服务器,直到 RDB 过程终止
  • bgsave
    • fork 子进程 进行数据的持久化工作,阻塞只发生在 fork 阶段,时间也比较短

3) 什么时候会触发 RDB

  1. 启动相关配置
    • save m n m 秒内数据有 n 次修改时,自动触发 RDB
  2. 主从全量复制
    • 主节点自动生成 RDB
  3. 没有开启 AOF 的前提下,默认情况下,执行 shutdown 命令时

2. AOF

1) 工作方式

  • 每次执行 修改内存 中数据集的 操作时,都会 记录 该操作,记录的是 修改性指令序列,写入的是 aof_buf 缓冲区中
  • 将指令 fsync 刷盘
  • 通过对一个空的 实例 顺序执行所有的指令,即可恢复 Redis 当前实例的内存数据
  • 先执行指令,再写日志

2) 指令

./redis-server --appendonly yes

3) 刷盘机制

  1. always 永不刷盘,由 操作系统 决定何时刷回磁盘
  2. 每秒刷盘
  3. 只要由 新指令 就会刷盘

4) AOF 重写

  1. 作用:
    • 防止 AOF 日志过长,对 AOF 文件进行 瘦身
  2. 命令
    • bgrewriteaof
  3. 原理
    • 开辟一个 子进程 对内存进行 遍历,转换成一系列 Redis 操作指令
    • 序列化 到一个新的 AOF 日志文件中
    • 序列化完毕后,将此次操作期间产生的 新的增量 AOF 日志 追加 到 本次 AOF 日志文件中
    • 追加完毕后,替换 旧的日志文件

3. 混合持久化

  • 没有混合持久化 之前,如果存在 AOF,会优先通过 AOF 恢复数据
    • 这是因为 AOF 数据比 RDB 数据要更加完整
  • Redis 4.0 引入
  • 在 Redis 重启时,先加载 rdb 内容,然后重放 aof 日志
  • 替换了之前的 aof 全量文件的重放,提高了 数据加载 速度
上次编辑于: 2022/10/10 下午8:43:48
贡献者: liuxianzhishou