🌲 持久化机制
2022年10月10日
- db
🌲 持久化机制
持久化机制 | RDB | AOF |
---|---|---|
实时性 | 🐳🐳🐳🐳🐳 | 🐳 |
文件大小 | 一个 紧凑 的二进制文件 dump.rdb ,🐬 | 🐬🐬🐬🐬🐬 |
恢复速度 | 🐋🐋🐋🐋🐋 | 🐋 |
作用 | 冷备,容灾性好,可拷贝到远程机器用于容灾恢复 | 热恢复 |
1. RDB
1) 工作方式
fork
子进程- 基于 当前进程 复制 一个子进程,主进程 & 子进程 共享内存中的 代码块 & 数据块
- 父进程 处理 客户端请求,会修改现有内存数据
- 子进程 进行 数据持久化 工作,不修改现有内存数据,对数据进行遍历读取,然后 序列化 到磁盘中
Copy on Write
- 实现 数据段 页面的分离
- 当 父进程 对其中一个页面进行修改前,会先复制一份原有数据,然后对 复制页面 进行修改,子进程仍旧使用 原有数据 进行持久化
2) 指令
save
- 阻塞当前 Redis 服务器,直到 RDB 过程终止
bgsave
fork
子进程 进行数据的持久化工作,阻塞只发生在fork
阶段,时间也比较短
3) 什么时候会触发 RDB
- 启动相关配置
save m n
m 秒内数据有 n 次修改时,自动触发 RDB
- 主从全量复制
- 主节点自动生成 RDB
- 没有开启 AOF 的前提下,默认情况下,执行 shutdown 命令时
2. AOF
1) 工作方式
- 每次执行 修改内存 中数据集的
写
操作时,都会 记录 该操作,记录的是修改性指令序列
,写入的是aof_buf
缓冲区中 - 将指令
fsync
刷盘 - 通过对一个空的 实例
顺序执行所有的指令
,即可恢复 Redis 当前实例的内存数据 - 先执行指令,再写日志
2) 指令
./redis-server --appendonly yes
3) 刷盘机制
always
永不刷盘,由 操作系统 决定何时刷回磁盘- 每秒刷盘
- 只要由 新指令 就会刷盘
4) AOF 重写
- 作用:
- 防止 AOF 日志过长,对 AOF 文件进行 瘦身
- 命令
bgrewriteaof
- 原理
- 开辟一个
子进程
对内存进行 遍历,转换成一系列Redis 操作指令
序列化
到一个新的 AOF 日志文件中- 序列化完毕后,将此次操作期间产生的 新的增量 AOF 日志
追加
到 本次 AOF 日志文件中 - 追加完毕后,
替换
旧的日志文件
- 开辟一个
3. 混合持久化
- 没有混合持久化 之前,如果存在 AOF,会优先通过
AOF
恢复数据- 这是因为 AOF 数据比 RDB 数据要更加完整
- Redis 4.0 引入
- 在 Redis 重启时,先加载 rdb 内容,然后重放 aof 日志
- 替换了之前的 aof 全量文件的重放,提高了 数据加载 速度