@TOC【CDC实时增量同步Mysql数据的工具—Canal、mysql_stream、go-mysql-transfer、Maxwell:https://blog.csdn.net/weixin_...什么是CDC?CDC(ChangeDataCapture)是ChangeDataCapture的缩写。增量数据捕获可以基于增量日志以最小的入侵来完成。核心思想是监听和捕获数据库中的变化(包括数据或数据表的插入、更新、删除等),按照发生的先后顺序记录这些变化,写入消息中间件供其他人使用服务订阅和消费。简而言之:CDC是从源数据库捕获数据和数据结构(也称为模式)的增量更改并近乎实时地传播到其他数据库或应用程序的地方。通过这种方式,CDC能够向数据仓库提供高效、低延迟的数据传输,以便及时将信息转换并交付给专为分析而设计的应用程序。与批量复制相比,更改数据捕获通常具有三个基本优势:CDC通过仅发送增量更改来降低通过网络传输数据的成本。CDC可以帮助用户根据最新的数据做出更快、更准确的决策。例如,CDC会将交易直接流式传输到专用于分析的应用程序。CDC最大限度地减少了对生产网络流量的中断。CDC工具对比特性Canalmysql_streamgo-mysql-transferMaxwell开发语言JavaPythonGolangJava高可用支持支持接收端编码Kafka等自定义(MQ)Redis、MongoDB、Elasticsearch、RabbitMQ、Kafka、RocketMQ、HTTPAPI等GoogleCloud等全数据初始化Pub/Sub、文件等不支持数据格式编码自定义Json(固定格式)Json(规则配置)模板语法Lua脚本JSON性能(4-8TPS)实现原理:1.go-mysql-transfer伪装成一个MySQLslave,2.发送dump协议给master获取binlog,解析binlog并生成消息3.将生成的消息实时批量发送给接收端Mysqlbinlog说明:MySQL的二进制日志可以是据说MySQL中最重要的是它以事件的形式记录了所有的DDL和DML(数据查询语句除外)语句,还包括了语句执行所消耗的时间。MySQL的二进制日志是事务安全的。一般来说,开启二进制日志会有1%左右的性能损失。BinaryLog最重要的两个使用场景:MySQLReplication在Master端开启binlog,Master将自己的Binlog传递给Slave,以达到主从数据一致性的目的。数据恢复,使用mysqlbinlog工具恢复数据。二进制日志包括两类文件:二进制日志索引文件(文件名后缀.index)用于记录所有的二进制文件二进制日志文件(文件名后缀.00000*)记录数据库的所有DDL和DML(数据查询语句除外))语句事件。binlog文件的滚动:当达到滚动大小时,mysql服务停止。mysqlbinlog的三种格式可以在配置文件中选择,配置binlog_format=statement|mixed|rowROW方式(一般使用)。日志会记录每一行数据的修改形式,不会记录执行SQL语句的上下文相关信息,只记录要修改的数据,修改了哪些数据,修改的样子,只记录值,不会有SQL多表关联。优点:只需要记录哪条数据被修改了,长什么样子,所以它的日志内容会清楚的记录每一行数据修改的细节,非常容易理解。缺点:在ROW模式下,尤其是在数据追加的情况下,所有执行的语句都会被记录到日志中,并记录为每一行记录的修改,会产生大量的日志内容。在STATEMENT模式下,每条修改数据的SQL语句都会被记录下来。缺点:由于是记录的执行语句,为了让这些语句在slave端正确执行,还必须记录每条语句执行过程中的一些相关信息,即上下文信息,以保证所有语句在执行时在slave端执行,可以得到和在master端执行一样的结果。但是目前,比如step()函数在某些版本中无法正确复制,存储过程中使用了last-insert-id()函数,可能会导致slave和master上的id不一致,即就是,数据不一致的情况下,没有ROW模式。MIXED模式上面两种模式都会用到。常用数据采集工具(相关知识):DataX、Flume、Canal、Sqoop、LogStashDataX(处理离线数据)DataX是阿里巴巴开源的异构数据源离线同步工具。异构数据源的离线同步是指将源端到端的数据同步到目的端,但端到端的数据源种类繁多。在DataX之前,端到端的链路会形成一个复杂的网络结构,非常碎片化,无法抽象出同步核心逻辑。为了解决异构数据源的同步问题,DataX将复杂的网状同步链路变成了星型数据链路,DataX作为中间传输载体负责连接各种数据源。因此,当你需要访问一个新的数据源时,只需要将这个数据源连接到DataX,就可以实现与已有数据源的无缝数据同步。DataX本身作为一个离线数据同步框架,采用Framework+plugin架构构建。将数据源的读写抽象成一个Reader/Writer插件,融入到整个同步框架中。Reader:是一个数据采集模块,负责从数据源采集数据,并将数据发送给Framework。Writer:是数据写入模块,负责不断从Framework中取数据,并将数据写入目的地。Framework:用于连接Reader和Writer,作为两者之间的数据传输通道,处理缓冲、并发、数据转换等问题。核心模块介绍:DataX完成一个单一的数据同步作业,我们称之为Job。DataX收到一个Job后,会启动一个进程来完成整个Job的同步过程。DataXJob启动后,会根据不同的源端切分策略,将Job分成多个小的Task(子任务)并发执行。拆分多个Task后,DataXJob会调用Scheduler模块,根据配置的并发数据量,将拆分后的Task重新组合成一个TaskGroup(任务组)。每个TaskGroup负责以一定的并发量运行所有分配的任务。单个任务组默认并发数为5,每个Task由TaskGroup启动。Task启动后,会启动Reader->Channel->Writer的线程,完成任务同步。DataX作业完成后,Job监听等待多个TaskGroup模块任务完成,待所有TaskGroup任务完成后Job成功退出。否则,异常退出。Flume(处理实时数据)Flume的主要应用场景是同步日志数据,主要包括三个组件:Source、Channel、Sink。Flume最大的优势在于官网提供了丰富的Sources、Channel、Sinks。根据不同的业务需求,我们可以在官网找到相关的配置。此外,Flume还提供了自定义这些组件的接口。Logstash(处理离线数据)Logstash是一个具有实时数据传输能力的管道,负责将数据信息从管道的输入端传输到管道的输出端;除了过滤器,Logstash还提供了很多强大的过滤器来满足各种应用场景。Logstash是用JRuby编写的,使用简单的基于消息的架构,并在JVM上运行。管道中的数据流称为事件,分为输入阶段、过滤阶段和输出阶段。Sqoop(处理离线数据)Sqoop是一种在Hadoop和关系数据库之间传输数据的工具。它用于将数据从MySQL等关系型数据库导出到Hadoop的HDFS,从Hadoop文件系统到关系型数据库。Sqoop底层还是使用了MapReducer,所以在使用的时候一定要注意数据倾斜。注意:sqoop不是CDC工具。sqoop是一个基于查询的完整数据捕获。参考:https://www.cnblogs.com/zzz01/p/15263071.htmlgo-mysql-transfer产品手册
