Redis 持久化
[toc]
Redis 是基于内存的k-v服务,内存在断电时无法保存数据,因此需要做数据的备份操作。
Redis 有两种备份方式:
- 内存快照的持久化保存 RDB
- 适合全量复制,容灾备份,每日周期性定时执行(间隔6小时)
- 压缩后的二进制文件,恢复速度快
- 耗时长,无法做到实时备份
- 记录修改操作日志的持久化保存 AOF
- 实时备份(1s 一次)
RDB
内存快照的二进制压缩格式
RDB 备份流程
- 执行
bgsave
命令,判断RDF 或 AOF子进程是否在运行,如果存在则直接退出; - 主进程
fork
产生子进程,子进程用来执行备份操作(会阻塞主进程); - 子进程根据父进程生成的临时快照文件来创建 RDB 文件,替换旧 RDB 文件;
- 子进程发送完成信号给父进程,父进程会统计相关信息;
linux 进程中的 fork :
fork函数得到的子进程从父进程的继承了整个进程的地址空间,包括:进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。fork 不会拷贝父进程的物理空间,会共用
RDB 什么情况下会被触发?
触发 RDB 备份 主要是两个命令: save
和 bgsave
- 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 备份流程
- 写入命令会追加到 aof_buf 缓冲区中;
- 根据对应的策略 写入到硬盘;
- 当文件过于大时,会重写 AOF 文件;
- 重启优先加载 AOF 文件;
AOF 备份-1.命令写入
先写入缓存区,然后再备份到硬盘中;
直接写入文本协议格式
AOF 备份-2.文件同步策略
同步策略: 配置 appendfsync
参数
- always
- everysec (默认配置, 1s 执行一次写入)
- no
AOF 备份-3.重写机制
重写的主要点:
- 被删除的无效数据不需要在写入
- 过期数据不需要在写入
- 多条命令可以合并
手动触发重写命令: bgrewriteaof
AOF 备份-4. 重启加载
比 RDB 优先级别高
如何配置相关参数?
- 开启 AOF功能
配置appendonly yes
AOF 什么情况下会被触发?
根据备份策略,一般是定时触发