目录
背景
两个MySQL数据库实例中,实现order表双向同步增删改操作
准备一台Linux,用来安装canal环境,需要提前安装JDK和MySQL,
安装JDK是为了启动canal这三个项目,这个是必要的
安装MySQL是因为admin用到了canal_manager库进行管理,也可用其他机器的MySQL,本文用本地数据库
如果需要高可用,可以安装Zookeeper来协调canal集群,
如果需要把接收到的MySQL日志推到Rocketmq,需要提前安装MQ
官网文档
canal:QuickStart · alibaba/canal Wiki · GitHub
canal+zk+mq:https://github.com/alibaba/canal/wiki/Canal-Kafka-RocketMQ-QuickStart
cananadmin:https://github.com/alibaba/canal/wiki/Canal-Admin-QuickStart
canaladapter:https://github.com/alibaba/canal/wiki/ClientAdapter
官网中详细描述了如何安装canal和相关第三方组件
配置
下载
官网下载地址:https://github.com/alibaba/canal/releases/tag/canal-1.1.6
mkdir /home/canaladmin /home/canal /home/canaladapter
cd /home/
wget https://github.com/alibaba/canal/releases/download/canal-1.1.6/canal.adapter-1.1.6.tar.gz
wget https://github.com/alibaba/canal/releases/download/canal-1.1.6/canal.admin-1.1.6.tar.gz
wget https://github.com/alibaba/canal/releases/download/canal-1.1.6/canal.deployer-1.1.6.tar.gz
tar -xvf canal.admin-1.1.6.tar.gz -C /home/canaladmin
tar -xvf canal.deployer-1.1.6.tar.gz -C /home/canal
tar -xvf canal.adapter-1.1.6.tar.gz -C /home/canaladapter
MySQL配置
1、添加canal账号密码
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;
2、创建canal_manager数据库,这个文件在admin安装包中的conf目录下,可以直接在数据库中执行里面的语句:conf/canal_manager.sql
3、在MySQL主库需要开启binlog日志,format类型要写row类型,其他类型数据未同步成功,需要自己拓展解析同步功能
[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
不重启设置binlog_format,如果客户端链接没断开,可能导致设置失败,所以保险的方式还是重启数据库
SET GLOBAL binlog_format = 'ROW';
show global variables like '%binlog_format%';
单机模式配置
Canaladmin配置
可以不修改任何配置,直接启动项目
/home/canaladmin/bin/startup.sh
# 关闭命令
# /home/canaladmin/bin/stop.sh
# 查看日志命令
# tail -200f /home/canaladmin/logs/admin.log
可以通过 http://127.0.0.1:8089/ 访问,默认密码:admin/123456
登录成功之后可以在右上角账号管理中修改密码
操作【服务管理->操作->配置->载入模板】
我监听了两个数据库实例变动,需要配置一下destinations
canal.destinations = order01,order02
然后保存配置即可
Instance配置
instance指定主库数据源、设置数据源账号密码,以及配置过滤binlog的规则
操作【instance管理->新建instance->载入模板】
本文两个instance名称order01,order02
修改order01的MySQL主库1地址
# 如主库1在10.0.0.1
canal.instance.master.address=10.0.0.1:3306
修改order02的MySQL主库2地址
# 如主库1在10.0.0.2
canal.instance.master.address=10.0.0.2:3306
如果只需同步数据库某张表的数据,如shop库下的order表
具体filter规则可参考AdminGuide · alibaba/canal Wiki · GitHub
#canal.instance.filter.regex=.*\\..*
canal.instance.filter.regex=shop\\.order
配置ddl规则,表结构修改在双向同步情况下可能出现问题,解决方案1、配置下面俩参数(可能有坑)2、instance忽略ddl语句,尽量避免表结构修改
# 配置ddl规则
canal.instance.filter.druid.ddl=true
canal.instance.filter.query.ddl=true
然后保存配置即可
Canal配置
连接admin的方式启动canal
/home/canal/bin/startup.sh local
# 关闭命令
# /home/canal/bin/stop.sh
# 查看日志命令
# tail -200f /home/canal/logs/canal/canal.log
Canaladapter配置
adapter主要需要配置监听那些MySQL库的binlog,然后指定同步到对应的库表,本文是两库双向同步,需要监听两个数据源
adapter的instance配置要与admin添加的instance对应上
修改application.yml
vim /home/canaladapter/conf/application.yml
修改srcDataSources部分,配置两个库的数据源
修改canalAdapters部分,配置instance
srcDataSources:
mysql01:
url: jdbc:mysql://10.0.0.1:3306/shop?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&useSSL=false
username: root
password: 123456
mysql02:
url: jdbc:mysql://10.0.0.2:3306/shop?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&useSSL=false
username: root
password: 123456
canalAdapters:
- instance: order01 # canal instance Name or mq topic name
groups:
- groupId: order01
outerAdapters:
- name: rdb
key: order01
properties:
jdbc.driverClassName: com.mysql.jdbc.Driver
jdbc.url: jdbc:mysql://10.0.0.2:3306/shop?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&useSSL=false
jdbc.username: root
jdbc.password: 123456
druid.stat.enable: false
druid.stat.slowSqlMillis: 1000
- instance: order02 # canal instance Name or mq topic name
groups:
- groupId: order02
outerAdapters:
- name: rdb
key: order02
properties:
jdbc.driverClassName: com.mysql.jdbc.Driver
jdbc.url: jdbc:mysql://10.0.0.1:3306/shop?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&useSSL=false
jdbc.username: root
jdbc.password: 123456
druid.stat.enable: false
druid.stat.slowSqlMillis: 1000
如果canal相关IP是使用的真实IP地址那需要修改一下canal.tcp.server.host: 真实地址,否则会出现
com.alibaba.otter.canal.client.impl.SimpleCanalConnector.doConnect(SimpleCanalConnector.java:152)
connection refused错误。
canal.tcp.server.host: 10.0.0.3:11111
修改rdb配置文件
touch /home/canaladapter/conf/rdb/order01.yml /home/canaladapter/conf/rdb/order02.yml
order01.yml
dataSourceKey: mysql01
destination: order01
groupId: order01
outerAdapterKey: order01
concurrent: true
dbMapping:
mirrorDb: true
database: shop
order02.yml
dataSourceKey: mysql02
destination: order02
groupId: order02
outerAdapterKey: order02
concurrent: true
dbMapping:
mirrorDb: true
database: shop
配置完成
启动之前检查一下canal_manager库,因为adapter默认也连接了canal_manager库,需要检查canal_config表中是否有一条ID为2的数据,如果有把这个ID修改一下,改成不是2的值。否则adapter和admin因为配置ID都是2那就冲突了。
启动
/home/canaladapter/bin/startup.sh
# 关闭命令
# /home/canaladapter/bin/stop.sh
# 查看日志命令
# tail -200f /home/canaladapter/logs/adapter/adapter.log
集群模式(ZK)
首先安装zk,127.0.0.1:2181
Canaladmin配置
在admin管理页面新建集群
操作【集群管理->新建集群】
集群名称cloud-luck,zk地址127.0.0.1:2181
操作【主配置->载入模板】
修改一下canal.zkServers的地址为127.0.0.1:2181
canal.register.ip = 127.0.0.1
canal.zkServers = 127.0.0.1:2181
配置完成
Canal配置
可以在conf/canal_local.properties中配置一下集群名称
vim /home/canal/conf/canal_local.properties
# canal.admin.register.cluster = cloud-luck
canal.admin.register.cluster = cloud-luck
配置完成
使用RocketMQ
Canaladmin配置
如果需要用到RocketMQ,配置一下MQ的信息,注释掉默认的file-instance.xml使用default-instance.xml
canal.serverMode = rocketMQ
rocketmq.producer.group = cloud-luck
#canal.instance.global.spring.xml = classpath:spring/file-instance.xml
canal.instance.global.spring.xml = classpath:spring/default-instance.xml
Instance配置
如果用到MQ,需要配置一下topic
instance(order01)修改
canal.mq.topic=order01
instance(order02)修改
canal.mq.topic=order02
Canaladapter配置
修改application.yml文件model为rocketMQ
canal.conf:
mode: rocketMQ #tcp kafka rocketMQ rabbitMQ
配置完成,重启adapter
备注
当机器有多个IP地址时,最好是指定一个固定IP,可以把127.0.0.1替换成真实IP,canal、canaladmin、canaladapter相关IP的地方都要修改一下
# tcp bind ip
canal.ip = 10.0.0.3
# register ip to zookeeper
canal.register.ip = 10.0.0.3
canaladmin中application.yml的canal密码是明文,如果要修改这个密码,需要同时修改canal项目中canal_local.properties的密文密码,密文规则,在数据库中执行select password('明文'),需要把查询结果前面的星号*去掉。