Redis持久化-RDB
Redis的持久化分为RDB持久化和AOF持久化,本篇文章主要说RDB持久化相关的东西。
RDB持久化就是把当前redis数据库中的数据保存到硬盘的过程。
触发时机
RDB持久化的触发方式有两种,第一种是手动触发,另外一种是自动触发。
手动触发
手动触发RBD主要使用save
和bgsave
命令。其实bgsave是对save命令阻塞问题的优化,因此你应该总是使用bgsave命令。
save
save
命令会阻塞当前主进程,直到RDB持久化过程执行完毕,对于内存比较大的实例会造成非常长时间的阻塞,因此线上环境不要使用。
bgsave
bgsave
命令执行时,redis主进程会fork出子进程,具体的RDB的过程是由子进程来完成的,在持久化期间,主进程依然响应来自应用程序的命令。阻塞仅仅会发生在fork出子进程的阶段。
自动触发
redis配置文件中使用了save配置
如果在redis配置文件中使用了save m n
(表示m秒内进行了n次数据修改)配置,满足情况的时候会触发bgsave
redis集群中从节点执行全量复制操作
从节点执行全量复制操作的时候,主节点会自动触发bgsave命令生存rdb文件并发送给从节点
执行debug reload加载redis
在执行debug reload(这个时候redis实例的run id不会发生变化)重新加载redis的时候,也会自动触发bgsave
默认情况下执行shutdown命令
默认情况下执行shutdown命令,如果没有开启AOF持久化功能,就会自动执行bgsave。
bgsave触发RBD的执行过程
( TODO 后续补充流程图)
- 主进程执行bgsave命令,首先会检查当前是否存在正在运行的子进程,如果存在的话,bgsave命令就会直接退出。
- 上述条件满足的情况下,主进程会fork出子进程,在fork操作期间,主进程会短暂的阻塞,可以使用
info stats
命令的latest_fork_usec
选项查看最近一次fork操作所耗费的时间,单位是微秒 - 父进程fork完成以后,会继续响应来自其他应用程序员的命令(但是save,bgsave,bgrewriteaof这三个命令特殊一些,会有不同的响应方式)
- 子进程创建RDB文件,由于os的写时复制机制(copy on write)父子进程会共享相同的物理页面,当父进程处理写请求时os会为父进程要修改的页面创建副本,而不是写共享的页面。所以子进程的地址空间内的数 据是fork时刻整个数据库的一个快照。.
- 当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,并发送信号通知父进程RDB持久化过程完成
- 父进程收到通知,更新相关的持久化信息
RDB持久化的优缺点
优点
- 非常适合备份,全量复制等场景
- redis加载RBD恢复数据会比使用AOF方式恢复的快
缺点
- 没办法做到实时/准实时的持久化
- 因为RDB文件是一个压缩过的二进制文件,在redis的版本演进过程中,存在多个格式的RDB格式,因此存在老版本的redis不能完全兼容新版RDB格式的情况
原文链接:https://wenchao.ren/archives/165