摘自《大型企业微服务架构实践与运营》 薛浩 编著

异地多活数据同步平台

1. 异地多活架构

接入层应用可通过同步调用或异步消息实现相互的调用。通过相关的服务注册和发现机制保障寻址、路由、熔断、切换等。
在数据库层面,通过准实时同步的方式实现数据中心间数据的双向同步。以My SQL数据库为例,其同步示意如图:


    中心间采用解析My SQL二进制日志(binlog)实现增量准实时双向同步数据,通过数据稽核检验保障数据最终一致。在灾难发生情况下,业务不中断,可人工或自动进入数据中心切换。
考虑到数据同步的效率,中心间的数据同步需要采取一定的策略。对于共性业务,数据中心之间只对系统静态参数和核心动态业务数据进行增量备份,其他业务数据不做备份;对于个性业务,只对个性业务的静态及配置数据进行两中心同步。
实现异地多活的关键在于数据中心间的数据同步,而数据同步的关键是要保证中心间的数据一致性和数据同步的低延迟。数据同步平台很好地解决了实现异地多活产生的数据同步问题。

2. 数据同步平台架构设计

数据同步平台主要由管理平台、切换感知、传输引擎、binlog解析器、数据稽核模块组成。binlog解析器通过订阅My SQL的binlog实现准实时跨中心数据同步,从而达到中心间My SQL数据的一致性。数据同步平台高度自治,只与My SQL交互。对中心间需要同步数据的My SQL建立传输管道,每个中心下包含需要同步的My SQL主—从数据库地址。

    管理平台是My SQL数据同步平台的管理门户,主要提供配置和监控功能。配置功能包括传输管道、传输引擎、数据稽核、切换感知配置以及binlog解析配置;监控功能包括切换感知、传输引擎、异常、binlog解析以及数据稽核过程。
    切换感知主要解决中心内My SQL数据库主—从切换后,通知binlog解析器与传输引擎切换到新的My SQL主库上进行解析binlog与回复binlog。
    传输引擎通过内嵌解析器方式对接解析器,获取数据库增量日志数据,将增量数据传输到异地机房并加载到相应的My SQL主库中。
    binlog解析器采用开源dbsync进行定制开发,以达到数据同步的要求。
    数据稽核是在发生异常情况下,中心间数据同步过程中出现数据不一致问题。数据稽核是保障中心间数据同步的最终一致性的主要手段,分为冲突校验、定时全量稽核,根据稽核的结果进行手动、自动修复数据。
    管理平台对切换感知、binlog解析器、传输引擎、数据稽核进行管理配置、监控。数据同步平台通过切换感知及时发现中心内My SQL的主—从切换,并通知传输引擎与binlog解析器切换到新的Master上进行数据同步。

2.1 数据同步原理分析

数据同步的前提是配置好需要实现同步的源数据库/表和目标数据库/表,在管理节点(Manager)配置传输管道等相关信息。数据同步平台各功能模块之间的关系如图所示:

图6-14 数据同步流程


流程简述如下:

  • ①数据库数据发生变更后,由数据库将binlog发送至binlog解析模块;
  • ②解析器对接收到的binlog进行协议解析,补充一些特定信息,如字段名字、字段类型、主键信息、Unsigned类型处理;
  • ③将解析后的数据传递给事件队列模块进行数据存储,该操作是一个阻塞操作,直到存储成功;
  • ④存储成功后,定时记录Binary log的位置;
  • ⑤进入数据队列后,由数据队列实现数据过滤、路由分发等功能;
  • ⑥数据通过Ring Buffer实现内存存储,防止缓存数据过大导致Jvm内存溢出;
  • ⑦传输引擎从ZooKeeper获取同步任务,并接入binlog解析模块开始同步数据;
  • ⑧传输引擎主要实现4个阶段的操作,分别是数据接入(Select)、数据提取(Extract)、数据转换(Transform)、数据加载(Load);
  • ⑨在目标库实现数据入库。

其中,切换感知模块用于监控数据库主—从切换,并通知ZooKeeper以及binlog解析模块对Master实现切换。数据稽核模块在业务负载较低的时段对源库和目标库进行数据校验,用于保证数据的最终一致。

2.2.切换感知

切换感知主要解决中心内My SQL数据库主—从切换后通知binlog解析器与传输引擎切换到新的My SQL主库上进行解析binlog与回复binlog。其技术方案如图6-15 所示。

图6-15 切换感知架构图


切换探测集群通过对My SQL执行探测命令确认主—从切换并找出新的主库,并通过ZooKeeper通知binlog解析器和传输引擎组件。为了实现切换感知的高可用性,切换感知也实现了集群部署。切换感知通过管理平台配置传输管道和探测频率,即可定时发起对传输管道下My SQL集群主—从切换的探测。
切换感知的探测流程如图所示:

为了保障切换感知结果的正确性,切换感知采用双向确认的方式,即当发现My SQL集群有主—从切换,则切换感知会分别向新、老Master发起切换探测,只有结果一致,才会确认发生了主—从切换。具体实现流程如下:

  • ①切换感知定时在My SQL集群中实例执行show slave status命令;
  • ②获取每个实例的关键信息,对关键信息进行前后两次对比,检查前后差异,根据差异发现Master差异;
  • ③查询老Master读写属性,如果老Master写未关闭,不做切换通知,如果关闭,则进入第④步;
  • ④查询新Master读写属性,如果新Master写打开,通知切换;如果关闭每隔3s重新读取,新Master写未打开,进入第⑤步;
  • ⑤发起My SQL集群内写实例(写属性打开的实例)探查,如果发现写实例,通过命令show slave status分析是否有其他实例从该写实例同步数据,如果有,确认该写实例为新Master,记录日志发起切换通知;如果没有,发起告警,并停止My SQL集群中心间数据同步。

由于切换感知的每次探测中间是有时间间隔的,因此,不可避免地会出现在间隔期发生主—从切换的情况。如果在切换感知探测之后发生了主—从切换,传输引擎在加载数据时会遇到只读异常(因为原主库已经切换成为只读备库),这时切换感知会立即发起主—从探测,等待探测结束后,新Master重新加载数据。
    当binlog解析得到My SQL Master切换消息后,会判断当前Master是否同步完成,等待同步完成,再切换到新Master进行binlog解析。切换到新的主库中需要根据binlog的GTID进行数据排重。

3.binlog解析
My SQL主备数据复制实现原理如图6-17所示。

图6-17 MySQL主备数据复制实现原理
从上层来看,复制分成3步:
①Master将改变记录到二进制日志(binlog)中(这些记录叫作二进制日志事件,可以通过show binlog events命令进行查看);
②Slave将Master的binlog events拷贝到它的中继日志(Relay log);
③Slave重做中继日志中的事件,将改变反映它自己的数据。
关于binlog的解析原理,感兴趣的读者可参考阿里巴巴旗下的一款开源项目Canal,这里不再赘述。
4.传输引擎
通过对接解析器,获取数据库增量日志数据,将增量数据传输到异地机房并加载到相应的My SQL主库中。
传输引擎架构如图6-18所示。Manager运行时推送同步配置到节点;节点将同步状态反馈到Manager上;基于ZooKeeper解决分布式状态下的调度,允许多节点之间协同工作。
传输引擎采用S/E/T/L阶段模型,即数据接入、数据提取、数据转换和数据加载,如图6-19所示。为了更好地支持系统的扩展性和灵活性,将整个同步流程抽象为Select、Extract、Transform、Load 4个阶段。
Select阶段:解决数据来源的差异性,如接入binlog解析获取增量数据,也可以通过接入其他系统获取其他数据等。

图6-18 传输引擎架构图

图6-19 S/E/T/L阶段模型
Extract、Transform、Load阶段:类似于传统的BI的ETL模型,具体可为数据接入、数据转换、数据载入等操作。
传输引擎的数据同步工作原理如图6-20所示。

图6-20 传输引擎工作原理图
工作原理描述如下:

  • ①由配置人员在管理节点配置传输管道的相关信息,同步启动;
  • ②由管理节点推送传输管道配置信息到传输引擎以及ZooKeeper中,并在ZooKeeper中写入同步任务,需要跨中心同步配置信息;
  • ③开启binlog解析器,同步数据;
  • ④由传输引擎获取同步任务,并接入binlong解析器开始同步;
  • ⑤传输引擎反馈同步状态给管理节点。

为了提升数据同步效率,数据入库摒弃原有事务顺序,采用最终一致性提升入库性能。入库算法采取了按PK Hash并行载入+batch合并的优化。打散原始数据库事务,预处理数据,合并Insert/Update/Delete数据,然后按照Table + PK进行并行(相同Table的数据,先执行Delete,后执行Insert/Update,串行保证,解决唯一性约束数据变更问题),相同Table的SQL会进行Batch合并处理。

  • 数据合并处理:
    Insert + Update→Insert;
    Insert + Delete→Delete;
    Update + Update→Update;
    Update + Delete→Delete。

5.数据稽核
主—从数据同步是一个复杂的过程,在中心间数据同步过程中难以避免会产生数据不一致的问题。数据稽核是保障中心间数据同步的最终一致性的主要手段,分为实时增量校验和定时全量校验,根据校验的结果进行手动或自动修复数据。
在数据同步过程中,导致数据不一致常见的有以下两种情况。
第一种情况是同一条数据“同时”修改,造成这种情况有以下两种原因:

  • ①上层应用系统通过DNS做流量切换,DNS在收敛时间内可能导致同一条数据同时修改;
  • ②上层应用没有控制,导致公共数据同时修改。

第二种情况是在数据同步过程中可能发生异常导致数据丢失,如:

  • ①MySQL不可用,包括My SQL所在主机宕机、MySQL宕机等丢失未Dump的binlog;
  • ②中心间网络不可用导致binlog未及时存储。

在数据一致性保障机制方面,应根据不一致原因采用不同的策略。
对于第一种同一条数据“同时”修改的情况,由于在双中心的背景下,不允许同一条数据“同时”修改,所以应采用实时校验的方式及时发现不一致的数据并告警。
“同时”是一个时间段,表示A中心修改数据开始直到B中心可见为止。“同时”定义示意如图6-21所示。

图6-21 “同时”定义示意图
实时校验主要解决发现同一条数据“同时”在两个中心修改的问题。通过时间交集算法发现可能“同时”修改的数据,对此数据进行二次校验确认是否异常,以及发起告警、申请手工修复。实时校验原理如图6-22所示。


实时校验过程描述如下。

  • ①binlog解析完数据后,根据PK归属原则、分析出数据流向是否异常,例如,中心2的数据流向为从右到左,如果发现中心2的数据出现从左向右流动,说明上层系统发生中心间切换,此时发起数据实时校验。将数据存入Redis中,使用表名+PK作为Key,Value中包含数据产生时间(Ta),失效时间设置为两倍同步时间+消息处理时间。
  • ②数据Load完成后,将数据发送给Kafka,数据中包含数据产生时间(Tb1)以及当前时间(Tb2)。
  • ③实时校验节点获取Kafka消息。
  • ④实时校验节点以表名+PK为Key,从Redis中获取数据,如果数据存在,从数据中读取时间(Ta);如果时间(Ta)正好在Kafka消息中的两个数据Tb1与Tb2之间,说明数据修改发生冲突。
  • ⑤两中心数据发起核对,如果不一致,反馈差异到管理节点,发出告警、申请人工修复。

对于第二种数据丢失的情况,数据丢失修复应采用定时全表数据核对,并根据修复策略进行自动或者手工修复,定时全量校验原理如图6-23所示。

图6-23 定时全量校验原理图
定时全量校验过程描述如下。

  • ①该过程由管理节点发起任务,并从两个中心各选一个校验工作节点,并选出其中一个作为主节点。
  • ②主节点按块(Chunk)进行CRC32计算,具体计算如:通过分页SQL语句查询出Chunk(例如,Chunk设置为1000)条数据,并按照PK排序,进行数据CRC32计算,并取出边界PK。可以在数据库中计算,也可以批量获取后在校验节点中进行计算。
  • ③把SQL语句以及边界PK发给从校验节点,主节点发起下一块CRC计算,等待从节点返回结果。
  • ④从节点发起SQL执行,获取CRC校验,并获取边界PK。
  • ⑤从节点检查是否有差异,返回结果给主节点。
  • ⑥主节点根据返回结果判断,如果CRC32数值不一致,发起该块数据逐条计算CRC32值,找出不一致的数据并记录,等待两倍数据同步时间,再计算该条数据在两个库中的CRC32值,比较是否一致,如果不一致,再与上次计算的值分别计算;如果还不一致说明数据持续有修改,把该条数据反馈给管理节点,发出告警。如果与上次计算CRC32值一致,启动修复机制。

差异告警是数据稽核发现有数据不一致,异步往管理平台发送告警数据,包括差异类型、差异数据点等。差异类型有中心1缺失数据、中心2缺失数据、中心1和中心2字段数据差异。
数据修复针对差异类型不同提供不同的修复策略。如中心1数据缺失或者中心2数据缺失需要根据数据归属以及binlog解析日志进行删除或者插入修复动作;中心1和中心2字段差异,则需要根据数据归属以及修改数据进行修复。修复数据前会记录修复前的数据以及修复时间等信息。

6.同步表限制条件
在没有分布式锁限制情况下,My SQL主—主双活模式不能百分之百保障数据一致,且要满足数据同步时延、吞吐量要求,需要对同步的数据库提以下限制条件(见表6-7),但不仅仅局限于以下条件。

异地多活数据同步平台相关推荐

  1. 去哪儿网数据同步平台技术演进与实践

    作者介绍 井显生,2019年加入去哪儿,现负责国内机票出票.退款.改签核心业务.在领域驱动设计(DDD).高并发有大量实践经验. 一.前言 去哪儿网国内机票售后是为用户提供退票.改签.航班变动.行程服 ...

  2. SAP工具箱 数据同步平台(九 与PO整合)

    点击蓝字 关注我们 一 前言 数据同步平台是在ABAP中开发的一个数据同步工具,类似于LTRC,通过配置实现任意两个数据库的数据同步(ABAP需要配置相关的外部数据库连接). 数据同步平台的底层通过调 ...

  3. DataLink 数据同步平台

    文章目录 一.数据同步平台 概述 核心能力 工作原理 详细流程 二.快速接入 部署中间件 程序配置 创建数据库表 启动应用 注意事项 三.扩展:四种 CDC 方案比较优劣 一.数据同步平台 在项目开发 ...

  4. 千万级日订单下,饿了么异地多活数据实施DRC的应用实践

    http://www.sohu.com/a/161206810_463994 今天,我主要分享饿了么多活的底层数据实施,和大家介绍在整个多活的设计和实施过程中,我们是怎么处理异地数据同步的,而这个数据 ...

  5. 专访阿里巴巴毕玄:异地多活数据中心项目的来龙去脉

    大数据时代,数据中心的异地容灾变得非常重要.在去年双十一之前,阿里巴巴上线了数据中心异地双活项目.InfoQ就该项目采访了阿里巴巴的林昊(花名毕玄). 毕玄是阿里巴巴技术保障部的研究员,负责性能容量架 ...

  6. 低代码在爱奇艺鹊桥数据同步平台的实践

    前言 为应对软件危机,诞生了软件工程,以期望其达到降低软件生产成本 .改进软件产品质量.提高软件生产率水平的目标.自上个世纪60年代以来,从模块化.面向对象设计到设计模式,从瀑布流模型到敏捷开发,de ...

  7. 基于dataX的数据同步平台搭建

    前言 基于Java和DataX工具实现数据同步的后台管理,包括数据同步任务的生成,任务的管理,查看任务的执行日志,解析任务的执行结果等功能. 内含一些技术实现方案.心得体会和填坑经验等干货. 阅读本文 ...

  8. 离线数据同步平台datax+报表可视化平台metabase

    datax DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL.Oracle.SqlServer.Postgre.HDFS.Hive.ADS.HBase.TableS ...

  9. oracle实时异地同步,异地Oracle数据库数据同步

    一.行动目的: 在服务器甲的数据库的A中的表TBL_TB数据发生改变时,服务器乙的数据库B中的表TBL_TB也发生相应变化.(假设两个表的结构相同,都只含有ID,NAME两列) 二.执行步骤: 1)建 ...

最新文章

  1. MVC3项目依赖文件错误解决
  2. 如何创建并运行java线程
  3. DataGrip 2019.2.5 —— MySQL数据表迁移到SQL Server数据表解决方案
  4. arm for asterisk1.8
  5. windows 安装leopard方法
  6. ROS笔记(40) 通讯节点
  7. 框架less和sass
  8. 快速打开计算机磁盘的软件,怎样快速启动电脑
  9. xtrabackup部署以及使用
  10. 新基建东风下,程序员这样乘风破浪!
  11. GarsiaWachs算法:石子归并问题
  12. 关联规则挖掘算法综述
  13. vue返回上一页面时回到原先滚动的位置
  14. 划分vlan实验心得体会_vlan划分实验报告.doc
  15. UML工具 Astah Professional8.0下载
  16. a+b / a-b / a*b / a/b c++问题题解
  17. OR青年|可重复使用资源的在线分配问题综述
  18. 给我5个带”一“字的成语
  19. 腾讯广告算法大赛(即腾讯社交广告算法大赛)
  20. 红米手机4A超简单刷入开发版获取ROOT超级权限的教程

热门文章

  1. 区块链及其扩展方案论文总结
  2. 生物数据库介绍——NCBI
  3. 强化学习的学习之路(四十四)2021-02-13 Monotonic Improvement with KL Divergence
  4. 如果华为拒绝授权5G专利给加拿大会带来什么后果?
  5. 华为手机如何快速清理空间
  6. 【ceph】cephfs内核客户端到MDS的Lookup流程分析--未消化
  7. iis设置mine_IIS Mime类型(转)
  8. 详解:驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server 建立安全连接。
  9. brupsuite靶场 学徒等级 sql注入篇
  10. hadamard积 matlab_Hadamard是谁翻译成哈德码的?