Redis 持久化机制 RDB

文若3年前技术文章949


前言

Redis 有两种持久化机制,分别是 RDB 与 AOF 本篇文章将介绍 RDB 的执行过程与应用。

1. RDB 简介

RDB 持久化是把当前进程数据生成快照保存到硬盘的过程,触发 RDB 持久化过程分为手动触发和自动触发。常用于全量备份和数据迁移。

2. 触发机制

2.1 手动触发

命令 save

执行 save 会堵塞当前 Redis 服务器,直到 RDB 结束为止,对数据量较大或者内存较大的实例,会堵塞较长时间,生产环境不建议使用。如果手动执行 save 命令,Redis 会记录下方日志。

127.0.0.1:6379> save
OK

* DB saved on disk

命令 bgsave

Redis 进程执行 fork 操作创建子进程,RDB 持久化过程由子进程负责,完成后自动结束。阻塞只发生在 fork 阶段,一般时间很短。如果手动执行 bgsave 命令,Redis 会记录下方日志。

* Background saving started by pid 90338
* DB saved on disk
* RDB: 0 MB of memory used by copy-on-write
* Background saving terminated with success

bgsave 对 save 堵塞进行优化,Redis 内部涉及 RDB 操作都是由 bgsave 完成。

2.2 自动触发

内部自动触发

从节点执行全量复制操作,主节点自动执行 bgsave 生成 RDB 文件发送给从节点。

执行 debug relad 重新加载 Redis 时,也会触发生产 RDB。

默认情况下,执行 shutdown 关闭 Redis 时,如果没有开启 AOF 持久化功能,则会触发 RDB。

参数设置触发

使用 save 相关配置,如 save m n 表示 m 秒内数据集存在 n 次修改时,触发一次 RDB。

127.0.0.1:6379> config get save
1) "save"
save 900 1 -- 900 秒内有数据变更则写入 RDB 文件
save 300 10  -- 300 秒内有 10 条以上数据变更则写入 RDB 文件
save 60 10000 -- 60 秒内有 10000 条以上数据变更则写入 RDB 文件

3. 参数设置

3.1 保存路径

通过设置 dir 可以配置 RDB 保存位置 dbfilename 可以设置文件名。

config set dir /opt/redis-5.0.12/backup
config set dbfilename bak_redis_db.rdb

3.2 备份压缩

Redis 默认采用 LZF 算法对生成的RDB文件做压缩处理,压缩后的文件远远小于内存大小,默认开启,可以通过 rdbcompression 参数配置。

config set rdbcompression{yes|no}

4. RDB 优缺点及原理

4.1 优势

RDB是一个紧凑压缩的二进制文件,代表 Redis 在某个时间点上的数据快照。非常适用于备份,全量复制等场景。加载恢复的速度远快于 AOF 机制。

4.2 缺点

RDB 方式数据没办法做到实时持久化/秒级持久化。因为 bgsave 每次运行都要执行 fork 操作创建子进程,属于重量级操作,频繁执行成本过高。

RDB 文件使用特定二进制格式保存,Redis 版本演进过程中有多个格式的 RDB 版本,存在老版本 Redis 服务无法兼容新版 RDB 格式的问题。

4.3 Copy-On-Write

通过使用 bgsave 命令,通过 fork 操作创建子进程,可以共享主线程所有的内存数据,执行后则开始进行 copy 数据,写入 rdb 文件中。期间如果有读操作,可以正常响应,与 bgsave 子进程互不影响,期间如果有修改操作,例如修改一块数据,这块数据就会被复制一份,生成这块数据的副本,主线程在这块数据副本上操作,不影响 bgsave 子进制的 copy 操作。

该机制为 Copy-On-Write 写时复制,可以减少 RDB 期间对 Redis 正常读写的影响。

风险点:执行 bgsave 命令,如果期间 Redis QPS 非常高,写入频繁,就需要更多的内存,来维护写时复制。

5. RDB 迁移测试

5.1 环境说明

系统版本:CentOS Linux release 7.8.2003 (Core)

Redis 版本:Redis 5.0.0

5.2 数据导出

redis-cli -h {source_redis_address} -p 6379 -a {password} --rdb {output.rdb}

5.3 数据导入

Redis 启动时会检查是否开启并且有 AOF 文件,如果有会直接加载 AOF 如果没有才会去寻找是否有 RDB 文件备份文件,所以我们将 RDB 文件加载到一个新 Redis 实例上,需要临时关闭 AOF 机制。

-- 关闭 AOF
config set appendonly no
-- 查询 AOF
config get appendonly
  1. 查询目标端路径参数,路径 dir 参数,文件名 dbfilename 参数。

127.0.0.1:6379> config get dir
1) "dir"
2) "/usr/local/redis-5.0.0"
127.0.0.1:6379> config get dbfilename
1) "dbfilename"
2) "bak_redis_db.rdb"
127.0.0.1:6379>
  1. 关闭目标端 Redis 服务。

redis-cli shutdown
  1. 上传 RDB 文件到目标端服务器,路径和文件名分别与目标端 dir 和 dbfilename 参数保持一致。

  2. 启动目标端 Redis 服务。

  3. 检查 key 数量,核实是否迁移成功。

dbsize
  1. 数据一致性校验,参考 Redis-full-check 工具。


相关文章

kafka节点数规划

按磁盘容量规划节点数Kafka的数据存放在本地磁盘,建议使用SAS盘,提供较高磁盘IO,以提高Kafka吞吐量。在本规划基于的硬件规格下,单节点平均吞吐量参考值为读300MB/s,写150MB/s。数...

shell编程基础(二)

1、条件表达式1.1 文件判断常用文件测试操作符:-d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立-f文件,f的全拼为file 文件存在且为普通文件则为真,即测试表达式...

CDP实操--Ranger开启ldap认证

CDP实操--Ranger开启ldap认证

集群中已经部署了ldap主主模式,并且使用haproxy进行负载均衡,keepalive提供了虚拟ip。页面配置:Ranger进行同步用户:验证:使用ldap用户登录页面:FAQ:1、admin超级管...

image.png

VMware Vsphere创建虚拟机

一、上传系统镜像打开数据中心 2、新建文件夹,存放镜像3、点击上传文件按钮    4、找到本地镜像上传二、安装虚拟机1、创建虚拟机 2、选择创建类型 3、为虚拟机命名并选择虚拟机安装的所在位置4、选择...

apache Hbase2.x  使用hbck2修复工具

apache Hbase2.x 使用hbck2修复工具

1、背景默认情况下apache hbase 使用hbck2时,无法使用-j 来加载hbck2的jar包,无法进行修复2、解决办法是由于默认情况下只使用自带的hbase hbck修复命令,大部分功能在2...

8.0 新特性-Redo 配置的变化

8.0 新特性-Redo 配置的变化

说明本篇文章将介绍 MySQL Redo 日志的作用,及需要关注的参数,在 5.7、8.0 Redo 的变化。1. Redo 日志介绍1.1. Redo 有什么作用为了取得更好的读写性能,InnoDB...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。