配置 binlog-format 为 ROW 模式,配置my.cnf
[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限, 如果已有账户可直接 grant
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;
wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz
mkdir /data/canal/deployer
tar -zxvf canal.deployer-1.1.4.tar.gz -C deployer/
解压后为:
vi conf/example/instance.properties
## mysql serverId
canal.instance.mysql.slaveId = 1234
#position info,需要改成自己的数据库信息
canal.instance.master.address = 127.0.0.1:3306
canal.instance.master.journal.name =
canal.instance.master.position =
canal.instance.master.timestamp =
#canal.instance.standby.address =
#canal.instance.standby.journal.name =
#canal.instance.standby.position =
#canal.instance.standby.timestamp =
#username/password,需要改成自己的数据库信息
canal.instance.dbUsername = canal
canal.instance.dbPassword = canal
canal.instance.defaultDatabaseName =
canal.instance.connectionCharset = UTF-8
#table regex
canal.instance.filter.regex = .\*\\\\..\*
sh bin/startup.sh
wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.adapter-1.1.4.tar.gz
client-adapter分为适配器和启动器两部分, 适配器为多个fat jar, 每个适配器会将自己所需的依赖打成一个包, 以SPI的方式让启动器动态加载, 目前所有支持的适配器都放置在plugin目录下
启动器为 SpringBoot 项目, 支持canal-client启动的同时提供相关REST管理接口, 运行目录结构为:
- bin
restart.sh
startup.bat
startup.sh
stop.sh
- lib
...
- plugin
client-adapter.logger-1.1.1-jar-with-dependencies.jar
client-adapter.hbase-1.1.1-jar-with-dependencies.jar
...
- conf
application.yml
- hbase
mytest_person2.yml
- logs
以上目录结构最终会打包成 canal-adapter-1.1.4.tar.gz 压缩包
1、总配置文件application.yml
1.1 adapter定义配置部分
canal.conf:
mode: tcp # canal client的模式: tcp kafka rocketMQ
canalServerHost: 123.126.41.204:20482 # 对应单机模式下的canal server的ip:port
batchSize: 500 # 每次获取数据的批大小, 单位为K
syncBatchSize: 1000 # 每次同步的批数量
retries: 0 # 重试次数, -1为无限重试
timeout: # 同步超时时间, 单位毫秒
srcDataSources:
defaultDS: # 自定义名称
url: jdbc:mysql://123.126.41.204:20456/canal_test?useUnicode=true
username: root
password: root
canalAdapters: # 适配器列表
- instance: example # canal 实例名或者 MQ topic 名
groups:
- groupId: g1 # 分组id
outerAdapters: # 分组内适配器列表
- name: logger # 日志
- name: es #elasticsearch
hosts: 123.126.41.204:20475
properties:
cluster.name: eshao-application
- instance: one
groups:
- groupId: g1
outerAdapters:
- name: logger
- name: es
hosts: 123.126.41.204:20475
properties:
cluster.name: eshao-application
说明:
一份数据可以被多个group同时消费, 多个group之间会是一个并行执行, 一个group内部是一个串行执行多个outerAdapters, 比如例子中logger和es
见2.4
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
canalServerHost: ip:port
batchSize: 500
syncBatchSize: 1000
retries: 0
timeout:
srcDataSources:
defaultDS:
url: jdbc:mysql://ip:port/db?useUnicode=true
username: username
password: password
canalAdapters:
- instance: example
groups:
- groupId: g1
outerAdapters:
- name: logger
bin/startup.sh
查询所有订阅同步的canal instance或MQ topic
curl http://127.0.0.1:8081/destinations
数据同步开关
curl http://127.0.0.1:8081/syncSwitch/example/off -X PUT
针对 example 这个canal instance/MQ topic 进行开关操作. off代表关闭, instance/topic下的同步将阻塞或者断开连接不再接收数据, on代表开启
数据同步开关状态
curl http://127.0.0.1:8081/syncSwitch/example
手动同步
curl http://127.0.0.1:8081/etl/es/mytest_person2.yml -X POST
导入数据到指定类型的库, 如果params参数为空则全表导入, 参数对应的查询条件在配置中的etlCondition指定
查看相关库总数据
curl http://127.0.0.1:8081/count/hbase/mytest_person2.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
canalServerHost: ip:port
batchSize: 500
syncBatchSize: 1000
retries: 0
timeout:
srcDataSources:
defaultDS:
url: jdbc:mysql://ip:port/db?useUnicode=true
username: root
password: root
canalAdapters:
- instance: example
groups:
- groupId: g1
outerAdapters:
- name: logger
- name: es
hosts: ip:port
properties:
cluster.name: eshao-application
- instance: one
groups:
- groupId: g1
outerAdapters:
- name: logger
- name: es
hosts: ip:port
properties:
cluster.name: eshao-application
adapter将会自动加载 conf/es 下的所有.yml结尾的配置文件
修改 conf/es/mytest_user.yml文件:
dataSourceKey: defaultDS # 源数据源的key, 对应上面配置的srcDataSources中的值
destination: example # cannal的instance或者MQ的topic
esMapping:
_index: mytest_person # es 的索引名称
_type: _doc # es 的type名称
_id: _id # es 的_id, 如果不配置该项必须配置下面的pk项_id则会由es自动分配
upsert: true
# pk: id # 如果不需要_id, 则需要指定一个属性为主键属性
sql: "SELECT p.id as _id,name,age,last_update_time as time from person p"
# objFields:
# _labels: array:; # 数组或者对象属性, array:; 代表以;字段里面是以;分隔的
# etlCondition: "where a.c_time>={}"
commitBatch: 3000
修改 conf/es/one.yml文件:
dataSourceKey: defaultDS # 源数据源的key, 对应上面配置的srcDataSources中的值
destination: one # cannal的instance或者MQ的topic
esMapping:
_index: index_one # es 的索引名称
_type: _doc # es 的type名称
_id: _id # es 的_id, 如果不配置该项必须配置下面的pk项_id则会由es自动分配
upsert: true
# pk: id # 如果不需要_id, 则需要指定一个属性为主键属性
sql: "SELECT o.id as _id, name from one o"
# objFields:
# _labels: array:; # 数组或者对象属性, array:; 代表以;字段里面是以;分隔的
# etlCondition: "where a.c_time>={}"
commitBatch: 3000
注意:进行同步时需要先在ES中建立索引及映射