Canal中怎么实现MySQL数据库实时数据同步
这期内容当中小编将会给大家带来有关Canal中怎么实现MySQL数据库实时数据同步,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
1.1 canal介绍
Canal是一个基于MySQL二进制日志的高性能数据同步系统。Canal广泛用于阿里巴巴集团(包括https://www.taobao.com),以提供可靠的低延迟增量数据管道,github地址:https://github.com/alibaba/canal
Canal Server能够解析MySQL binlog并订阅数据更改,而Canal Client可以实现将更改广播到任何地方,例如数据库和Apache Kafka。
它具有以下功能:
支持所有平台。
支持由Prometheus提供支持的细粒度系统监控。
支持通过不同方式解析和订阅MySQL binlog,例如通过GTID。
支持高性能,实时数据同步。(详见Performance)
Canal Server和Canal Client都支持HA / Scalability,由Apache ZooKeeper提供支持
Docker支持。
缺点:
不支持全量更新,只支持增量更新。
完整wiki地址:https://github.com/alibaba/canal/wiki
1.2 运作原理
原理很简单:
鸿蒙官方战略合作共建——HarmonyOS技术社区
Canal模拟MySQL的slave的交互协议,伪装成mysql slave,并将转发协议发送到MySQL Master服务器。
MySQL Master接收到转储请求并开始将二进制日志推送到slave(即canal)。
Canal将二进制日志对象解析为自己的数据类型(原始字节流)
如图所示:
准备工作
2.1 下载解压canal-server
通过 github 下载 canal-server release 版本(本次安装文档使用v1.1.4)
root@locahost:/#wgethttps://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz
解压
tar-zxvfcanal.deployer-1.1.4.tar.gz
2.2 下载解压 canal-adapter
通过 github 下载 canal-adapter release 版本(本次安装文档使用v1.1.4)
root@locahost:/#wgethttps://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.adapter-1.1.4.tar.gz
解压
tar-zxvfcanal.adapter-1.1.4.tar.gz
配置 canal-server
3.1 canal-server 配置
解压之后进入 conf文件夹中,修改 canal.properties 根据实际需要来修改(如果不使用kafka或MQ 默认tcp即可)
canal.destinations=prod#指定instance的名字多个使用逗号分隔
保存之后在conf目录创建 prod 文件夹并将 example文件夹中的 nstance.properties copy 到and_prod中
mkdirant_prod#创建文件夹cpexample/nstance.propertiesprod/#copy文件
修改 nstance.properties 配置如下:
canal.instance.master.address=127.0.0.1:3306#源Mysql地址canalcanal.instance.dbUsername=canal#源Mysql账号canalcanal.instance.dbPassword=canal#源Mysql密码canal.instance.connectionCharset=UTF-8#与源数据库编码格式一致canal.instance.defaultDatabaseName=test_database#默认监听源数据库
3.2 canal-server 启动
进入 canal-server bin 目录 启动
cdcanal-server/bin#进入目录./startup.sh&#后台启动
查看日志,是否启动成功
cdcanal-server/logs/ant_prod#进入日志目录
启动成功:
2020-06-0917:13:04.956[main]WARNo.s.beans.GenericTypeAwarePropertyDescriptor-InvalidJavaBeanproperty'connectionCharset'beingaccessed!Ambiguouswritemethodsfoundnexttoactuallyused[publicvoidcom.alibaba.otter.canal.parse.inbound.mysql.AbstractMysqlEventParser.setConnectionCharset(java.nio.charset.Charset)]:[publicvoidcom.alibaba.otter.canal.parse.inbound.mysql.AbstractMysqlEventParser.setConnectionCharset(java.lang.String)]2020-06-0917:13:04.990[main]INFOc.a.o.c.i.spring.support.PropertyPlaceholderConfigurer-Loadingpropertiesfilefromclasspathresource[canal.properties]2020-06-0917:13:04.990[main]INFOc.a.o.c.i.spring.support.PropertyPlaceholderConfigurer-Loadingpropertiesfilefromclasspathresource[ant_prod/instance.properties]2020-06-0917:13:05.305[main]INFOc.a.otter.canal.instance.spring.CanalInstanceWithSpring-startCannalInstancefor1-ant_prod2020-06-0917:13:05.311[main]WARNc.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert--->inittablefilter:^.*\..*$2020-06-0917:13:05.311[main]WARNc.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert--->inittableblackfilter:2020-06-0917:13:05.315[main]INFOc.a.otter.canal.instance.core.AbstractCanalInstance-startsuccessful....2020-06-0917:13:05.422[destination=ant_prod,address=rm-wz99s5v03gso12521.mysql.rds.aliyuncs.com/192.xxxxxx:3306,EventParser]WARNc.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy---->begintofindstartposition,itwillbelongtimeforresetorfirstposition2020-06-0917:13:05.423[destination=ant_prod,address=rm-wz99s5v03gso12521.mysql.rds.aliyuncs.com/192.xxxxxx:3306,EventParser]WARNc.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy-preparetofindstartpositionjustshowmasterstatus2020-06-0917:13:06.483[destination=ant_prod,address=rm-wz99s5v03gso12521.mysql.rds.aliyuncs.com/192.xxxxxx:3306,EventParser]WARNc.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy---->findstartpositionsuccessfully,EntryPosition[included=false,journalName=mysql-bin.000234,position=6676924,serverId=184376678,gtid=,timestamp=1591693973000]cost:1051ms,thenextstepisbinlogdump
配置 canal-adapter
4.1 canal-adapter 配置
由于Mysql 是8.0 这里需要下载 mysql-connector-java-8.0.20.jar,并将其放入lib中
cpmysql-connector-java-8.0.20.jar/canal-adapter/lib/
解压之后进入 conf文件夹中,修改 application.yml
server:port:8089spring:jackson:date-format:yyyy-MM-ddHH:mm:sstime-zone:GMT+8default-property-inclusion:non_nullcanal.conf:mode:tcp#kafkarocketMQcanalServerHost:127.0.0.1:11111batchSize:500syncBatchSize:1000retries:0timeout:accessKey:secretKey:#源Mysql地址账号密码等srcDataSources:defaultDS:url:jdbc:mysql://localhost:3306/test_database?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghaiusername:canalpassword:canal#需要实时同步数据库,如果多个实例进行区分即可canalAdapters:-instance:prod#canalinstance,在canal-server中指定instance的名称groups:-groupId:g1outerAdapters:-name:rdbkey:mysql1#唯一标示properties:jdbc.driverClassName:com.mysql.jdbc.Driverjdbc.url:jdbc:mysql://localhost:3306/test_database_01?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghaijdbc.username:canaljdbc.password:canal
编辑rdb目录下面表的映射文件,数据库/表 (多个表创建多个映射文件,文件名对应表名)以此类推
dataSourceKey:defaultDSdestination:prodouterAdapterKey:mysql1concurrent:truedbMapping:database:test_database_01table:testtargetTable:test_database_01.testtargetPk:id:idmapAll:true
4.1 canal-adapter 启动
进入 canal-adapter/bin 目录 启动
cdcanal-adapter/bin#进入目录./startup.sh&#后台启动
查看日志,是否启动成功
cdcanal-adapter/adapter/logs/#进入日志目录tail-fadapter.log#查看日志是否启动成功
测试数据库同步
更新/删除/批量插入/批量更新/批量删除
上述就是小编为大家分享的Canal中怎么实现MySQL数据库实时数据同步了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。