当前位置:网站首页>Redis入门完整教程:RDB持久化
Redis入门完整教程:RDB持久化
2022-07-06 19:11:00 【谷哥学术】
RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持
久化过程分为手动触发和自动触发。
5.1.1 触发机制
手动触发分别对应save和bgsave命令:
·save命令:阻塞当前Redis服务器,直到RDB过程完成为止,对于内存
比较大的实例会造成长时间阻塞,线上环境不建议使用。运行save命令对应
的Redis日志如下:
* DB saved on disk
·bgsave命令:Redis进程执行fork操作创建子进程,RDB持久化过程由子
进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。运行
bgsave命令对应的Redis日志如下:
* Background saving started by pid 3151
* DB saved on disk
* RDB: 0 MB of memory used by copy-on-write
* Background saving terminated with success
显然bgsave命令是针对save阻塞问题做的优化。因此Redis内部所有的涉
及RDB的操作都采用bgsave的方式,而save命令已经废弃。
除了执行命令手动触发之外,Redis内部还存在自动触发RDB的持久化
机制,例如以下场景:
1)使用save相关配置,如“save m n”。表示m秒内数据集存在n次修改
时,自动触发bgsave。
2)如果从节点执行全量复制操作,主节点自动执行bgsave生成RDB文
件并发送给从节点,更多细节见6.3节介绍的复制原理。
3)执行debug reload命令重新加载Redis时,也会自动触发save操作。
4)默认情况下执行shutdown命令时,如果没有开启AOF持久化功能则
自动执行bgsave。
5.1.2 流程说明
bgsave是主流的触发RDB持久化方式,下面根据图5-1了解它的运作流
程。

1)执行bgsave命令,Redis父进程判断当前是否存在正在执行的子进
程,如RDB/AOF子进程,如果存在bgsave命令直接返回。
2)父进程执行fork操作创建子进程,fork操作过程中父进程会阻塞,通
过info stats命令查看latest_fork_usec选项,可以获取最近一个fork操作的耗
时,单位为微秒。
3)父进程fork完成后,bgsave命令返回“Background saving started”信息
并不再阻塞父进程,可以继续响应其他命令。
4)子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后
对原有文件进行原子替换。执行lastsave命令可以获取最后一次生成RDB的
时间,对应info统计的rdb_last_save_time选项。
5)进程发送信号给父进程表示完成,父进程更新统计信息,具体见
info Persistence下的rdb_*相关选项。
5.1.3 RDB文件的处理
保存:RDB文件保存在dir配置指定的目录下,文件名通过dbfilename配
置指定。可以通过执行config set dir{newDir}和config set
dbfilename{newFileName}运行期动态执行,当下次运行时RDB文件会保存到
新目录。
运维提示
当遇到坏盘或磁盘写满等情况时,可以通过config set dir{newDir}在线
修改文件路径到可用的磁盘路径,之后执行bgsave进行磁盘切换,同样适用
于AOF持久化文件。
压缩:Redis默认采用LZF算法对生成的RDB文件做压缩处理,压缩后的
文件远远小于内存大小,默认开启,可以通过参数config set
rdbcompression{yes|no}动态修改。
运维提示
虽然压缩RDB会消耗CPU,但可大幅降低文件的体积,方便保存到硬盘
或通过网络发送给从节点,因此线上建议开启。
校验:如果Redis加载损坏的RDB文件时拒绝启动,并打印如下日志:
# Short read or OOM loading DB. Unrecoverable error, aborting now.
这时可以使用Redis提供的redis-check-dump工具检测RDB文件并获取对
应的错误报告。
5.1.4 RDB的优缺点
RDB的优点:
·RDB是一个紧凑压缩的二进制文件,代表Redis在某个时间点上的数据
快照。非常适用于备份,全量复制等场景。比如每6小时执行bgsave备份,
并把RDB文件拷贝到远程机器或者文件系统中(如hdfs),用于灾难恢复。
·Redis加载RDB恢复数据远远快于AOF的方式。
RDB的缺点:
·RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运
行都要执行fork操作创建子进程,属于重量级操作,频繁执行成本过高。
·RDB文件使用特定二进制格式保存,Redis版本演进过程中有多个格式
的RDB版本,存在老版本Redis服务无法兼容新版RDB格式的问题。
针对RDB不适合实时持久化的问题,Redis提供了AOF持久化方式来解
决。
边栏推荐
- AWS learning notes (I)
- MySQL
- Derivative, partial derivative, directional derivative
- 所谓的消费互联网仅仅只是做行业信息的撮合和对接,并不改变产业本身
- Halcon instance to opencvsharp (C openCV) implementation -- bottle mouth defect detection (with source code)
- Code line breaking problem of untiy text box
- Convert widerperson dataset to Yolo format
- MySQL
- [leetcode]Search for a Range
- MES管理系统的应用和好处有哪些
猜你喜欢

Mmdetection3d loads millimeter wave radar data

Web3的先锋兵:虚拟人

HAVE FUN | “飞船计划”活动最新进展

如何设计好接口测试用例?教你几个小技巧,轻松稿定

3 -- Xintang nuc980 kernel supports JFFS2, JFFS2 file system production, kernel mount JFFS2, uboot network port settings, and uboot supports TFTP

Summer Challenge database Xueba notes (Part 2)~

Apifox,你的API接口文档卷成这样了吗?

What management points should be paid attention to when implementing MES management system

Compress JS code with terser

Derivative, partial derivative, directional derivative
随机推荐
Derivative, partial derivative, directional derivative
Ali yunyili: how does yunyuansheng solve the problem of reducing costs and improving efficiency?
[node learning notes] the chokidar module realizes file monitoring
Pgadmin4 of PostgreSQL graphical interface tool
How to write test cases for test coupons?
A new path for enterprise mid Platform Construction -- low code platform
Rethinking of investment
STM32 project -- Topic sharing (part)
Mmdetection3d loads millimeter wave radar data
wireshark安装
Difference and the difference between array and array structure and linked list
慧通编程入门课程 - 2A闯关
postgresql之整體查詢大致過程
Web3's need for law
Station B's June ranking list - feigua data up main growth ranking list (BiliBili platform) is released!
C#/VB.NET 删除Word文檔中的水印
Apifox,你的API接口文档卷成这样了吗?
服装企业部署MES管理系统的五个原因
The annual salary of general test is 15W, and the annual salary of test and development is 30w+. What is the difference between the two?
MySQL提升大量数据查询效率的优化神器