目录
一:下载安装包
下载地址: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