暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

使用canal增量同步mysql数据库信息到ElasticSearch

dalaoyang 2019-06-23
433

本文介绍如何使用canal增量同步mysql数据库信息到ElasticSearch。(注意:是增量!!!)

1.简介

1.1 canal介绍

Canal是一个基于MySQL二进制日志的高性能数据同步系统。Canal广泛用于阿里巴巴集团(包括https://www.taobao.com),以提供可靠的低延迟增量数据管道,github地址:https://github.com/alibaba/canal

Canal Server能够解析MySQL binlog并订阅数据更改,而Canal Client可以实现将更改广播到任何地方,例如数据库和Apache Kafka。

它具有以下功能:

  1. 支持所有平台。

  2. 支持由Prometheus提供支持的细粒度系统监控。

  3. 支持通过不同方式解析和订阅MySQL binlog,例如通过GTID。

  4. 支持高性能,实时数据同步。(详见Performance)

  5. Canal Server和Canal Client都支持HA / Scalability,由Apache ZooKeeper提供支持

  6. Docker支持。

缺点:

不支持全量更新,只支持增量更新。

完整wiki地址:https://github.com/alibaba/canal/wiki

1.2 运作原理

原理很简单:

  1. Canal模拟MySQL的slave的交互协议,伪装成mysql slave,并将转发协议发送到MySQL Master服务器。

  2. MySQL Master接收到转储请求并开始将二进制日志推送到slave(即canal)。

  3. Canal将二进制日志对象解析为自己的数据类型(原始字节流)

如图所示:

1.3 同步es

在同步数据到es的时候需要使用适配器:canal adapter。目前最新版本1.1.3,下载地址:https://github.com/alibaba/canal/releases。

目前es貌似支持6.x版本,不支持7.x版本!!!

2.准备工作

2.1 es和jdk

安装es可以参考:https://www.dalaoyang.cn/article/78

安装jdk可以参考:https://www.dalaoyang.cn/article/16

2.2 安装canal server

下载canal.deployer-1.1.3.tar.gz

  1. wget https://github.com/alibaba/canal/releases/download/canal-1.1.3/canal.deployer-1.1.3.tar.gz

解压文件

  1. tar -zxvf canal.deployer-1.1.3.tar.gz

进入解压后的文件夹

  1. cd canal.deployer-1.1.3

修改conf/example/instance.properties文件,主要注意以下几处:

  • canal.instance.master.address:数据库地址,例如127.0.0.1:3306

  • canal.instance.dbUsername:数据库用户

  • canal.instance.dbPassword:数据库密码

完整内容如下:

  1. #################################################

  2. ## mysql serverId , v1.0.26+ will autoGen

  3. # canal.instance.mysql.slaveId=0

  4. # enable gtid use true/false

  5. canal.instance.gtidon=false

  6. # position info

  7. canal.instance.master.address=127.0.0.1:3306

  8. canal.instance.master.journal.name=

  9. canal.instance.master.position=

  10. canal.instance.master.timestamp=

  11. canal.instance.master.gtid=

  12. # rds oss binlog

  13. canal.instance.rds.accesskey=

  14. canal.instance.rds.secretkey=

  15. canal.instance.rds.instanceId=

  16. # table meta tsdb info

  17. canal.instance.tsdb.enable=true

  18. #canal.instance.tsdb.url=

  19. #canal.instance.tsdb.dbUsername=

  20. #canal.instance.tsdb.dbPassword=

  21. #canal.instance.standby.address =

  22. #canal.instance.standby.journal.name =

  23. #canal.instance.standby.position =

  24. #canal.instance.standby.timestamp =

  25. #canal.instance.standby.gtid=

  26. # username/password

  27. canal.instance.dbUsername=root

  28. canal.instance.dbPassword=12345678

  29. canal.instance.connectionCharset = UTF-8

  30. # enable druid Decrypt database password

  31. canal.instance.enableDruid=false

  32. #canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==

  33. # table regex

  34. canal.instance.filter.regex=.*\\..*

  35. # table black regex

  36. canal.instance.filter.black.regex=

  37. # mq config

  38. #canal.mq.topic=example

  39. # dynamic topic route by schema or table regex

  40. #canal.mq.dynamicTopic=mytest1.user,mytest2\\..*,.*\\..*

  41. #canal.mq.partition=0

  42. # hash partition config

  43. #canal.mq.partitionsNum=3

  44. #canal.mq.partitionHash=test.table:id^name,.*\\..*

  45. #################################################

回到canal.deployer-1.1.3目录下,启动canal:

  1. sh bin/startup.sh

查看日志:

  1. vi logs/canal/canal.log

查看具体instance日志:

  1. vi logs/example/example.log

关闭命令

  1. sh bin/stop.sh

2.3 安装canal-adapter

下载canal.adapter-1.1.3.tar.gz

  1. wget https://github.com/alibaba/canal/releases/download/canal-1.1.3/canal.adapter-1.1.3.tar.gz

解压

  1. tar -zxvf canal.adapter-1.1.3.tar.gz

进入解压后的文件夹

  1. cd canal.adapter-1.1.3

修改conf/application.yml文件,主要注意如下内容,由于是yml文件,注意我这里说明的属性名称:

  • server.port:canal-adapter端口号

  • canal.conf.canalServerHost:canal-server地址和ip

  • canal.conf.srcDataSources.defaultDS.url:数据库地址

  • canal.conf.srcDataSources.defaultDS.username:数据库用户名

  • canal.conf.srcDataSources.defaultDS.password:数据库密码

  • canal.conf.canalAdapters.groups.outerAdapters.hosts:es主机地址,tcp端口

完整内容如下:

  1. server:

  2. port: 8081

  3. spring:

  4. jackson:

  5. date-format: yyyy-MM-dd HH:mm:ss

  6. time-zone: GMT+8

  7. default-property-inclusion: non_null

  8. canal.conf:

  9. mode: tcp

  10. canalServerHost: 127.0.0.1:11111

  11. batchSize: 500

  12. syncBatchSize: 1000

  13. retries: 0

  14. timeout:

  15. accessKey:

  16. secretKey:

  17. srcDataSources:

  18. defaultDS:

  19. url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true

  20. username: root

  21. password: 12345678

  22. canalAdapters:

  23. - instance: example

  24. groups:

  25. - groupId: g1

  26. outerAdapters:

  27. - name: es

  28. hosts: 127.0.0.1:9300

  29. properties:

  30. cluster.name: elasticsearch

另外需要配置conf/es/*.yml文件,adapter将会自动加载conf / es下的所有.yml结尾的配置文件。在介绍配置前,需要先介绍一下本案例使用的表结构,如下:

  1. CREATE TABLE `test` (

  2. `id` int(11) NOT NULL,

  3. `name` varchar(200) NOT NULL,

  4. `address` varchar(1000) DEFAULT NULL,

  5. PRIMARY KEY (`id`)

  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

需要手动去es中创建索引,比如这里使用es-head创建,如下图:

test索引结构如下:

  1. {

  2. "mappings":{

  3. "_doc":{

  4. "properties":{

  5. "name":{

  6. "type":"text"

  7. },

  8. "address":{

  9. "type":"text"

  10. }

  11. }

  12. }

  13. }

  14. }

接下来创建test.yml(文件名随意),内容很好理解_index为索引名称,sql为对应语句,内容如下:

  1. dataSourceKey: defaultDS

  2. destination: example

  3. groupId:

  4. esMapping:

  5. _index: test

  6. _type: _doc

  7. _id: _id

  8. upsert: true

  9. sql: "select a.id as _id,a.name,a.address from test a"

  10. commitBatch: 3000

配置完成后,回到canal-adapter根目录,执行命令启动

  1. bin/startup.sh

查看日志

  1. vi logs/adapter/adapter.log

关闭canal-adapter命令

  1. bin/stop.sh

3.测试

都启动成功后,先查看一下es-head,如图,现在是没有任何数据的。

接下来,我们在数据库中插入一条数据进行测试,语句如下:

  1. INSERT INTO `test`.`test`(`id`, `name`, `address`) VALUES (7, '北京', '北京市朝阳区');

然后在看一下es-head,如下

接下来看一下日志,如下:

  1. 2019-06-22 17:54:15.385 [pool-2-thread-1] DEBUG c.a.otter.canal.client.adapter.es.service.ESSyncService - DML: {"data":[{"id":7,"name":"北京","address":"北京市朝阳区"}],"database":"test","destination":"example","es":1561197255000,"groupId":null,"isDdl":false,"old":null,"pkNames":["id"],"sql":"","table":"test","ts":1561197255384,"type":"INSERT"}

  2. Affected indexes: test

小知识点:上面介绍的查看日志的方法可能不是很好用,推荐使用如下语法,比如查看日志最后200行:

  1. tail -200f logs/adapter/adapter.log

4.总结

1.全量更新不能实现,但是增删改都是可以的。2.一定要提前创建好索引。3.es配置的是tcp端口,比如默认的9300


-END-


文章转载自dalaoyang,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论