redis作为内存数据库,为了防止因为程序bug或者机器故障导致的数据丢失,redis采取了多维度的措施来保障redis写入数据的安全。从单机层面:采取备份磁盘镜像+数据流水的形式,将内存状态落地到本地磁盘,防止因程序bug或者系统故障导致的数据丢失;从多机层面:通过主备机制,进行远程热备,保障数据安全。
本文分为拆分为多篇,分别从RDB、AOF、主备等角度介绍redis的数据落磁盘机制,介绍落地原理及相关源码流程、主备机制,包括原理,相关协议,以及具体实现。因笔者能力有限,行文观点若有疏漏,恳请指正。更多内容,移步作者个人博客
redis通过磁盘实现数据落地,主要通过内存镜像定时备份和记录操作流水两种方式:
所谓RDB,即内存镜像备份机制我们主要关注以下几个问题:
我们结合代码,逐个问题进行分析。
在redis的配置文档中,我们可以看到rdb触发的时机分为两个维度:时间维度和修改维度;当修改次数超过指定配置,或者修改后超过指定时间,则触发RDB流程。
以下为RDB主调流程的框架,其中:
RDB主流程为rdbSaveBackground接口
触发RDB流程分为两种情形:
客户端执行SAVE/BGSAVE指令,主动触发RDB流程;
二者区别在于,save会阻塞主进程直到RDB完成,bgsave会fork子进程执行rdb流程
定时任务触发(serverCron),当指定时间内修改次数超过阈值时触发RDB流程;
RDB流程是互斥的,即同一时刻只能一个RDB流程在跑;在这期间若是出现客户端执行BGSAVE指令,服务器也是不响应的,会推迟到本地RDB结束之后再执行;
redis的RDB是通过fork一个进程实现的,由于进程之间是独立地址空间的,借助Linux的COW机制,当RDB过程中有数据发生修改,被修改的数据只会体现在redis主进程中,对rdb进程没有影响。
另一方面,当redis写请求大的时候,会导致redis内存耗用量变大,为了避免redis在RDB过程中被OOM,需要配置redis的内存占用,避免因为占用内存多大导致进程挂掉。
以上为redis的RDB主流程,主要包括以下几点:
Redis-server在启动过程中,会根据指令加载指定位置的rdb文件,核心流程的代码如下:
主要需要注意的是:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。