前景需要:

 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

http://localhost:5177/etl/es7/exampleKey/mytest_user.yml

 mysql测试数据

 client-adapter 服务响应

最后ES查询效果效果

                                                                        完结撒花!

参考的资源:

Canal-adapter1.1.4集成Elasticsearch7.8.0排坑指南及在本地环境运行canal-adapter项目 - 知乎

Canal部署过程中的错误_Asker.J的博客-CSDN博客

canal同步mysql数据到elasticsearch7.15.0_TanYYF的专栏-CSDN博客_cannal

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐