canal1.1.5(源码版本)同步数据mysql5.7至Elasticsearch7.15(记录过程及Windows环境下遇到的所有坑)
前景需要:1.已经安装mysql5.7。2.已经安装Elasticsearch7.15。3.如需要安装ES,请先移步其他教程。4.该文章着重讲解下载源码文件启动遇到的问题。1.canal下载1.1 gitHub 客户端下载地址(已编译过在bin文件内.bat启动的)canal-deployercanal的服务端,启动它才可以在客户端接收数据库变更信息http://canal-deployerhtt
前景需要:
1.已经安装mysql5.7。
2.已经安装Elasticsearch7.15。
3.如若需要安装ES,请移步其他教程。
4.该文章着重讲解下载源码文件本地环境过程及遇到的问题。
1.canal下载
1.1 gitHub 客户端下载地址(已编译过在bin文件内.bat启动的)
canal-deployer
canal的服务端,启动它才可以在客户端接收数据库变更信息
https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.deployer-1.1.5.tar.gz
canal-adapter
客户端,数据落地的适配及启动功能(支持HBase等)
https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.adapter-1.1.5.tar.gz
1.2 源码下载
github下载 https://github.com/alibaba/canal
gitee镜像下载 Gitee 极速下载/canal
2. canal安装配置环境
2.1 canal源码下载
github太慢了,编译后的客户端实在下载不下来,只能从源码想办法解决。
例:gitee码云下载 源码 Gitee 极速下载/canal
下载canal-canal-1.1.5.zip 解压后 如下目录
然后通过idea导入项目,可以分为两个项目导入deployer,client-adapter。
3 deployer 搭建
源码的更改example下的instance.properties配置文件。
instance.properties配置文件
################################################# ## mysql serverId , v1.0.26+ will autoGen canal.instance.mysql.slaveId=1231 # enable gtid use true/false canal.instance.gtidon=false # position info canal.instance.master.address=127.0.0.1:3306 # binlog日志名称 canal.instance.master.journal.name=mysql-bin.000001 canal.instance.master.position=154 canal.instance.master.timestamp= canal.instance.master.gtid= # rds oss binlog canal.instance.rds.accesskey= canal.instance.rds.secretkey= canal.instance.rds.instanceId= # table meta tsdb info canal.instance.tsdb.enable=true #canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb #canal.instance.tsdb.dbUsername=root #canal.instance.tsdb.dbPassword=123456 #canal.instance.standby.address = #canal.instance.standby.journal.name = #canal.instance.standby.position = #canal.instance.standby.timestamp = #canal.instance.standby.gtid= # username/password mysql数据库账户 canal.instance.dbUsername=root canal.instance.dbPassword=123456 canal.instance.connectionCharset = UTF-8 # enable druid Decrypt database password canal.instance.enableDruid=false #canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ== # table regex # table regex .*\\..*表示监听所有表 也可以写具体的表名,用,隔开 # table regex #table正则表达式默认所有 #mysql 数据解析关注的表,Perl正则表达式. #多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\) #常见例子: #1. 所有表:.* or .*\\..* #2. canal schema下所有表: canal\\..* #3. canal下的以canal打头的表:canal\\.canal.* #4. canal schema下的一张表:canal.test1 #5. 多个规则组合使用:canal\\..*,mysql.test1,mysql.test2 (逗号分隔) #注意:此过滤条件只针对row模式的数据有效(ps. mixed/statement因为不解析sql,所以无法准确提取tableName进行过滤) canal.instance.filter.regex=.*\\..* # table black regex # mysql 数据解析表的黑名单,多个表用,隔开 canal.instance.filter.black.regex=mysql\\.slave_.* # table field filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2) #canal.instance.filter.field=test1.t_product:id/subject/keywords,test2.t_company:id/name/contact/ch # table field black filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2) #canal.instance.filter.black.field=test1.t_product:subject/product_image,test2.t_company:id/name/contact/ch # mq config canal.mq.topic=example # dynamic topic route by schema or table regex #canal.mq.dynamicTopic=mytest1.user,mytest2\\..*,.*\\..* canal.mq.partition=0 # hash partition config #canal.mq.partitionsNum=3 #canal.mq.partitionHash=test.table:id^name,.*\\..* #canal.mq.dynamicTopicPartitionNum=test.*:4,mycanal:6 #################################################
服务端启动:
直接运行启动类 CanalLauncher
启动以后默认有三个端口:(resources/canal.properties可看到相关配置)
admin端口:11110
tcp端口:11111
metiric端口:11112
4.canal-adapter
Idea直接引入client-adapter,结构如下。
配置文件:
客户端服务: launcher/resource/application.yml
server: #springboot启动端口 port: 8081 spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 default-property-inclusion: non_null canal.conf: #服务端tcp通信地址 canalServerHost: 127.0.0.1:11111 batchSize: 500 syncBatchSize: 1000 retries: 0 timeout: 10 accessKey: 1222 secretKey: 1222 mode: tcp consumerProperties: # canal tcp consumer #服务端tcp通信地址 canal.tcp.server.host: 127.0.0.1:11111 canal.tcp.zookeeper.hosts: canal.tcp.batch.size: 500 canal.tcp.username: admin canal.tcp.password: admin123 srcDataSources: defaultDS: url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true username: root password: 123456 canalAdapters: # canal instance Name or mq topic name #注意:instance 一定要和服务端的 instance name一致 - instance: example groups: - groupId: g1 outerAdapters: - name: logger - name: es7 key: exampleKey # 127.0.0.1:9200 for rest mode hosts: http://127.0.0.1:9200 #http://10.0.0.3:9200,http://10.0.0.4:9200,http://10.0.0.5:9200 properties: # only used for rest mode mode: rest # security.auth: elastic:a123456 # cluster.name: elastic-application
es相关配置 : es7x/resource/es7/mytest_user.yml
mysql和ES映射的索引需要提前创建好!!
dataSourceKey: defaultDS #和上面canal.conf.srcDataSources.defaultDS要一样 outerAdapterKey: exampleKey #和上面canal.conf.canalAdapters.instance.groups.outerAdapters.key要一样 destination: example #和上面canal.conf.canalAdapters.instance要一样 groupId: g1 #和上面canal.conf.canalAdapters.instance.groups.groupId要一样 esMapping: _index: user #索引名称 _id: _id #documentid _type: _doc # type # upsert: true # pk: id # 查询的sql返回的结构要使用as别名和es的filed对应 sql: "select id as _id , name as name ,sex as sex ,age as age from stu" # objFields: # _labels: array:; commitBatch: 3000 #批量提交数量
启动 CanalAdapterApplication
5.可能会遇到的问题!!!
这些问题都是血与泪的总结 !! !
5.1 connector.tcp maven下载不到
maven仓库没有,这个包我网上找了半天没找到。最后在其他版本编译后的版本找到。
connector.tcp-1.1.5-jar-with-dependencies.jar-其它文档类资源-CSDN下载
5.2 Druid数据源冲突
java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassCastException: com.alibaba.druid.pool.DruidDataSource cannot be cast to com.alibaba.druid.pool.DruidDataSource
原因:common和escore的druid包冲突。
解决方案 :
限制escore的pom文件中的druid的作用域
<scope>provided</scope>
clean后,重新install,es7x项目也需要clean重新引入。
切记!!!顺序一定要对!不然导错包还可能有问题! (!!!顺序正确5.3的异常就不会有)
1.clean escore,重新install。
2.clean es7x包 重新install (它依赖escore,同时会在launcher/target/中生成es7文件)
3.launcher必须要install后再启动,不然会报找不到类。
5.3 Config dir not found.
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: Config dir not found.
at com.alibaba.otter.canal.client.adapter.es.core.ESAdapter.init(ESAdapter.java:83) ~[client-adapter.es7x-1.1.5-jar-with-dependencies.jar:na]
at com.alibaba.otter.canal.client.adapter.es7x.ES7xAdapter.init(ES7xAdapter.java:52) ~[client-adapter.es7x-1.1.5-jar-with-dependencies.jar:na]
... 42 common frames omitted
Caused by: java.lang.RuntimeException: Config dir not found.
at com.alibaba.otter.canal.client.adapter.support.Util.getConfDirPath(Util.java:105) ~[classes/:na]
at com.alibaba.otter.canal.client.adapter.es.core.monitor.ESConfigMonitor.init(ESConfigMonitor.java:36) ~[client-adapter.es7x-1.1.5-jar-with-dependencies.jar:na]
at com.alibaba.otter.canal.client.adapter.es.core.ESAdapter.init(ESAdapter.java:81) ~[client-adapter.es7x-1.1.5-jar-with-dependencies.jar:na]
... 43 common frames omitted
根据一步步Debug最后发现是缺少es7 这个文件,它在es7x内,需要手动复制过去。
这个图是已经复制过后的 ↓↓↓↓↓↓
6 整体测试效果
1.需要先启动deployer
启动后无效果,不报错就是成功了。
2.启动client-adapter
3.测试
通过Postman发送全量同步请求 这个端口号是 client-adapter配置的 默认是8081
mysql测试数据
client-adapter 服务响应
最后ES查询效果效果
完结撒花!
参考的资源:
Canal-adapter1.1.4集成Elasticsearch7.8.0排坑指南及在本地环境运行canal-adapter项目 - 知乎
更多推荐
所有评论(0)