1.技术方案概览
开启MySQL的binlog日志记录
修改MySQL的binlog模式为ROW
canal-server充当MySQL集群的一个slave,获取master的binlog信息
canal-server将拿到的binlog信息推送给canal-adapter
canal-adapter将数据同步到MySQL从库
2.设置MySQL
首先我们要开启MySQL的binlog记录功能,选择模式为ROW
修改my.cnf:vi /etc/my.cnf
添加以下三行内容,如果原来存在,则不需要添加,只需对当前配置项进行修改即可
log-bin=mysql-bin #添加这一行就ok
binlog-format=ROW #选择row模式
server_id=1 #配置mysql replaction需要定义,不能和canal的slaveId重复
配置文件修改成功后重启MySQL
3.配置canal用户
canal的原理是模拟自己为mysql slave,所以这里一定需要做为mysql slave的相关权限.
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;
4.启动canal-service
下载地址:https://github.com/alibaba/canal/releases
下载canal-server,我这边下载的版本是canal.deployer-1.1.3.tar.gz
canal-server充当MySQL集群的一个slave,获取master的binlog信息
修改canal配置文件instance.properties
canal.instance.gtidon=false
# position info 修改主库地址
canal.instance.master.address=192.168.1.152:3306
canal.instance.master.journal.name=
canal.instance.master.position=
canal.instance.master.timestamp=
canal.instance.master.gtid=
# rds oss binlog
canal.instance.rds.accesskey=
canal.instance.rds.secretkey=
canal.instance.rds.instanceId=
# table meta tsdb info
canal.instance.tsdb.enable=true
# username/password 修改账号密码 数据库
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset = UTF-8
canal.instance.defaultDatabaseName =infosys_test
# enable druid Decrypt database password
canal.instance.enableDruid=false
修改canal.properties
canal.id = 10000
canal.ip =
canal.port = 11111
canal.metrics.pull.port = 11112
# 配置zk服务
canal.zkServers = 192.168.1.200:2181
# flush data to zk
canal.zookeeper.flush.period = 1000
canal.withoutNetty = false
修改完成之后启动canal 服务
5.启动adaper
下载地址:https://github.com/alibaba/canal/releases
下载canal-server,我这边下载的版本是canal.adapter-1.1.3.tar.gz
修改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 # kafka rocketMQ
# 配置 zk 地址
zookeeperHosts: 192.168.1.200:2181
batchSize: 500
syncBatchSize: 1000
retries: 0
timeout:
accessKey:
secretKey:
srcDataSources:
defaultDS:
# 配置 主库地址
url: jdbc:mysql://192.168.1.152:3306/infosys_test?useUnicode=true
username: canal
password: canal
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://192.168.1.200:3306/infosys_test?useUnicode=true
jdbc.username: root
jdbc.password: root
注意:这边从库一定要记得给授权,否则连不上,就不能将数据写入了
修改rdb/mytest_user.yml
dataSourceKey: defaultDS
destination: example
groupId: g1
outerAdapterKey: mysql1
concurrent: true
dbMapping:
#配置数据库
database: infosys_test
#配置表
table: admin_user
targetTable: infosys_test.admin_user
targetPk:
id: id
mapAll: true
进入bin目录启动服务即可;
6.测试
在152数据库中插入一条数据库,检查是否在200中同步,同步成功即配置成功;
7.关于批量同步
目前来说是不支持批量同步的,要实现批量同步的话需要application.yml配置多个name: rdb;
rdb文件夹下要为每个表配置dataSourceKey、destination、outerAdapterKey、dbMapping等对应参数,
这样就可以实现批量同步了;
但是个人感觉这个方案更适用于单个表更新之后同步缓存或索引,例如用户信息更新之后,更新Redis缓存