Redis 的持久化机制
Redis 提供了两种持久化机制,分别是 RDB 和 AOF。
RDB
定期将内存中的数据保存到磁盘上。优点是快照小,恢复快,适合备份和容灾恢复。缺点是,在下一次持久化前,如果发生故障可能丢失数据。
可以通过 save 和 bgsave 命令手动触发保存操作。前者在当前进程操作,因此会阻塞进程。后者通过 fork 子进程,由子进程操作,因此阻塞主进程的时间(fork 子进程的时间)会很小。
自动触发 RDB 持久化的场景:
- 使用
save相关配置,如save m n。表示 m 秒内数据存在 n 次修改时,自动触发bgsave - 节点执行全量复制操作,主节点执行
bgsave生成 RDB 文件发送给从节点 - 执行
debug reload命令重新加载 Redis 时 - 执行
shutdown命令且没有开启 AOF 持久化功能时,自动执行bgsave
AOF
将写操作追加到 AOF 文件尾部。这样当 Redis 重启时,可以通过 AOF 文件来恢复数据。优点是更细粒度的数据恢复,更高的数据可靠性,适合做数据存档和数据备份。缺点是文件占用空间大,写操作导致磁盘负载比较高,当数据集较大时,比 RDB 启动效率低(RDB 直接恢复数据,AOF 通过再次执行写操作恢复数据)。
工作流程如下:
- 写入命令追加到 aof_buf 缓冲区中
- 缓冲区根据对应的策略,持久化到硬盘
- 定期对 AOF 进行重写,以达到压缩文件的目的
- 当 Redis 重启时,通过加载 AOF 文件进行数据恢复
Redis 启动加载数据流程
将 RDB 或 AOF 文件拷贝到 Redis 数据目录下。
- 如果开启 AOF 且存在 AOF 文件,则加载 AOF 文件
- 如果开启 RDB 且存在 RDB 文件,则加载 RDB 文件
- 加载 AOF 或 RDB 文件成功后,Redis 启动成功
- AOF 或 RDB 文件存在错误,Redis 启动失败并打印错误信息
混合持久化
Redis4.0 推出了 RDB-AOF 混合持久化机制。在开启持久化的时间内,在 AOF 文件头写入 RDB 数据,在文件尾追加 AOF 数据。在该机制下,AOF 只记录开启持久化的时间段内的操作,由全量改为增量,大大减少了文件的大小。
开头为 RDB 格式,使得 Redis 启动更快,同时结合 AOF,减少大量数据丢失的风险。缺点是在 AOF 文件中增加 RDB 数据,会让 AOF 文件的可读性降低,也不支持旧版本。