DRC(Data Replicate Center)

DRC用来做什么?

数据双向复制和数据订阅。
比如:跨机房的 Mysql 数据复制。
比如:数据订阅,监听数据库实时变更情况。

DRC设计目标?

1. 实时双向数据复制,延时 < 1s ,并能够解决双向修改时的数据冲突。
2. 数据变更订阅,能够在DB数据发生变化时通知到相关订阅方。
3. 高度可靠和保持顺序,不能丢失数据,也不能因为错乱执行顺序导致数据错误。

DRC主体设计?

  • 总体架构设计?Replicator 获取 + Apply 投递。

    DRC核心能力就是 数据获取 和 投递。(有点像送外卖的)
    数据获取主要是 Replicator,负责从源头数据库拉取变更。(集群化部署方式)
    数据投递主要是 Apply,负责投递到目标数据库。(集群化部署方式)
    
  • replicator实现细节?

    1. 主从集群方式。(可靠性)1.1 Replicator Slave是一种稍微特殊的 Replicator,从 Master Replicator 拉取 `DataChangeEvent`,并保存到本地EventBuffer中。1.2 Replicator中保存当前 `SCN Number`,有一个 Master 和任意多个 Slave ,当 Masters失效后,Slave Replicator 可以选举新的 Master。1.3 replicator 有一个 master 多个 slave,只有 master 会连接 DB,其他的 slave 只连接 master replicator。2. 实现 Mysql Binary Log Dump 协议,从Source Mysql 中取得 `DataChangeEvent`。(通讯协议)3. 针对任何唯一数据源,数据修改事件(`DataChangeEvent`)需要能够 映射为 唯一的单调递增的`SCN(System Change Number)`。(一致性)4. Replicator 接收到 DataChangeEvent 数据后,采用`Heap外的环状内存结构(MMAP)保存,减少GC负荷`,为了保证低延迟的复制,不写入本地文件。5. Replicator 中不保存任何 Client SDK 相关的状态信息(SCN),该信息由 Client SDK 调用方维护。6. Replicator 中不保存客户端状态,Client SDK Pull 数据的时候需要指定开始 SCN 位置,所以可以随时切换到任何一个Replicator拉取数据。7. 如果客户端提交的 SCN 超过当前 Replicator 的最老数据,Replicator 会回源头数据库拉取。8. Replicator 在维护了一个 RingBuffer,用于保存 ChangeEvent,这个buffer我们叫做 EventBuffer,EventBuffer 是 DRC 提高性能的一个非常关键的环节。
    
  • Apply实现细节?

    Client SDK 从 Replicator 中拉取 DataChange Event 序列,拉取时需要提供当前位置(SCN)和过滤条件,过滤条件支持基于库名,或者表名的过滤。Data Apply负责把 ChangeEvent 按照需要的格式应用到数据库中,需要保持事务一致性,按照SCN的顺序执行。Apply 以 Channel 的形式在 DataApply Server 上组织复制单元,Channel 是一张表或者一组表,内部逻辑通过串联的 Filter 实现,实现了诸多的业务逻辑,例如幂等,冲突检查,并行化性能优化等等。
    
  • SCN是什么?

1. 单调有序、全局唯一、与 Data Change Event 一一对应 的 结构体。比如:mysql scn 嵌入了 mysql 的 serverid,logIndex,logPostion,以保证对于一个唯一的 mysql server 来说,scn 是单调有序并唯一的。同时,还加上了一个 changeId 字段,如果数据抽取切换到另外一个 mysql 上了,changeId 只需要 +1,就可以保证产生的SCN依然有序。SCN是在 Replicator 端生成的,并贯穿了整个 DRC 系统的各个组件,所有的组件都用相同的SCN来标志event,也用SCN来记录当前复制的位点。SCN在各个Replicator中是一致的,当 master 失效后会选举出新的 master(zk),并从该 master 的当前位置开始复制,这样就避免了非常复杂的在多个 replicator 间保持一致的问题。

DRC实现细节?

  • 数据一致保证?

    1. 双向复制过程中,防止循环复制?
    解答:DRC防止冲突的方案是在由DRC产生的事务中加入DRC标记。来自产研的数据变更需要复制出去,而来自DRC的数据复制不需要复制。2. 万一发生中断或者是故障,如果保证数据正确?
    解答:从中断恢复,主要靠的是SCN,因为SCN有序,并保存在可靠存储中,任何节点的失效,都可以通过SCN位点来恢复,SCN可以被保存在本地文件,ZK和数据库中,达到性能和可靠性的平衡。幂等:另外,大部分的DB操作在DRC下是幂等的,从任意一点开始,重复执行一次,还是会得到相同的结果。DRC能够处理各种重复执行带来的异常,并且保证最终数据始终一致。这里主要靠的是详细分析各种重复执行可能带来的异常,对能够跳过的异常就直接跳过,而不停止复制。3. 事实上看,基于时间戳已经解决了99%的数据冲突问题?
    基本的冲突处理,通过时间戳完成,两边机房的都有实时同步的毫秒级别的NTP服务,每笔数据上都打上了变更时间戳。在发生冲突的时候,最后发生的修改会胜出,最终两个机房的数据都会被同步成最后的数据。如果时间戳不能满足需要,还可以通过调用业务提供的冲突解决方案解决,冲突解决时,为业务方提供了原始数据和最新数据,由业务逻辑来决定哪个数据才是最终正确的数据。
    
  • 吞吐量如何保障?跳表结构,索引定位,批量操作思想。

    DRC 具有非常高的吞吐量,主要归功于 Replicator 的本地 EventBuffer,几个月的Event数据都会被缓冲到 EventBuffer 中,EventBuffer 是一个跳表结构。其中跳表的索引是SCN,通过SCN能够快速的找到对应Event,之后按照顺序输出其后的 Event,每次输出一批Event,磁盘读取和网络传输都很高效。
    
  • 空间利用率?堆中存索引,真实数据存堆外。结构源信息及结构快照分开存储。

    EventBuffer 落地在磁盘上,通过内存映射Map到内存中。Java Heap 中只保存比较少的索引数据,大量的Event数据维持在堆外,避免大内存带来的GC开销。大部分 EventBuffer 的大小维持在512G空间,能够支持数月到数个星期的事件。EventBuffer 中只保存了二进制的数据,数据的结构被保存在另外一个独立的存储中,我们称为 MetaData Store。MetaData Store 保存了每个表的历史数据格式的快照,每次发生表结构变化,都会创建一个新的快照。
    
  • 用户空间与内核空间?

    内核在内核空间中运行,而普通程序在用户空间中运行。用户空间基本上是沙盒的一种形式-它限制了用户程序,因此它们不会弄乱其他程序或OS内核拥有的内存(和其他资源)。这种限制(但通常不能完全消除)限制了他们执行坏事(例如使机器崩溃)的能力。内核是操作系统的核心。通常,它可以完全访问所有内存和计算机硬件(以及计算机上的所有其他内容)。为了使计算机尽可能稳定,通常只希望在内核模式/内核空间中运行最受信任的,经过测试的代码。堆栈只是内存的另一部分,因此很自然地将其与其余的内存隔离开来。
    
  • MMAP,通过内存映射的方法访问硬盘上的文件,效率要比read和write系统调用高,这是为什么呢?

           解答:原因是read()是系统调用,其中进行了数据拷贝,它首先将文件内容从硬盘拷贝到内核空间的一个缓冲区,然后再将这些数据拷贝到用户空间,在这个过程中,实际上完成了 两次数据拷贝。                    而mmap()也是系统调用,如前所述,mmap()中没有进行数据拷贝,真正的数据拷贝是在缺页中断处理时进行的,由于mmap()将文件直接映射到用户空间,所以中断处理函数根据这个映射关系,直接将文件从硬盘拷贝到用户空间,只进行了 一次数据拷贝。因此,内存映射的效率要比read/write效率高。                 实际上,mmap将用户态虚拟内存与磁盘地址空间进行了映射联动,“遥相呼应”,缺页中断时候,会将磁盘地址空间拷贝到用户空间,与首先将文件内容从硬盘拷贝到内核空间的一个缓冲区,然后再将这些数据拷贝到用户空间相比,节省了一次拷贝。即:越过了内核空间,让磁盘空间直接与用户空间交互。
    

Reference

  • https://www.cnblogs.com/xiong-liang/p/15018984.html(DRC数据库双向同步复制)
  • https://www.codenong.com/5957570/(关于操作系统:内核空间和用户空间有什么区别?)
  • https://blog.csdn.net/coolwriter/article/details/80493166(linux内存映射mmap原理分析)

DRC(Data Replicate Center)相关推荐

  1. DPU(Data Processing Unit)数据处理器

    DPU(Data Processing Unit)数据处理器 DPU:5G边缘云 5G时代带来通信带宽的巨大提升,更多的带宽使能更多的应用.数据量的迅猛增多,服务器网络带宽的快速增长,都已经远超计算能 ...

  2. 【空间分析之二】点数据集加权平均中心统计(weighed Mean Center)

    点数据集描述性空间统计之二--加权平均中心统计(weighed Mean Center)原理及python实现 1.原理 一个点数据集中,例如每个点所处的小区人口有多有少,或则到某个固定地点的距离有长 ...

  3. 【Vue.js 牛刀小试】:第九章 - 组件基础再探(data、props)

    系列目录地址 一.基础知识概览 第一章 - 一些基础概念(posted at 2018-10-31) 第二章 - 常见的指令的使用(posted at 2018-11-01) 第三章 - 事件修饰符的 ...

  4. Dao设计模式(Data Access Object)

    目    录(本篇字数:1858) 介绍 通用Dao 一.Dao泛型接口 二.JavaBean 三.Dao接口实现类 四.单元测试 五.反射工具类 介绍 Dao设计模式(Data Access Obj ...

  5. 【自动驾驶】3. DDS 数据分发服务(Data Distribution Service)

    DDS 数据分发服务(Data Distribution Service) 数据分发服务DDS(DataDistributionService)是对象管理组织(OMG)在HLA及CORBA等标准的基础 ...

  6. 01_关于TensorFlow、什么是数据流图(Data Flow Graph)、TensorFlow的特征、谁可以使用Tensorflow、为啥Google要开源这个神器?

    1 关于TensorFlow TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操作,图中的线(edges)则表 ...

  7. 数据可视化 —— 数据流图(Data Flow Diagram)

    数据流图(Data Flow Diagram):简称 DFD,它从数据传递和加工角度,以图形方式来表达系统的逻辑功能.数据在系统内部的逻辑流向和逻辑变换过程,是结构化系统分析方法的主要表达工具及用于表 ...

  8. 计算机网络笔记Part3 数据链路层(Data Link Layer)

    本人计算机网络笔记总目录 计算机网络笔记Part1 概述 计算机网络笔记Part2 物理层(Physical Layer) 计算机网络笔记Part3 数据链路层(Data Link Layer) 计算 ...

  9. DAO数据访问对象(Data Access Object)

    持久化是将程序中数据库在瞬时状态和持久状态间转换的机制JDBC是一种持久化的机制,将程序直接保存成文本文件也是持久化机制的一种实现 JDBC的封装: 原因: JDBC将程序中的数据持久化保存到MySQ ...

最新文章

  1. Linux下获取usb视频设备vendor id和product id的8种方法
  2. MySQL的binlog数据如何查看
  3. Nagios Web 页面声音报警
  4. 二叉树后续遍历非递归
  5. Struts1和Struts2的区别和对比(完整版)
  6. 搬了十次家,总算搬进了自己的家
  7. 实例35:python
  8. java将dxf展示在网页_七天串起java技术栈-第四天
  9. hdu 5119 (类似于划分数的状态定义) (DP中的计数问题)
  10. 模型算法_详解SVM模型之SMO算法
  11. 华为交换机几种端口属性
  12. Power BI能否做帕累托分析
  13. 春晚红包互动:中国云计算的成长史
  14. 12306 Android 8,铁行火车票12306
  15. python读取fits第三方库_如何读取FITS
  16. echarts 引入百度地图
  17. PDF编辑方法,怎么从PDF中提取页面
  18. Raptor实践参考:要么错误要么求和
  19. 关于 网易云音乐 我喜欢的音乐 排序无法改为添加时间 排序无法还原 的问题
  20. 数据结构与算法一:稀疏数组 队列 链表

热门文章

  1. R语言svm支持向量机多元回归预测
  2. C语言返回数组的两种方法
  3. FusionCharts 的刷新
  4. Android 面试必备 - 系统、App、Activity 启动过程
  5. Dynamics AX2012 SSRS errors:For more information about this error navigate...
  6. 软件外包公司的优缺点
  7. Linux 安装rabbitMQ guest账号登录总是提示失败
  8. IntelliJ IDEA 2018.3 x64 安装激活教程(全面)
  9. 2021年上海市安全员C证考试报名及上海市安全员C证试题及解析
  10. 信息增益与信息增益率详解