Canal同步数据至Elasticsearch

目录

一:下载安装包

二:配置环境

三.安装

1.配置数据库

2.部署Canal-deployer服务端

3.部署Canal-adapter客户端

4.配置es

5.多数据库多表适配

6.部分参考文档:


一:下载安装包

下载地址:Releases · alibaba/canal · GitHub

下载包:

二:配置环境

应用

IP

端口号

版本

备注

kibana

127.0.0.1

5601

6.8.14

kibana版本需要与es版本匹配

ES

127.0.0.1

9200

6.8.14

MySql

127.0.0.1

3306

8.0.11

有配置需要修改

canal-adapter

127.0.0.1

8081

1.1.5

有配置需要修改

canal-deployer

127.0.0.1

11111

1.1.5

有配置需要修改

三.安装

1.配置数据库

1)安装数据库

2)查看binlog是否启动

show variables like 'binlog_format%'

3)如果没有启动,则需要修改以下配置

在/etc/my.cnf文件中开启以下选型

[mysqld]
log-bin=/usr/local/mysql/binlogs/mysql-bin  #开启 binlog
binlog-format=ROW           #选择 ROW 模式,必须为ROW行模式
server_id=1            #配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复

2.部署Canal-deployer服务端

1)安装canal-deployer

 #新建canal-deployer文件夹
 mkdir canal-deployer
 #解压canal.deployer-1.1.5.tar.gz文件到指定目录
 tar zxvf canal.deployer-1.1.5.tar.gz -C  /Users/test/Downloads/canal-deployer

说明:文件夹名称可以不用修改,安装路径可以自定义,无强制要求

安装好之后即可看到完整目录

2)修改配置文件

#进入目录
cd /Users/test/Downloads/canal-deployer/conf/example
#修改配置文件
vim instance.properties 
#修改配置
canal.instance.mysql.slaveId=3 #修改ID,不能和MySQL数据库一致
canal.instance.gtidon=false
canal.instance.master.address=127.0.0.1:3306 #指定mysql数据库地址及端口
# username/password
canal.instance.dbUsername=root    #连接数据库的账号
canal.instance.dbPassword=rootmaster   #连接数据库的密码

3)启动

#进入启动脚本目录
cd /Users/test/Downloads/canal-deployer/bin
#启动 canal-deployer
 ./startup.sh 
#进入日志目录
cd /Users/test/Downloads/canal-deployer/logs/example
#查看日志
tail -f example.log

3.部署Canal-adapter客户端

1)安装Canal-adapter

 #新建canal-adapter
 mkdir canal-adapter
 #解压canal.adapter-1.1.5.tar.gz文件到指定目录
 tar zxvf canal.adapter-1.1.5.tar.gz -C  /Users/yangdanna/Downloads/canal-adapter

说明:文件夹名称可以不用修改,安装路径可以自定义,无强制要求

安装好之后即可看到完整目录

2)添加mysql8.0.11连接器

下载地址:https://repo1.maven.org/maven2/mysql/mysql-connector-java
由于默认canal-adapter的lib中只有mysql5.x版本的连接器,所以需要下载mysql8.x版本连接器

#将mysql-connector-java-8.0.11.jar放到指定目录下
mv  mysql-connector-java-8.0.11.jar  /Users/test/Downloads/canal-adapter/lib  
#修改mysql-connector-java-8.0.11.jar权限
chmod 777 mysql-connector-java-8.0.11.jar

3)修改配置文件

#进入目录
cd /Users/test/Downloads/canal-adapter/conf
#修改文件
vim application.yml 
#修改数据库配置,源数据库可以配置多个
srcDataSources:
    defaultDS:    #注意此处的值对应es文件中的dataSourceKey
      url: jdbc:mysql://127.0.0.1:3306/test001?useUnicode=true      #连接的数据库地址
      username: root      #连接的数据库账号
      password: rootmaster   #连接的数据库密码
    dmsdb01:      #注意此处的值对应es映射文件中的dataSourceKey
      url: jdbc:mysql://127.0.0.1:3306/test002?useUnicode=true
      username: root
      password: rootmaster  
#修改es连接配置
    - name: es6          #此处名字注意修改,对应名字es6
        hosts: 127.0.0.1:9300   # 127.0.0.1:9200 for rest mode  #连接es地址
        properties:
#          mode: transport # or rest
#          # security.auth: test:123456 #  only used for rest mode
          cluster.name: elasticsearch     #es的cluster
      

说明:dms_db_test.yml 与dms_db_test_001 是同一个数据库下的不同表

dms_db_test.yml与dms_db_01_test_01 是不同数据库下的不同表

4)修改适配器映射文件

文件整体样式可参考:

#进入目录(用6.x版本的es配置es6,用7.x新版本的es配置es7)
cd /Users/test/Downloads/canal-adapter/conf/es6
#修改配置文件
vim dms_db_test_001.yml
#配置修改说明
dataSourceKey: defaultDS   #此处注意修改为srcDataSources的key,不同的值对应了不同数据库
destination: example
groupId: g1
esMapping:
  _index: dms_db_test_001 #对应的索引名称
  _type: dms_db_test_001   #对应的type
  _id: _id
  upsert: true
#  pk: id
  sql: "select id as _id,id ,username,name from test_001"  #对应的sql
#  objFields:
#    _labels: array:;
#  etlCondition: "where a.c_time>={}"
  commitBatch: 3000

说明:配置多个映射需要有对应的文件

5)启动canal-adapter

#/Users/test/Downloads/canal-adapter/bin
#进入启动脚本目录
cd /Users/test/Downloads/canal-adapter/bin
#启动 canal-adapter
 ./startup.sh 
#进入日志目录
cd /Users/test/Downloads/canal-adapter/logs/adapter
#查看日志
tail -f adapter.log 

6)错误处理

#启动时如过报如下错误
 java.lang.ClassCastException: com.alibaba.druid.pool.DruidDataSource cannot be cast to com.alibaba.druid.pool.DruidDataSource
#需要下载码源重新打包替换jir包
#在escore的目录下找到pom.xml文件修改配置
 <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>druid</artifactId>
     <!--增加以下代码-->
     <scope>provided</scope>
 </dependency>
 #重新打包后用
/canal-canal-1.1.5/client-adapter/es6x/target/client-adapter.es6x-1.1.5-jar-with-dependencies.jar包替换
 /client-adapter/conf/plugins/client-adapter.es6x-1.1.5-jar-with-dependencies.jar
 #client-adapter.es7x-1.1.5-jar-with-dependencies.jar 也同样替换
 #重新启动

#启动时如过报如下错误
 IllegalArgumentException: Could not resolve placeholder 'HOSTNAME%%.*' in value "history -a; history -a; printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}""
 #需要修改配置文件
 vim /data/canal/canal-adapter/conf/application.yml
 #在配置文件的末尾添加如下内容
 PWD/#$HOME/~:
 USER:
 HOSTNAME%%.*:

#启动时报如下错误
CanalClientException: java.net.NoRouteToHostException: No route to host
#需要关闭防火墙
#查看防火墙状态
systemctl status firewalld.service     
#关闭防火墙
systemctl stop firewalld.service     
systemctl disable firewalld.service  

参考链接:java.net.NoRouteToHostException: No route to host (Host unreachable) 问题的解决方法_huijieshizhu0的博客-CSDN博客

#启动时报如下错误
The Tomcat connector configured to listen on port 8081 failed to start. The port may already be in use or the connector may be misconfigured.
#说明端口号被占用,查看端口号id
lsof -i:8081
#kill掉被占用的
kill -9 1111111

4.配置es

1)新建索引映射

#注意index,type要和/canal-adapter/conf/es6目录下 *.yml配置文件中的对应
PUT dms_db_001
{
    "mappings":{
        "dms_db_test001":{
            "properties":{
                "id":{
                    "type":"long"
                },
                "name":{
                    "type":"text"
                },
                "username":{
                    "type":"text"
                }
            }
        }
    }
}

5.多数据库多表适配

如果需要适配多个数据库多张表,只需要在/canal-adapter/conf/es6目录下新增多个*.yml表,同时需要在es中设置索引以及映射mapping

6.部分参考文档:

/canal-adapter/conf/application.yml 文件

server:
  port: 8081
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
    default-property-inclusion: non_null

canal.conf:
  mode: tcp #tcp kafka rocketMQ rabbitMQ
  flatMessage: true
  zookeeperHosts:
  syncBatchSize: 1000
  retries: 0
  timeout:
  accessKey:
  secretKey:
  consumerProperties:
    # canal tcp consumer
    canal.tcp.server.host: 127.0.0.1:11111
    canal.tcp.zookeeper.hosts:
    canal.tcp.batch.size: 500
    canal.tcp.username:
    canal.tcp.password:
    # kafka consumer
    kafka.bootstrap.servers: 127.0.0.1:9092
    kafka.enable.auto.commit: false
    kafka.auto.commit.interval.ms: 1000
    kafka.auto.offset.reset: latest
    kafka.request.timeout.ms: 40000
    kafka.session.timeout.ms: 30000
    kafka.isolation.level: read_committed
    kafka.max.poll.records: 1000
    # rocketMQ consumer
    rocketmq.namespace:
    rocketmq.namesrv.addr: 127.0.0.1:9876
    rocketmq.batch.size: 1000
    rocketmq.enable.message.trace: false
    rocketmq.customized.trace.topic:
    rocketmq.access.channel:
    rocketmq.subscribe.filter:
    # rabbitMQ consumer
    rabbitmq.host:
    rabbitmq.virtual.host:
    rabbitmq.username:
    rabbitmq.password:
    rabbitmq.resource.ownerId:

  srcDataSources:
    defaultDS:
      url: jdbc:mysql://127.0.0.1:3306/dms_db?useUnicode=true
      username: root
      password: rootmaster
    dmsdb01:
      url: jdbc:mysql://127.0.0.1:3306/dms_db_01?useUnicode=true
      username: root
      password: rootmaster
  canalAdapters:
  - instance: example # canal instance Name or mq topic name
    groups:
    - groupId: g1
      outerAdapters:
      - name: logger
#      - name: rdb
#        key: mysql1
#        properties:
#          jdbc.driverClassName: com.mysql.jdbc.Driver
#          jdbc.url: jdbc:mysql://127.0.0.1:3306/mytest2?useUnicode=true
#          jdbc.username: root
#          jdbc.password: 121212
#      - name: rdb
#        key: oracle1
#        properties:
#          jdbc.driverClassName: oracle.jdbc.OracleDriver
#          jdbc.url: jdbc:oracle:thin:@localhost:49161:XE
#          jdbc.username: mytest
#          jdbc.password: m121212
#      - name: rdb
#        key: postgres1
#        properties:
#          jdbc.driverClassName: org.postgresql.Driver
#          jdbc.url: jdbc:postgresql://localhost:5432/postgres
#          jdbc.username: postgres
#          jdbc.password: 121212
#          threads: 1
#          commitSize: 3000
#      - name: hbase
#        properties:
#          hbase.zookeeper.quorum: 127.0.0.1
#          hbase.zookeeper.property.clientPort: 2181
#          zookeeper.znode.parent: /hbase
      - name: es6
        hosts: 127.0.0.1:9300 # 127.0.0.1:9200 for rest mode
        properties:
#          mode: transport # or rest
#          # security.auth: test:123456 #  only used for rest mode
          cluster.name: elasticsearch
#        - name: kudu
#          key: kudu
#          properties:
#            kudu.master.address: 127.0.0.1 # ',' split multi address

/canal-adapter/conf/es6/dms_db_01_test_01.yml文件

dataSourceKey: dmsdb01
destination: example
groupId: g1
esMapping:
  _index: dms_db_01_test_01
  _type: dms_db_01_test_01
  _id: _id
  upsert: true
#  pk: id
  sql: "select id as _id,id ,username,name from test_01"
#  objFields:
#    _labels: array:;
#  etlCondition: "where a.c_time>={}"
  commitBatch: 3000

/canal-adapter/conf/es6/dms_db_test_001.yml文件

dataSourceKey: defaultDS
destination: example
groupId: g1
esMapping:
  _index: dms_db_test_001
  _type: dms_db_test_001
  _id: _id
  upsert: true
#  pk: id
  sql: "select id as _id,id ,username,name from test_001"
#  objFields:
#    _labels: array:;
#  etlCondition: "where a.c_time>={}"
  commitBatch: 3000

/canal-adapter/conf/es6/dms_db_test.yml文件

dataSourceKey: defaultDS
destination: example
groupId: g1
esMapping:
  _index: dms_db_test
  _type: dms_db_test
  _id: _id
  upsert: true
#  pk: id
  sql: "select id as _id,id ,username,name from test"
#  objFields:
#    _labels: array:;
#  etlCondition: "where a.c_time>={}"
  commitBatch: 3000



 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值