Canal HA 服务端集群搭建记录

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 架构

CanalHA 通过 Zookeeper 实例标识某个特定路径下抢占 EPHEMERAL (临时) 节点的方式进行控制, 抢占成功的一者会作为运行节点, 状态为 running. 而抢占失败的一方会作为备用节点, 状态是 standby. 一般情况下使用内建的数据管道例如 Kafka, 基本屏蔽了客户端的细节. 假设客户端使用了 Kafka, 也就是 Canal 从主库同步到 binlog 事件最终会投放到 Kafka, 那么 Canal 服务端 HA 集群架构大致如下:

canalha

这是全局来看, 而一个运行的 Canal 服务端, 可以同时支持监听多个上游数据库的 binlog, 某个主库解析配置的抽象在 Canal 中的术语叫做 Instance 实例:

canalhamultiinstance

多 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-servicepayment-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-servicepayment-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/clusterCanal集群节点信息
/otter/canal/destinationsCanal所有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 集群出现故障的时候结合日志进行故障排查.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值