首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Redis持久化上篇—RDB持久化

一、Redis持久化的意义

Redis是内存数据库,数据都存储在内存中,如果Redis进程突然挂掉或者遇到一些灾难性的故障,重启Redis服务后内存中的数据都会消失,造成缓存雪崩的问题,此时很多请求会直接打在数据库上导致数据库服务挂了。

Redis仅仅把数据放在内存中是没有办法应对上述诸如此类的故障,因此持久化就显的格外重要,通过持久化将数据备份在磁盘上,也可以将磁盘上的数据同步到一些文件服务器上,就可以让数据不会完全丢失,减少损失。

Redis支持RDB和AOF两种持久化机制,持久化能有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。本篇将从RDB持久化触发条件、工作原理、常用配置、数据恢复实验来阐述RDB持久化机制。

二、触发条件

RDB持久化的触发分为手动触发和自动触发。

1>手动触发

save和bgsave命令都可以触发RDB持久化。

save命令:阻塞当前Redis服务器,直到RDB过程完成为止,在Redis服务器阻塞期间,服务器不能处理任何命令的请求。

实操:可以看到执行save后查看dump.db文件保存了的数据

bgsave命令:Redis进程执行fork操作创建子进程,RDB持久化由子进程负责,父进程(即Redis主进程)则继续处理请求。

备注:

redis默认不记录log文件,需要在Redis.conf文件,找到loglevel notice,在其后的logfile "",双引号中添加日志文件路径,我这里配置的是:

查看日志:

bgsave命令执行过程中,只有fork子进程时会阻塞服务器,而对于save命令,整个过程都会阻塞服务器,因此save已基本被废弃。在自动触发RDB持久化时,Redis也会选择bgsave而不是save来进行持久化;

2>自动触发

save m n: 表示m秒内数据集存在n次修改时,自动触发bgsave。

redis.conf 配置如下:添加了 save 5 1

save 900 1的含义是:当时间到900秒时,如果redis数据发生了至少1次变化,则执行bgsave;save 300 10和save 60 10000同理。当三个save条件满足任意一个时,都会引起bgsave的调用。此外在以下的场景也会触发bgsave命令:

1、在主从复制场景下,如果从节点执行全量复制操作,则主节点会执行bgsave命令,并将rdb文件发送给从节点。

2、默认情况下执行shutdown命令时,如果没有开启AOF持久化功能则自动执行bgsave。

实操:

查看日志

三、RDB的工作原理

先看下图直观的感受下RDB的

该图显示在某T时刻RDB文件中100条数据,假设在某T+5分钟后Redis内存中有200条数据,此时就会生成RBD中有200条数据的文件。RDB的原理其实就是在每隔一段时间生成Redis内存中数据的一份完整的快照并覆盖原先的RDB文件

四、RDB持久化机制的工作流程

1、Redis父进程判断当前是否存在执行save(废弃)/bgsave的子进程(RDB、AOF子进程),如果存在bgsave命令直接返回。

2、父进程执行fork操作创建子进程,这个过程中父进程是阻塞的,Redis不能执行来自客户端的任何命令,fork操作耗时非常短一般为微妙。

3、父进程执行fork操作创建子进程,这个过程中父进程是阻塞的,Redis不能执行来自客户端的任何命令。

4、子进程创建RDB文件,根据父进程内存快照生成临时快照文件,完成后对原有文件进行原子替换。

5、子进程发送信号给父进程表示完成,父进程更新统计信息dirty计数器、和lastsave时间信息等。

简单地说就是:

1、redis根据配置自己尝试去生成RDB快照文件。

2、Redis主进程fork一个子进程出来。

3、子进程将数据dump到临时的RDB快照文件中。

4、完成RDB快照文件的生成之后,就替换之前的旧的快照文件dump.rdb,每次生成一个新的快照,都会覆盖之前的老快照

五、RDB常用配置

dir :比如/var/redis/6379RDB和AOF所在目录。

save m n:表示m秒内数据集存在n次修改时,自动触发bgsave;如果没有save m n配置,相当于自动的RDB持久化关闭。

rdbcompression yes|no 是否开启RDB文件压缩,一般开启。

rdbchecksumyes|no是否开启RDB文件的校验,一般开启。

dbfilename dump.rdbRDB文件名。

六、RDB数据恢复实验

1、向redis中保存几条数据,立即停redis进程,然后重启redis,观察数据是否存在。

数据还在,前面已经提到通过redis-cli shutdown这种方式停掉redis,其实是一种安全退出的模式,redis在退出的时候会将存中的数据立即生成一份完整的rdb快照。

2、向redis中再保存几条新的数据,用kill -9粗暴杀死redis进程,模拟redis故障异常退出,导致内存数据丢失的场景,发现redis进程异常被杀掉,数据没有进dump文件,几条最新的数据丢失了。

3、手动设置一个save检查点观察数据是否会自动保存到dump.rdb文件中,设置一个检查点:save 5 1 每隔5秒有一条数据变更则生成rdb文件。

写入几条数据,等待5秒钟,会发现自动生成一次dump rdb快照,在dump.rdb中发现了数据,异常停掉redis进程,再重新启动redis,刚插入的数据还在。

七、总结

本篇主要介绍RDB持久化机制,简单的来说,RDB持久化机制是对redis中的数据执行周期性的持久化,将当前进程中的数据生成快照保存到硬盘的过程。RDB持久化是默认开启的。当Redis重新启动时,可以读取快照文件恢复数据。在下篇将会阐述AOF持久化机制以及二者的优缺点比较。

参考文章

付磊、张益军《Redis开发与运维》

文末开了打赏功能(可以打赏任意金额给作者),我就提一嘴,虽然这种小概率事件不太会发生,可万一呢?

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180907G1RFW900?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券