Canal、Canaladmin、Canaladapter多instance数据库表双向同步,TCP/Zookeeper、Rocketmq配置

目录

背景

配置

下载

MySQL配置

单机模式配置

Canaladmin配置

Instance配置

Canal配置

Canaladapter配置

集群模式(ZK)

Canaladmin配置

Canal配置

使用RocketMQ

Canaladmin配置 

Instance配置

Canaladapter配置

备注


背景

两个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('明文'),需要把查询结果前面的星号*去掉。

猜你喜欢

转载自blog.csdn.net/anshichuxuezhe/article/details/125567938