Redis持久化之RDB机制及配置

Redis持久化之RDB机制及配置

背景

Redis是个基于内存的数据库,也就是说Redis的所有数据都保存在内存中,服务一旦停止,内存中的数据将全部丢失。解决方案是持久化,将数据存在磁盘上,而不是从后端数据库恢复数据。Redis提供两种方式的持久化,一种是RDB持久化,另一种是AOF持久化。

RDB持久化机制

RDB 就是 Redis DataBase 的缩写,中文名为快照/内存快照,RDB持久化是在指定时间间隔内定时将当前进程数据生成快照保存到磁盘上的RDB文件。RDB持久化是Redis默认的持久化方式。由于是某一时刻的快照,那么快照中的值要早于或者等于内存中的值。

触发方式

触发RDB 持久化的方式有2种,分别是手动触发和自动触发。

手动触发

手动触发分别对应save和bgsave命令

save命令:阻塞当前Redis服务器,直到RDB过程完成为止,对于内存 比较大的实例会造成长时间阻塞,线上环境不建议使用

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

自动触发

在以下4种情况时会自动触发

  • redis.conf中配置save m n,即在m秒内有n次修改时,自动触发bgsave生成rdb文件;
  • 主从复制时,从节点要从主节点进行全量复制时也会触发bgsave操作,生成当时的快照发送到从节点;
  • 执行debug reload命令重新加载redis时也会触发bgsave操作;
  • 默认情况下执行shutdown命令时,如果没有开启aof持久化,那么也会触发bgsave操作;

配置RDB

默认情况下,Redis会把快照文件存储在当前目录下的一个名为 dump.rdb 的文件内。

如果需要修改 dump.rdb 文件的存储路径和名称,可以通过修改配置文件 redis.conf 内的 dbfilename 参数和 dir 参数来实现:

# RDB 文件名,默认为 dump.rdb
dbfilename dump.rdb# RDB 文件和 AOF 文件存放的目录。默认为当前工作目录
dir /usr/local/redis/bin

保存配置文件后,使用 redis-server 命令加载 redis.conf 配置文件并重新启动 Redis 服务器,然后使用 CONFIG GET dir 命令查看 RDB 文件的存储路径。

修改保存点选项,可以配置 RDB 的启用和禁用。可以通过修改配置文件 redis.conf 来实现,格式如下:

# 周期性执行条件的设置格式为
save  # 默认的设置为:
save 900 1
save 300 10
save 60 10000# 以下设置方式为关闭RDB快照功能
save ""

其他配置:

# 如果持久化出错,主进程是否停止写入
stop-writes-on-bgsave-error yes# 是否压缩
rdbcompression yes# 导入时是否检查
rdbchecksum yes

RDB持久化的优缺点

优点

  • RDB文件是某个时间节点的快照,默认使用LZF算法进行压缩,压缩后的文件体积远远小于内存大小,适用于备份、全量复制等场景;
  • Redis加载RDB文件恢复数据要远远快于AOF方式;

缺点

  • RDB方式实时性不够,无法做到秒级的持久化;
  • 每次调用bgsave都需要fork子进程,fork子进程属于重量级操作,频繁执行成本较高;
  • RDB文件是二进制的,没有可读性,AOF文件在了解其结构的情况下可以手动修改或者补全;
  • 版本兼容RDB文件问题

该文章会更新,欢迎大家批评指正。

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:
服务器课程:C++服务器