Canal HA 服务端集群搭建记录
背景与版本记录
从 2018 年 9 月实时项目立项开始, 业务数据的同步就采用了 canal, 当时 1.1.0 版本刚好原生支持了 kafka 消息的投递, 但还不支持 serverMode 直接切换, 所以最开始我们选择的 serverMode 依然是 tcp 类型.
1.1.2 版本是我们升级的一个版本, 1.1.4 全面兼容 MySQL DDL 的解析能力, 我们在几个月前也将 canal 集群更新到了 1.1.4 这个版本.
HA 架构
Canal
的 HA
通过 Zookeeper
实例标识某个特定路径下抢占 EPHEMERAL
(临时) 节点的方式进行控制, 抢占成功的一者会作为运行节点, 状态为 running
. 而抢占失败的一方会作为备用节点, 状态是 standby
. 一般情况下使用内建的数据管道例如 Kafka, 基本屏蔽了客户端的细节. 假设客户端使用了 Kafka, 也就是 Canal 从主库同步到 binlog 事件最终会投放到 Kafka, 那么 Canal 服务端 HA 集群架构大致如下:
这是全局来看, 而一个运行的 Canal 服务端, 可以同时支持监听多个上游数据库的 binlog, 某个主库解析配置的抽象在 Canal 中的术语叫做 Instance 实例:
多 Instance
接下来给出具体安装与配置, mysql 的配置参照官网, 这里不赘述.
首先下载 canal deployer-1.1.4.tar.gz, 在 Hadoop102 上创建目录 /opt/module/canal_ha
, 并进行解压:
[amos@hadoop102 canal]$tar -zxvf canal.deployer-1.1.4.tar.gz -C /opt/module/canal_ha/
本文章在 3 台节点中配置 Canal 集群, 需要更改两个配置文件:
$CANAL_HOME/conf/canal.properties
$CANAL_HOME/conf/example/instance.properties
接着先说明如何定义多个 Instance, 一般在主配置文件 $CANAL_HOME/conf/canal.properties
中的canal.destinations
配置项通过英文逗号分隔多个标识如:
COPY# canal.destinations=[Instance标识1,Instance标识2...,Instance标识n]
canal.destinations=customer-service,payment-service
然后在 $CANAL_HOME/conf
目录下添加 customer-service
和 payment-service
文件夹, 把原来的$CANAL_HOME/conf/example
文件夹中的 instance.properties
拷贝过去, 按需修改里面的配置即可:
COPY$CANAL_HOME
- conf
- customer-service
- instance.properties # 这里主要配置customer-service主库的连接信息、过滤规则和目标topic的配置等等
配置 【canal.mq.topic = customer-service】
- payment-service
- instance.properties # 这里主要配置payment-service主库的连接信息和过滤规则和目标topic的配置等等
配置 【canal.mq.topic = payment-service】
而 Canal 最终解析好的 binlog 事件会分别以 topic 为customer-service
或 payment-service
发送到 Kafka 集群中, 这样就能确保不同数据源解析出来的 binlog 不会混乱.
当然, 还可以配置动态分区, 我们之后再讲.
Canal会实时监听每个 Instance 的配置文件 instance.properties 的变动, 一旦发现配置文件有属性项变更, 会进行一次热加载, 原则是变更 Instance 的配置文件是不用重启 Canal 服务的.
HA
接下来, 我们搭建 ZK 和 Kafka 均为 3 台的 Canal HA 集群.
首先配置 canal.properties
:
# 配置 zk
canal.zkServers = hadoop102:2181,hadoop103:2181,hadoop104:2181
# 写入 kafka
canal.serverMode = kafka
# 一定要修改为此配置, 基于 Zookeeper 的集群管理依赖于此配置
canal.instance.global.spring.xml = classpath:spring/default-instance.xml
# kafka 地址
canal.mq.servers = hadoop102:9092,hadoop103:9092,hadoop104:9092
接着配置 instance.properties
:
# 三台 canal 每一个都不一样, 0~65535, 也要和 mysql 的不一样
canal.instance.mysql.slaveId=102
# mysql 位置
canal.instance.master.address=hadoop102:3306
# mysql 创建的 canal 用户
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset = UTF-8
# 如果是要配置动态主题这个也一定要配置, 用来存放那些各种杂七杂八的 binlog
canal.mq.topic=test_canal
# 动态主题, 规则见官网
canal.mq.dynamicTopic=gmall_rt\\.tdept
# 分区数, 默认是 3 个分区, 可以修改此参数或者更改 kafka 默认分区数
#canal.mq.partitionsNum=3
# 自定义分区规则, 详细见官网
#canal.mq.partitionHash=gmall_rt\\.t_dept:id
配置完毕后分发至 hadoop103 和 hadoop104, 并修改 canal.instance.mysql.slaveId
:
# hadoop103的配置
canal.instance.mysql.slaveId=103
# hadoop104的配置
canal.instance.mysql.slaveId=104
启动集群:
[amos@hadoop102 canal_ha]$ bin/startup.sh
[amos@hadoop103 canal_ha]$ bin/startup.sh
[amos@hadoop104 canal_ha]$ bin/startup.sh
zk 查看 canal 集群的 running 的实例:
[zk: localhost:2181(CONNECTED) 11] ls /otter/canal/cluster
[172.16.17.102:11111, 172.16.17.103:11111, 172.16.17.104:11111]
[zk: localhost:2181(CONNECTED) 10] get /otter/canal/destinations/example/running
{"active":true,"address":"172.16.17.102:11111"}
至此即搭建好了 Canal HA.
Canal 保存在 Zookeeper 中的数据节点
可以使用ZooInspector 展示 Canal 保存在 Zookeeper 中的节点信息, 这里简单分析一下. 节点树的结构如下:
节点路径 | 描述 |
---|---|
/otter/canal | 根目录 |
/otter/canal/cluster | Canal 集群节点信息 |
/otter/canal/destinations | Canal 所有Instance 的信息 |
/otter/canal/cluster
路径的展开如下:
COPY# 其实就是挂载了所有集群节点的host:port信息
/otter/canal/cluster
- 192.168.56.1:11111
- 172.17.0.1:11111
/otter/canal/destinations
路径会相对复杂, 展开的信息如下:
COPY/otter/canal/destinations
- Instance标识
- running 记录当前为此Instance提供服务状态为running的Canal节点 [EPHEMERAL类型]
- cluster 记录当前为此Instance提供服务的Canal集群节点列表
- Client序号标识
- running 客户端当前正在读取的running节点 [EPHEMERAL类型]
- cluster 记录当前读取此Instance的客户端节点列表
- cursor 记录客户端读取的position信息
# 例如
/otter/canal/destinations
- example
- running -> {"active":true,"address":"192.168.56.1:11111"}
- cluster
- 192.168.56.1:11111
- 172.17.0.1:11111
- 1001
- running
- cluster
- cursor
":“192.168.56.1:11111”}
- cluster
- 192.168.56.1:11111
- 172.17.0.1:11111
- 1001
- running
- cluster
- cursor
理解各个路径存放的信息, 有利于在 Canal 集群出现故障的时候结合日志进行故障排查.