一、canal介绍
canal [kə’næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。
早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。
二、搭建采用的环境
canal版本:v1.1.6
java版本:1.8
IP | 机器 |
---|---|
10.100.0.27 | 管理节点、服务节点1 |
10.100.0.34 | 服务节点2 |
10.100.0.101 | 数据库 |
10.100.0.30 | zookeeper节点1 |
10.100.0.31 | zookeeper节点2 |
10.100.0.32 | zookeeper节点3 |
10.100.0.252 | RabbitMQ节点 |
三、搭建步骤
1、部署canal-admin
1)部署服务
官方文档地址:https://github.com/alibaba/canal/wiki/Canal-Admin-QuickStart
主要配置application.yml文件
server:
port: 8089
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
spring.datasource:
address: 10.100.0.101:3306
database: canal_manager
username: admin
password: admin
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://${spring.datasource.address}/${spring.datasource.database}?useUnicode=true&characterEncoding=UTF-8&useSSL=false
hikari:
maximum-pool-size: 30
minimum-idle: 1
canal:
adminUser: canal
adminPasswd: canal911
注意:
1、canal.adminPasswd密码并不是管理后面登陆admin的密码,登陆admin的密码是设置在对应的数据库中的,默认为123456。
2、数据库初始化的SQL文件路径:conf/canal_manager.sql
2)登陆浏览器访问
http://10.100.0.27:8089/ 用户名入”admin”,密码输入”123456”
2、配置集群
1)集群配置
输入集群名称,我这里使用souyee,填写对应的ZK地址:10.100.0.30:2181,10.100.0.31:2181,10.100.0.32:2181
修改对应的配置:
# canal admin config
#canal.admin.manager = 127.0.0.1:8089
canal.admin.port = 11110
# 密码和用户名和 canal admin配置里面一要致,密码这里采用的是密文,加密方式为 select password('canal911')
canal.admin.user = canal
canal.admin.passwd = B26E4C59F6FAA9D73ECFACCC3336F09B0FB5F9CD
canal.zkServers = 10.100.0.30:2181,10.100.0.31:2181,10.100.0.32:2181
# tcp, kafka, rocketMQ, rabbitMQ,我这里采用的是rabbitMQ
canal.serverMode = rabbitMQ
#改用mysql来存元数据
#canal.instance.tsdb.dir = ${canal.file.data.dir:../conf}/${canal.instance.destination:}
#canal.instance.tsdb.url = jdbc:h2:${canal.instance.tsdb.dir}/h2;CACHE_SIZE=1000;MODE=MYSQL;
canal.instance.tsdb.url = jdbc:mysql://10.100.0.101:3306/canal_tsdb?useUnicode=true&characterEncoding=UTF-8&useSSL=false
canal.instance.tsdb.dbUsername = admin
canal.instance.tsdb.dbPassword = admin
#canal.instance.tsdb.spring.xml = classpath:spring/tsdb/h2-tsdb.xml
canal.instance.tsdb.spring.xml = classpath:spring/tsdb/mysql-tsdb.xml
#canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
#canal.instance.global.spring.xml = classpath:spring/file-instance.xml
canal.instance.global.spring.xml = classpath:spring/default-instance.xml
##################################################
######### RabbitMQ #############
##################################################
rabbitmq.host = 10.100.0.252
rabbitmq.virtual.host = /
rabbitmq.exchange = canal.direct
rabbitmq.username = admin
rabbitmq.password = admin
rabbitmq.deliveryMode = 2
注意:这里有vhost和exchange在MQ里面需要手动创建
2)注册Server
vi ./conf/canal_local.properties
# register ip
canal.register.ip =
# canal admin config
canal.admin.manager = 10.100.0.27:8089
canal.admin.port = 11110
canal.admin.user = canal
canal.admin.passwd = B26E4C59F6FAA9D73ECFACCC3336F09B0FB5F9CD
# admin auto register
canal.admin.register.auto = true
canal.admin.register.cluster = souyee
canal.admin.register.name = souyee-27
./bin/startup.sh local
多个节点,同样操作,后在后台就可以看到对应的server
踩坑:这里注册进来后,一直显示的是断开状态
原因:日志有报错,Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: java.nio.ByteBuffer.clear()Ljava/nio/ByteBuffer; 实际上是jdk版本问题,官方写的是1.5以上,我用的1.8不行,改用15还是不行,后面采用了11测试通过,其它版本大家可以自行测试
3)Instance 管理
输入名称,选择集群后,载入模块后,再进行修改:
# 要监控的库的地址
canal.instance.master.address=10.100.0.101:3306
# table meta tsdb info
canal.instance.tsdb.enable=true
canal.instance.tsdb.url=jdbc:mysql://10.100.0.101:3306/canal_tsdb
canal.instance.tsdb.dbUsername=admin
canal.instance.tsdb.dbPassword=admin
# username/password
canal.instance.dbUsername=nacosbl
canal.instance.dbPassword=nacosbl1234
canal.instance.connectionCharset = UTF-8
# table regex
canal.instance.filter.regex=.*\\..*
# mq config
# canal.mq.topic=souyee
# dynamic topic route by schema or table regex
#canal.mq.dynamicTopic=mytest1.user,mytest2\\..*,.*\\..*
canal.mq.dynamicTopic=.*\\..*
四、数据使用
1、 数据查看是否有正确进入交换机
2、数据使用
1)创建一个队列
2)绑定数据到队列
From exchange: 这里填写我们上面配置的交互机名称,我使用的是canal.direct
Routing key: 这里的路由KEY,填写动态路由规则生成的对应的名称,
我们上面配置的是 .*\\..*,所以对应的数据是 数据库名_表名
例如: db:test,table:test,那么对应的就是 test_test