数据实时增量同步之CDC⼯具—Canal、mysql_stream、go-
mysql-tr。。。
@
⽬录
[Mysql数据实时增量同步之CDC⼯具—Canal、mysql_stream、go-mysql-transfer、Maxwell:
什么是CDC?
CDC(Change Data Capture)是变更数据获取的简称。可以基于增量⽇志,以极低的侵⼊性来完成增量数据捕获的⼯作。核⼼思想是,监测并捕获数据库的变动(包括数据或数据表的插⼊、更新以及删除等),将这些变更按发⽣的顺序完整记录下来,写⼊到消息中间件中以供其他服务进⾏订阅及消费。
简单来讲:CDC是指从源数据库捕获到数据和数据结构(也称为模式)的增量变更,近乎实时地将这些变更,传播到其他数据库或应⽤程序之处。
通过这种⽅式,CDC能够向数据仓库提供⾼效、低延迟的数据传输,以便信息被及时转换并交付给专供分析的应⽤程序。
与批量复制相⽐,变更数据的捕获通常具有如下三项基本优势:
CDC通过仅发送增量的变更,来降低通过⽹络传输数据的成本。
CDC可以帮助⽤户根据最新的数据做出更快、更准确的决策。例如,CDC会将事务直接传输到专供分析的应⽤上。
CDC最⼤限度地减少了对于⽣产环境⽹络流量的⼲扰。
CDC⼯具对⽐
特⾊Canal mysql_stream go-mysql-transfer Maxwell
开发语⾔Java Python Golang Java
⾼可⽤⽀持⽀持⽀持⽀持
接收端编码
定制
Kafka等(MQ)
Redis、MongoDB、Elasticsearch、RabbitMQ、
Kafka、RocketMQ、HTTP API 等
Kafka,Kinesis、RabbitMQ、Redis、Google
Cloud Pub/Sub、⽂件等
全量数据初始化不⽀
⽀持⽀持⽀持
数据格式编码
定制
Json(固定格
式)
Json(规则配置) 模板语法 Lua脚本JSON
性能(4-
8TPS)
实现原理:
1、go-mysql-transfer将⾃⼰伪装成MySQL的Slave,
2、向Master发送dump协议获取binlog,解析binlog并⽣成消息
3、将⽣成的消息实时、批量发送给接收端
Mysql binlog 讲解:
MySQL的⼆进制⽇志可以说MySQL最重要的⽇志了,它记录了所有的DDL和DML(除了数据查询语句)语句,
以事件形式记录,还包含语句所执⾏的消耗的时间,MySQL的⼆进制⽇志是事务安全型的。
⼀般来说开启⼆进制⽇志⼤概会有1%的性能损耗。
⼆进制⽇志两个最重要的使⽤场景:
MySQL Replication在Master端开启binlog,Master把它的⼆进制⽇志传递给slaves来达到master-slave数据⼀致的⽬的。
数据恢复,通过使⽤mysqlbinlog⼯具来使恢复数据。
⼆进制⽇志包括两类⽂件:
⼆进制⽇志索引⽂件(⽂件名后缀为.index)⽤于记录所有的⼆进制⽂件
⼆进制⽇志⽂件(⽂件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。
binlog⽂件的滚动:
达到了滚动的⼤⼩
mysql服务停⽌
mysql binlog的三种格式
在配置⽂件中可以选择配置 binlog_format= statement|mixed|row
ROW 模式(⼀般就⽤它)
⽇志会记录每⼀⾏数据被修改的形式,不会记录执⾏ SQL 语句的上下⽂相关信息,只记录要修改的数据,哪条数据被修改了,修改成了什么样⼦,只有 value,不会有 SQL 多表关联的情况。
优点:它仅仅只需要记录哪条数据被修改了,修改成什么样⼦了,所以它的⽇志内容会⾮常清楚地记录下每⼀⾏数据修改的细节,⾮常容易理解。
缺点:ROW 模式下,特别是数据添加的情况下,所有执⾏的语句都会记录到⽇志中,都将以每⾏记录的修改来记录,这样会产⽣⼤量的⽇志内容。
STATEMENT 模式
每条会修改数据的 SQL 语句都会被记录下来。
缺点:由于它是记录的执⾏语句,所以,为了让这些语句在 slave 端也能正确执⾏,那他还必须记录每条语句在执⾏过程中的⼀些相关信息,也就是上下⽂信息,以保证所有语句在 slave 端被执⾏的时候能够得到和在 master 端执⾏时候相同的结果。
mysql连接工具
但⽬前例如 step()函数在有些版本中就不能被正确复制,在存储过程中使⽤了 last-insert-id()函数,可能会使 slave 和 master 上得到不⼀致的 id,就是会出现数据不⼀致的情况,ROW 模式下就没有。
MIXED 模式
以上两种模式都使⽤。
常见的数据采集⼯具(相关知识):
DataX、Flume、Canal、Sqoop、LogStash
DataX (处理离线数据)
DataX 是阿⾥巴巴开源的⼀个异构数据源离线同步⼯具,异构数据源离线同步指的是将源端数据同步到⽬的端,但是端与端的数据源类型种
类繁多,在没有 DataX 之前,端与端的链路将组成⼀个复杂的⽹状结构,⾮常零散⽆法把同步核⼼逻辑抽象出来。
为了解决异构数据源同步问题,DataX 将复杂的⽹状的同步链路变成了星型数据链路,DataX 作为中间传输载体负责连接各种数据源。
所以,当需要接⼊⼀个新的数据源的时候,只需要将此数据源对接到 DataX,就可以跟已有的数据源做到⽆缝数据同步。
DataX本⾝作为离线数据同步框架,采⽤Framework+plugin架构构建。将数据源读取和写⼊抽象成为Reader/Writer插件,纳⼊到整个同步框架中。
1. Reader: 它为数据采集模块,负责采集数据源的数据,将数据发送给Framework。
2. Writer: 它为数据写⼊模块,负责不断向Framework取数据,并将数据写⼊到⽬的端。
3. Framework:它⽤于连接Reader和Writer,作为两者的数据传输通道,并处理缓冲、并发、数据转换等问题。
核⼼模块介绍:
1. DataX完成单个数据同步的作业,我们把它称之为Job,DataX接收到⼀个Job之后,将启动⼀个进程来完成整个作业同步过程。
2. DataX Job启动后,会根据不同的源端切分策略,将Job切分成多个⼩的Task(⼦任务),以便于并发执⾏。
3. 切分多个Task之后,DataX Job会调⽤Scheduler模块,根据配置的并发数据量,将拆分成的Task重新组合,组装成TaskGroup(任务
组)。每⼀个TaskGroup负责以⼀定的并发运⾏完毕分配好的所有Task,默认单个任务组的并发数量为5。
4. 每⼀个Task都由TaskGroup负责启动,Task启动后,会固定启动Reader->Channel->Writer的线程来完成任务同步⼯作。
5. DataX作业运⾏完成之后,Job监控并等待多个TaskGroup模块任务完成,等待所有TaskGroup任务完成后Job成功退出。否则,异常
退出。
Flume(处理实时数据)
Flume主要应⽤的场景是同步⽇志数据,主要包含三个组件:Source、Channel、Sink。
Flume最⼤的优点就是官⽹提供了丰富的Source、Channel、Sink,根据不同的业务需求,我们可以在官⽹查相关配置。另外,Flume还提供了⾃定义这些组件的接⼝。
Logstash(处理离线数据)
Logstash就是⼀根具备实时数据传输能⼒的管道,负责将数据信息从管道的输⼊端传输到管道的输出端;与此同时这根管道还可以让你根据⾃⼰的需求在中间加上过滤⽹,Logstash提供了很多功能强⼤的过滤⽹来满⾜各种应⽤场景。
Logstash是由JRuby编写,使⽤基于消息的简单架构,在JVM上运⾏。在管道内的数据流称之为event,它分为inputs阶段、filters阶段、outputs阶段。
Sqoop(处理离线数据)
Sqoop是Hadoop和关系型数据库之间传送数据的⼀种⼯具,它是⽤来从关系型数据库如MySQL到Hadoop的HDFS从Hadoop⽂件系统导出数据到关系型数据库。Sqoop底层⽤的还是MapReducer,⽤的时候⼀定要注意数据倾斜。
注:sqoop不是CDC⼯具 sqoop是基于查询的全量数据捕获.
参考: