互联网时代除了业务迭代速度快,还有就是数据增速也比较快。单应用、单实例、单数据库的时代早已不复返。现在,作为技术研发,如果参与的项目没有用到分库分表,都不好意说自己做过大项目。

以电商为例, 角色分为买家和卖家,当网站的规模发展到一定的规模后,系统订单采用单表是满足不了用户需求的。分库分表势在必行。由于存在买家、卖家两个维度,所以一个Sharding Key满足不了业务需求。

常规的解决方式是采用空间换时间,毕竟存储的成本越来越低,我们会考虑数据复制,异构化处理。也同步一份数据到卖家的订单库,然后以卖家uid作为 Sharding Key 分片,专门供商家查询订单。

数据异构有两种方式:

1、写入DB订单表时,采用双写模式,买家表创建完后,然后在卖家表也创建一份数据记录,可以采用不用的分表键,写入不同的数据分片中。由于额外增加数据同步的写操作,会导致同步接口RT增大,从而影响整个系统的QPS。

可能有同学立马会说,我们可以采用异步方式,系统启动时初始化一个线程池,把同步业务逻辑封装成任务丢给线程池异步去执行。由于是本地任务,很难监控任务的执行情况,如果不小心赶上发布重启,还会有数据丢失的风险

2、另一种方式可以借助MQ,买家库写完后,发送事务消息,然后接口就可以结束响应。至于卖家库的操作可以消息任务,异步去写入,如果写入失败可以借助消息框架自身的重试机制。

缺点:如果一个业务的数据要异构化处理,就需要对所有的业务动作封装MQ消息体,代码无法做到通用性,跟业务强耦合。

3、有没有更通用的方式,可以通过binlog构建数据实时同步。这里要一个阿里巴巴的开源框架 Canal。

MySQL主备复制原理

MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看)

MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)

MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据

Canal 将自己伪装成一个 MySQL 从库,从 MySQL 实时接收 Binlog 然后写入数据库表。为了能够支撑下游众多的数据库,从 Canal 出来的 Binlog 数据肯定不能直接去写下游那么多数据库,一是写不过来,二是对于每个下游数据库,它可能还有一些数据转换和过滤的工作要做。所以需要增加一个 MQ 来解耦上下游。

Canal 从 MySQL 收到 Binlog 并解析成结构化数据之后,直接写入到 MQ 的一个订单 Binlog 主题中,然后每一个需要同步订单数据的业务方,都去订阅这个 MQ 中的订单 Binlog 主题,消费解析后的 Binlog 数据。在每个消费者自己的同步程序中,它既可以直接入库,也可以做一些数据转换、过滤或者计算之后再入库,这样就比较灵活了。

注意:由于采用异步消息,数据同步可能会存在一定延迟,一般都是在毫秒级别,不过要注意监控消息的堆积情况,避免一些特殊情况下,消息大量堆积导致数据同步延迟拉大,进而影响到正常业务。

在数据同步的实时方面,有什么可以做的?

我们都知道电商大促期间,系统的并发是很高的,数据库写操作很频繁,同步的binlog流量会比较大,消费MQ消息的同步程序很容易成为性能瓶颈,从而影响到数据同步实时性。

面对这个问题,我们一般会通过多加一些同步程序的实例数,或者增加线程数,通过增加并发来提升处理能力。但是要考虑一个点,MySQL 主从同步 Binlog,是一个单线程的同步过程,原因很简单,为了确保数据一致性,Binlog 的顺序很重要,是绝对不能乱序的。MQ 的topic也必须设置为只有 1 个分区(队列),这样才能保证数据同步过程中的 Binlog 是严格有序的,写到目标数据库的数据才能是正确的。

但是单线程处理速度肯定跟不上,有没有什么好的解决方案?我们可以考虑跟业务结合起来解决。

比如电商的订单库,不同的binlog并发执行受影响的只可能是同一条记录,也就是说同一个订单,如果更新的 Binlog 执行顺序错了,那同步出来的订单数据真的就错了。相反,不同的行记录,错乱的执行顺序并不会影响到数据的一致性。

画外音:有因果关系的数据之间必须要严格地保证顺序,没有因果关系的数据之间的顺序是无所谓的。

基于这个理论,我们要评估下游同步程序的消费能力,计算出并发数。然后设置 MQ 中topic的分区(队列)数量和并发数一致。因为 MQ 是可以保证同一分区内,消息是有序的。所以我们需要把具有因果关系的 Binlog 放到相同的分区中。对应到订单库就是,相同订单号的 Binlog 必须发到同一个分区上。

关于canal的快速使用,可参考下面的文章

https://github.com/alibaba/canal/wiki/Canal-Kafka-RocketMQ-QuickStart

oracle binlog同步,系统设计 | 通过Binlog来实现系统间数据同步相关推荐

  1. 从青铜到王者的路线,java不同系统间数据同步

    深耕技术,啃下22个技术点 互联网行业更新换代非常快,行业常态便是不断学习,因此这些主流技术你一个都不能落下! ①并发编程 Java并发编程是整个Java开发体系中最难以理解,但也是最重要的知识点之一 ...

  2. 系统重构数据同步利器之Canal实战篇

    一.背景 二话不说,先上图 上图来自于官网(https://github.com/alibaba/canal),基本上涵盖了目前生产环境使用场景了,众所周知,Canal做数据同步已经是行业内标杆了.我 ...

  3. 数据同步之采用时间戳的方法进行增量数据同步(一)

    本文主要介绍源表为单表时,增量数据同步的情况.当源表为多表时,后面的文章会继续介绍. 一.数据同步情况说明 将源数据库S中的A表(将此表称为源表),通过ETL工具同步至目标数据库T的A表(将此表称为目 ...

  4. python 数据库同步_python实现不同数据库间数据同步功能

    功能描述 数据库间数据同步方式很多,在上篇博文中有总结.本文是用py程序实现数据同步. a数据库中有几十张表,要汇聚到b数据库中,且表结构一致,需要准实时的进行数据同步,用工具实现时对其控制有限且配置 ...

  5. 阿里开源数据同步神器DataX异构数据源间数据同步同步MySQL与HDFS相互实战

    Datax 实战使用 继上一篇 阿里开源数据同步神器DataX异构数据源间数据同步基础介绍与快速入门之后的实战篇 1.MySQL-To-HDFS 环境 & 准备说明: 描述: 为了快速搭建测试 ...

  6. php阿里的同步工具canal,基于阿里的Canal实现数据同步

    一.开启同步数据库的binlog功能 (1)开启同步数据端的数据库服务(比如我的将一号虚拟机上的mysql数据库作为同步操作数据库) systemctl start mysql.service mys ...

  7. 基于数据库数据增量同步_基于 Flink SQL CDC 的实时数据同步方案

    简介:Flink 1.11 引入了 Flink SQL CDC,CDC 能给我们数据和业务间能带来什么变化?本文由 Apache Flink PMC,阿里巴巴技术专家伍翀 (云邪)分享,内容将从传统的 ...

  8. 企业系统之间数据同步处理

    引用内容: 数据同步一般是指一个数据源的数据发生改变时,其他相关的数据源的数据也发生相应变化.数据同步可以有五种实现方案,根据具体需求不同,可以采取不同方案. 1. 触发器:在源数据库建立增.删.改触 ...

  9. lte同步信号 matlab,一种TD-LTE系统下行辅同步信号检测方法

    摘 要: 基于相干检测和使用部分相关的非相干检测,提出了一种适用于TD-LTE系统下行辅同步信号SSS(Secondary Synchronization Signal) 的检测方法.根据SSS索引号 ...

  10. datax 持续数据同步_采用DataX实现多表增量数据同步

    这两天验证了一下阿里的DataX数据同步工具,觉得DataX可以用来做管理数据的多级数据同步.DataX用来做批量数据迁移很适合,能够保证数据的一致性,性能也很好,结合时间戳字段,用来实现数据定时增量 ...

最新文章

  1. 推荐5最佳免费图像注释工具
  2. 登陆状态下加入购物车
  3. uva 714——Copying Books
  4. error40无法打开到sql_SQL-mysql游标与触发器
  5. 设计模式---组合模式(C++实现)
  6. 深入解读Docker底层技术cgroup系列(2)——cgroup的初始化
  7. python基于django的学生在线考试自动阅卷系统(含错题本功能)
  8. 中望3d快捷键命令大全_史上最全的天正CAD快捷键命令大全:左撇子的也包括了...
  9. php网站 怎么查是否开源,怎么查看网站的开源程序?
  10. 图片怎么压缩成指定大小?怎么能把图片压缩到200k?
  11. DIV+CSS排版技巧
  12. 读卡器与IC/ID卡的基本认识
  13. Android中调用百度翻译Demo
  14. 人民币大小写转换(php版),JavaScript实现人民币大小写转换
  15. docker镜像 私有创库、端口映射以及 数据卷的创建
  16. [iOS开发]@autoreleasepool原理探究
  17. 16春季计算机应用基础,西交16春季《计算机应用基础》在线作业及答案
  18. Java工程师薪资究竟有多高?
  19. 1094 谷歌的招聘(c语言实现)
  20. 有鼻炎的注意啦~万金不卖的秘方快收着!

热门文章

  1. MapXtreme 2005 学习心得 了解新建MapXtreme项目结构(二)
  2. 利用iptables实现SNAT及DNAT
  3. 流浪北京的日子(二)
  4. JDBC+Servlet+JSP实现简单的数据遍历和查找功能
  5. jaxb xml 生成 java_java-如何使用JAXB定制XML导出
  6. teamcity mysql 配置_TeamCity
  7. OpenCV-图像处理(15、自定义线性滤波)
  8. word中填充效果锁定纵横比_操作基础知识Word文字编辑
  9. php单入口路由设计,php 简单路由实现
  10. mysql生成百万条数据_mysql 快速生成百万条测试数据