文章目录
前言
1. RDB 文件持久化的优缺点
2. RDB 的触发方式
2.1 save 命令触发
2.2 bgsave 命令触发
2.3 定时任务触发
2.4 主从同步全量复制触发
3. RDB 的处理流程
3.1 RDB 文件传输
3.2 socket 无盘传输
4. RDB 涉及的技术原理
4.1 写时复制 Copy On Write
4.2 diskless 无盘传输的管道读写
前言
Redis 是基于内存的 KV 数据库,使用时所有数据都在内存中,这就是它存取性能高的重要原因之一。但是如我们所知,保存在内存中的数据是有风险的,一旦机器停电或者意外宕机就会彻底丢失

Redis 持久化机制就是为了应对这种情况,其主要手段是将内存中的数据保存到磁盘上,宕机重启后再通过磁盘上的持久化文件将数据恢复。RDB 是 Redis 持久化机制的一种,它会将内存中的所有数据进行快照保存,并且以二进制文件形式存储到硬盘上

1. RDB 文件持久化的优缺点
相对于Redis 的另一种持久化机制 AOF 来说, RDB 持久化的优缺点可以总结如下:

优点

RDB 文件保存的是 Redis 在某个时间点的数据集,二进制形式使其占用磁盘空间很小,非常适于备份和灾难恢复
生成RDB文件的时候,Redis 主进程可以 fork 一个子进程来处理所有保存工作,主进程可以继续提供服务,不需要进行任何磁盘IO操作
RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快,这是因为 RDB 文件直接加载进内存就可以恢复数据,AOF 文件加载进内存的是一条条 Redis 命令,需要执行后才能恢复数据
缺点

RDB 需要保存内存中整个数据集,通常这个操作是很耗时的,因此一般保存 RDB 文件的操作间隔是比较长的。在这种情况下,一旦发生故障停机,此前没有来得及写入磁盘的数据都将丢失。也就是说,RDB 机制的数据可靠性比 AOF 低,可能丢失的数据更多
每次保存 RDB 的时候,Redis 可以 fork 出一个子进程来进行实际的持久化工作,但在数据集比较庞大时,fork 操作本身可能就非常耗时,从而导致 fork 完成前主进程无法处理任何请求
虽然经过 fork 操作的父子进程共享内存中的数据,但是父进程需要拷贝内存页表给子进程。如果 Redis 中数据内存占用很大,需要拷贝的内存页表很多,那么相应的拷贝操作就会比较耗时

2. RDB 的触发方式

2.1 save 命令触发
Redis 服务端接收到 save 命令时会在主线程中进行保存 RDB 文件的操作,需注意 Redis 对业务逻辑的处理都在主线程中串行执行,因此如果 RDB 需要保存的数据量大耗时长的话,会影响服务端对其他客户端命令的处理响应,不建议使用

Redis 6.0 源码中这个命令由rdb.c#saveCommand() 函数处理

2.2 bgsave 命令触发
Redis 服务端接收到 bgsave 命令时会 fork 一个子进程进行后台保存 RDB 文件的操作,这样主线程依然可以处理其他客户端命令,不影响线上使用

在 Redis 6.0 的源码中该命令由rdb.c#bgsaveCommand() 函数处理

2.3 定时任务触发
Redis 的server.c#serverCron() 定时任务会检查一定时间内数据变动是否超过配置文件中配置的值,如果超过则会触发 rdb.c#rdbSaveBackground()函数使用子进程后台完成 RDB 文件的保存

2.4 主从同步全量复制触发
Redis 6.0 源码阅读笔记(10)-主从复制 Master 节点流程分析 一文中提到过,当从节点连接上主节点的时候,主节点会根据从节点携带的参数判断是否能够进行部分复制,不能进行部分复制则需要后台保存 RDB 进行全量复制。此处保存 RDB 的方式与 bgsave 命令的处理基本一致,都是父进程 fork 子进程,由子进程进行 RDB 数据的保存工作,不过后续对 RDB 数据的处理有两种不同的方式,下文将详细介绍

3. RDB 的处理流程
本节主要介绍主从同步全量复制触发保存 RDB 的流程,事实上其他几种 fork 子进程保存 RDB 的处理也与此类似

3.1 RDB 文件传输

  • disk有盘传输
    这种方式由主节点子进程将生成的 RDB 数据写入临时文件,完成后将临时文件作为新的 RDB 文件替换掉旧的文件。父进程的定时任务定期检查子进程保存 RDB 的动作是否完成,完成则读取 RDB 文件将其传输给从节点

3.2 socket 无盘传输

  • diskless 无盘传输
    如果主从节点确认可以直接通过 socket 传输数据,则不需要保存 RDB 文件。这种模式下,子进程每生成一部分 RDB 数据就从管道写端写入,父进程则在管道读端读取 RDB 数据,并通过 socket 直接将其传输到从节点

4. RDB 涉及的技术原理
4.1 写时复制 Copy On Write
Redis 主进程可以 fork 一个子进程来执行 RDB 持久化,二者共享同一份内存空间。fork 操作之后主进程可以继续对外提供服务,那么必然存在对内存的写操作,如果共享的内存数据因此发生改变,那子进程保存的 RDB 就不能称为数据快照。因此,这其中必然有一种机制保证了主进程修改的内存数据对子进程不可见,其实这就采用了 Copy On Write 技术

Copy On Write 原理
fork 操作之后,内核会把父进程中所有的内存页都设为只读权限,然后将子进程的地址空间指向父进程。当其中某个进程写内存时,CPU 检测到内存页是只读的,于是触发页异常中断(page-fault),从而进入内核态。内核会把触发异常的页复制一份分配给写内存的进程,于是这个进程可以在复制的页上进行写操作,而不会更改共享的内存数据
Copy On Write 缺点
如果在 fork 后父子进程都还需要继续进行写操作,那么会产生大量的页异常中断(page-fault),造成内核态切换频繁,性能损失较大
Redis 在 rehash 阶段写操作是无法避免的,所以在 fork 出子进程之后会调用 server.c#updateDictResizePolicy() 关闭 rehash,尽量减少写操作,最大限度地节约内存

4.2 diskless 无盘传输的管道读写

Redis 中无盘传输的管道读写处理读者可参考 Redis 6.0 源码阅读笔记(10)-主从复制 Master 节点流程分析 ,此处简单介绍下管道的用处

管道是进程间通信方式但一种,不过管道只能用于具有亲缘关系的进程间的通信,在各个程进行通信时,它们共享文件描述符。管道的一般用法是,进程在使用 fork 函数创建子进程前先创建一个管道,用于在父子进程间通信,然后再创建子进程

管道两端的任务是固定的,一端只能用于读,由描述符fd[0]表示,称为管道读端;另一端只能用于写,由描述符fd[1]来表示,称为管道写端。数据在管道中是单向流动的,如果试图从管道写端读数据,或者向管道读端写数据都将导致出错

转载地址:

1.   https://blog.csdn.net/weixin_45505313/article/details/114918799

Redis 持久化 RDB 详解相关推荐

  1. Redis 持久化——RDB 详解

    目录 1.1 RDB 概述 1.2 RDB 持久化执行方式 1.3 RDB 文件的创建与载入 1.4 自动化执行原理 Redis 是一个键值对数据库服务器,服务器中通常包含着任意个非空数据库,而每个非 ...

  2. Redis 持久化——AOF 详解

    目录 1.1 概述 1.2 AOF 持久化的实现 1.2.1  命令追加 1.2.2 AOF 文件的写入与同步 1.3 AOF文件的载入与数据还原 1.4 AOF 重写 1.4.1 AOF 文件重写的 ...

  3. Redis持久化存储详解(一)

    2019独角兽企业重金招聘Python工程师标准>>> 为什么要做持久化存储? 持久化存储是将 Redis 存储在内存中的数据存储在硬盘中,实现数据的永久保存.我们都知道 Redis ...

  4. Redis配置文件redis.conf文件详解

    Redis配置文件redis.conf文件详解 唠嗑 这里面的意思只要看得差不多其实就是已经对redis有熟悉的感觉,就比如 推塔已经推到别人家的大门~~~~~~~~废话不多说直接开始了 知道大家都不 ...

  5. 【Linux服务器开发系列】一场redis线上事故引发的思考丨redis持久化 rdb和aof丨redis主从复制

    一场redis线上事故引发的思考 1. 事故背景介绍 2. redis持久化 rdb和aof 3. redis主从复制 4. 解决方案详解 [Linux服务器开发系列]一场redis线上事故引发的思考 ...

  6. Redis最全详解(一)——基础介绍

    Redis介绍 redis是基于内存可持久化的日志型.Key-Value数据库.redis安装在磁盘,但是数据存储在内存.非关系型数据库NoSql.开源免费,遵守BSD协议,不用关注版权问题. red ...

  7. [转]Redis内部数据结构详解-sds

    本文是<Redis内部数据结构详解>系列的第二篇,讲述Redis中使用最多的一个基础数据结构:sds. 不管在哪门编程语言当中,字符串都几乎是使用最多的数据结构.sds正是在Redis中被 ...

  8. 探索Redis设计与实现6:Redis内部数据结构详解——skiplist

    Redis内部数据结构详解(6)--skiplist  2016-10-05 本文是<Redis内部数据结构详解>系列的第六篇.在本文中,我们围绕一个Redis的内部数据结构--skipl ...

  9. Redis底层数据结构详解

    Redis底层数据结构详解 我们知道Redis常用的数据结构有五种,String.List.Hash.Set.ZSet,其他的集中数据结构基本上也是用这五种实现的,那么,这五种是Redis提供给你的数 ...

  10. Redis持久化----RDB和AOF 的区别

    关于Redis说点什么,目前都是使用Redis作为数据缓存,缓存的目标主要是那些需要经常访问的数据,或计算复杂而耗时的数据.缓存的效果就是减少了数据库读的次数,减少了复杂数据的计算次数,从而提高了服务 ...

最新文章

  1. 使用SDL打造游戏世界之入门篇 - 6
  2. crt linux切换用户,不同连接终端通过密钥方式登录 Linux
  3. 风格迁移应用_进展丨图像也能做情感迁移?罗切斯特大学团队提出计算机视觉新任务...
  4. [渝粤教育] 中国地质大学 工业通风及除尘 复习题
  5. 内构函数java_Android JNI参数传递
  6. Laravel+passport 实现API认证
  7. 都说 Go 可以开启成千上万的 Goroutine,那调度器是怎么处理核上任务分配的?
  8. 时间字符串以及时间戳解析
  9. 电子签名,后疫情时代“智慧校园”创新新方向
  10. BZOJ2794 [Poi2012]Cloakroom [离线][DP]
  11. 从百草园到三味书屋,从servlet到springmvc
  12. 【训练记录】2013-2014 Petrozavodsk Winter Training Camp, Moscow SU Trinity Contest @homework-7
  13. 第一道西西里----关于两数的最大公约数
  14. [学习笔记]多项式与有标号简单图计数
  15. calamari项目结构解析
  16. 麻省理工学院研发可编程数字纤维
  17. 苹果开发者账号申请流程完整版 https://www.jianshu.com/p/655380201685
  18. 模式识别—贝叶斯决策理论
  19. LaTex 把上下标符号放在正上和正下方公式
  20. 华为mate 30 安装时提示安装包解析失败

热门文章

  1. L1-017 到底有多二 (15 分) — 团体程序设计天梯赛
  2. selenium报错TypeError: 'FirefoxWebElement' object is not iterable
  3. day1---流程控制语句的四种基本格式
  4. mxonline实战14,全局搜索,修改个人中心页面个人资料信息
  5. IOS 获取.plist文件的数据
  6. 访问javaweb服务器sessionid存放问题
  7. XCode插件因为升级不能用了怎么办?几个步骤教你搞定
  8. Hibernate注释总结
  9. Group by的使用方法
  10. C++ Linked lists detail