
随着业务复杂度和规模的增长,RDBMS、NoSQL、OLAP等多种数据源间的数据传输越来越多,在企业内部甚至外部,数据迁移/订阅/同步需求逐渐增加。
目前数据同步类产品很多,如国外的Maxwell、Databus、mysqlstreamer,国产阿里系也推出了很多不错的软件,如:canal、otter、drc、datax、dts、drds愚公精卫等,其中很多都是在canal的基础上开发包装出来的。

引用:https://blog.csdn.net/wwwdc1012/article/details/88388552
几个月前Canal进行了更新,新版本1.1.4有几个亮点:
支持WebUI的canal管理
提供全面兼容MySQL DDL的解析能力
支持ACL提升安全性

下面就测试下用canal同步MySQL的数据到其他的数据库中吧, 出发。

1 部署 Canal-Admin
文档:
https://github.com/alibaba/canal/wiki/Canal-Admin-QuickStart
1 下载Canal-Admin,目前最新1.1.4版本:
cd caihao/wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.admin-1.1.4.tar.gz
2 解压
mkdir caihao/canal-admintar zxvf canal.admin-1.1.4.tar.gz -C caihao/canal-admin
目录结构:
cd caihao/canal-admin[root@mysql1 canal-admin]# lldrwxr-xr-x 2 root root 4096 11月 1 11:42 bindrwxr-xr-x 3 root root 4096 11月 1 11:42 confdrwxr-xr-x 2 root root 4096 11月 1 11:42 libdrwxrwxrwx 2 root root 4096 9月 2 15:26 logs
3 配置修改:
* 注意:datasource对应canal-admin数据库配置信息,下面canal部分对应canal应用配置中的信息
配置文件:
vi caihao/canal-admin/conf/application.yml
server:port: 8089spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8spring.datasource:address: 127.0.0.1:3306database: canal_managerusername: canalpassword: Admin_canal_8888driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://${spring.datasource.address}/${spring.datasource.database}?useUnicode=true&characterEncoding=UTF-8&useSSL=falsehikari:maximum-pool-size: 30minimum-idle: 1canal:adminUser: adminadminPasswd: Server_canal_8888
4 在数据库中执行初始化SQL,脚本会创建canal_manager库
* 脚本canal_manager.sql在canal-admin的conf目录下
[root@localhost][(none)]> source conf/canal_manager.sql
# 建立用户并授权:
[root@localhost][(none)]> CREATE USER 'canal'@'127.0.0.1' IDENTIFIED BY 'Admin_canal_8888';Query OK, 0 rows affected (0.05 sec)[root@localhost][(none)]> GRANT ALL ON canal_manager.* TO 'canal'@'127.0.0.1';Query OK, 0 rows affected (0.03 sec)
5 启动Canal-Admin
sh caihao/canal-admin/bin/startup.sh
查看 admin 日志
* 如java版本过久可能导致启动无日志产生
tail -200 caihao/canal-admin/logs/admin.log
查看管理页面
http://10.7.70.49:8089/

默认密码: admin/123456
6 关闭Canal-Admin
sh caihao/canal-admin/bin/stop.sh
-----------------------遇到问题------------------------
报错:页面中添加配置提示:
Error[Column 'modified_time' cannot be null]
解决:(5.7)
set global explicit_defaults_for_timestamp = 0;
重启canal-admin
2 部署 Canal-Server
1 下载:
必须要1.1.4版本,才支持canal-admin
cd caihao/wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz
2 解压安装:
cd /caihao/mkdir canal-servertar zxvf canal.deployer-1.1.4.tar.gz -C caihao/canal-server
3 修改配置文件:(注意修改加密的密码)
vi caihao/canal-server/conf/canal_local.properties
# 修改内容
# register ipcanal.register.ip =# canal admin configcanal.admin.manager = 127.0.0.1:8089 # canal-admin web 页面canal.admin.port = 11110 # canal-admin 默认端口canal.admin.user = admin # canal-admin 账号canal.admin.passwd = A5F634A262D04AFADD349C50CD5D13E55BD764DE # canal-admin 加密密码# admin auto registercanal.admin.register.auto = truecanal.admin.register.cluster = # 集群名
这里的passwd是一个密文,和canal-admin里application.yml里的密码原文做对应.
找个MySQL数据库执行以下即可加密:(去掉前面的星号)
(root@localhost:mysql.sock)[(none)]select password('Server_canal_8888');+-------------------------------------------+| password('Server_canal_8888') |+-------------------------------------------+| *A5F634A262D04AFADD349C50CD5D13E55BD764DE |+-------------------------------------------+1 row in set (0.00 sec)
4 启动Canal-Server:
sh caihao/canal-server/bin/startup.sh local
5 停止Canal-Server:
sh caihao/canal-server/bin/stop.sh local
启动方式2:
变更默认配置,备份canal.properties,重命名canal_local.properties为canal.properties,则不用加参数local
6 查看启动日志:
tail -200 /caihao/canal-server/logs/canal/canal.log2019-11-04 11:47:57.326 [main] INFO com.alibaba.otter.canal.deployer.CanalLauncher - ## set default uncaught exception handler2019-11-04 11:47:57.358 [main] INFO com.alibaba.otter.canal.deployer.CanalLauncher - ## load canal configurations2019-11-04 11:47:57.750 [main] INFO com.alibaba.otter.canal.deployer.CanalStarter - ## start the canal server.2019-11-04 11:47:57.778 [main] INFO com.alibaba.otter.canal.deployer.CanalController - ## start the canal server[192.168.122.1(192.168.122.1):11111]2019-11-04 11:47:57.844 [main] INFO com.alibaba.otter.canal.deployer.CanalStarter - ## the canal server is running now ......
3 配置同步
1 左边的Server部分配置:
# 图形操作即可:
# 在Server管理中已经自动识别启动的CanalServer

# 点击:操作 -> 修改


配置项说明:
所属集群,可以选择为单机 或者 集群。一般单机Server的模式主要用于一次性的任务或者测试任务
Server名称,唯一即可,方便自己记忆
Server Ip,机器ip
admin端口,canal 1.1.4版本新增,会在canal-server上提供远程管理操作,默认值11110
tcp端口,canal提供netty数据订阅服务的端口
metric端口, promethues的exporter监控数据端口 (未来会对接监控)
# 点击:操作 -> 配置
修改如下配置:对应 canal.properties


# 以下instance用户密码验证,注释关闭:# canal instance user/passwd# canal.user = canal# canal.passwd = E3619321C1A937C46A0D8BD1DAC39F93B27D4458# canal admin config 以下注意修改加密的密码canal.admin.manager = 127.0.0.1:8089canal.admin.port = 11110canal.admin.user = admincanal.admin.passwd = A5F634A262D04AFADD349C50CD5D13E55BD764DE# 以下需修改成对应的目标实例名 instance_name,如同步多实例,可以逗号分隔canal.destinations = mysql171
2 左边的Instance部分配置:
# MySQL源端数据库配置
[mysqld]log-bin=mysql-bin # 开启 binlogbinlog-format=ROW # 选择 ROW 模式server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复建立同步账号:GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%' IDENTIFIED BY 'AB_canal_2019'
页面操作添加Instance:
1 点击:Instance管理 -> 新建instance

2 点击:载入模板

3 修改配置文件
# 对应原来的:
/caihao/canal-server/conf/example/instance.properties
# position infocanal.instance.master.address = 10.7.91.171:3306# username/passwordcanal.instance.dbUsername = canalcanal.instance.dbPassword = AB_canal_2019canal.instance.connectionCharset = UTF-8# 订阅实例中所有的数据库和表canal.instance.filter.regex = .*\\..*## canal.instance.defaultDatabaseName =xttblog

4 点击:确认新建

5 检查日志:
# 查看server状态与日志:


# 查看 instance 状态与日志
(关键字:start successful)


# 查看binlog同步进度的日志:
[root@zabbix mysql171]# pwd/caihao/canal-server/logs/mysql171[root@zabbix mysql171]# tail -10 meta.log2019-11-06 16:32:12.159 - clientId:1001 cursor:[bin.000310,562521259,1573029130000,170,] address[10.7.91.171/10.7.91.171:3306]2019-11-06 16:33:02.159 - clientId:1001 cursor:[bin.000310,562522291,1573029180000,170,] address[10.7.91.171/10.7.91.171:3306]2019-11-06 16:33:03.159 - clientId:1001 cursor:[bin.000310,562523419,1573029181000,170,] address[10.7.91.171/10.7.91.171:3306]2019-11-06 16:44:42.159 - clientId:1001 cursor:[bin.000310,562524451,1573029880000,170,] address[10.7.91.171/10.7.91.171:3306]2019-11-06 16:45:03.159 - clientId:1001 cursor:[bin.000310,562525015,1573029901000,170,] address[10.7.91.171/10.7.91.171:3306]2019-11-06 16:54:03.159 - clientId:1001 cursor:[bin.000310,562525582,1573030441000,170,] address[10.7.91.171/10.7.91.171:3306]2019-11-06 16:55:47.159 - clientId:1001 cursor:[bin.000310,562526313,1573030545000,170,] address[10.7.91.171/10.7.91.171:3306]2019-11-06 16:56:03.159 - clientId:1001 cursor:[bin.000310,562526867,1573030561000,170,] address[10.7.91.171/10.7.91.171:3306]2019-11-06 16:57:02.159 - clientId:1001 cursor:[bin.000310,562527938,1573030620000,170,] address[10.7.91.171/10.7.91.171:3306]2019-11-06 16:57:03.159 - clientId:1001 cursor:[bin.000310,562528500,1573030621000,170,] address[10.7.91.171/10.7.91.171:3306][root@zabbix mysql171]#
4 安装canal-adapter
文档:
https://github.com/alibaba/canal/wiki/Sync-RDB
1 下载canal.adapter-1.1.4.tar.gz
wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.adapter-1.1.4.tar.gz
2 解压安装
mkdir canal.adapter-1.1.4cd canal.adapter-1.1.4tar -zxvf ../canal.adapter-1.1.4.tar.gz
3 修改配置文件,添加目的端的数据库:
vi caihao/canal.adapter-1.1.4/conf/application.yml
canal.conf:mode: tcp # kafka rocketMQcanalServerHost: 127.0.0.1:11111# zookeeperHosts: slave1:2181# mqServers: 127.0.0.1:9092 #or rocketmq# flatMessage: truebatchSize: 500syncBatchSize: 1000retries: 0timeout:accessKey:secretKey:srcDataSources:defaultDS:url: jdbc:mysql://10.7.91.171:3306/sbtest?useUnicode=trueusername: canalpassword: ****canalAdapters:- instance: mysql171 # canal instance Name or mq topic namegroups:- groupId: g1outerAdapters:- name: logger- name: rdbkey: mysql1properties:jdbc.driverClassName: com.mysql.jdbc.Driverjdbc.url: jdbc:mysql://10.7.91.169:3306/sbtest?useUnicode=truejdbc.username: rootjdbc.password: ****threads: 5 # 并行执行的线程数, 默认为1
在/conf/rdb/下新建一个和instance名字一样的文件:mysql171.yml 文件
vi /caihao/canal.adapter-1.1.4/conf/rdb/mysql171.ymldataSourceKey: defaultDSdestination: mysql171 # canal instancegroupId: g1outerAdapterKey: mysql1concurrent: truedbMapping:mirrorDb: truedatabase: sbtest
4 启动canal-adapter
sh caihao/canal.adapter-1.1.4/bin/startup.sh
查看进程
ps -ef|grep adapter
查看日志:
tail -100 caihao/canal.adapter-1.1.4/logs/adapter/adapter.log
5 停止canal-adapter
sh /caihao/canal.adapter-1.1.4/bin/stop.sh
* 配置失败报错了怎么办?*
常见问题一般都是destination 与instance不一致导致他们出现的地方:1 Sverver 配置页面中 配置项 canal.destinations = mysql171(对应文件 /caihao/canal-server/conf/canal.properties)2 instance配置页面中 实例名 mysql171(对应文件 /caihao/canal-server/conf/example/instance.properties)3 adapter配置文件application.yml 中 - instance: mysql171/conf/rdb/mysql171.yml 的文件名、文件中的的配置项destination: mysql171
5 性能测试:
# 测试的环境:

# 用sb做单表插入百万数据测试下:

# 源端是MySQL,数据量:

# 目标端用的MemSQL内存数据库,数据量一致:

# 数据大小与内存占用情况

完




