当前位置: 代码迷 >> 综合 >> Canal 学习
  详细解决方案

Canal 学习

热度:40   发布时间:2023-11-22 16:52:52.0

文章目录

  • Canal 官方介绍
  • Canal 安装
    • 版本
    • 提醒
    • 单实例
      • 材料
      • 简单说
    • 集群实例
      • 材料
      • 简单说
      • 故障转移
      • TSDB
    • 集群实例(带 Kafka 集群)
      • 材料
      • 简单说
      • 顺序性
  • 相关命令
    • zookeeper
    • kafka

Canal 官方介绍

  • github wiki

Canal 安装

版本

  • Java 1.8
  • canal.deployer-1.1.4.tar.gz
  • zookeeper-3.4.5-cdh5.7.0.tar.gz

提醒

  • Canal 是一个需要运行在 java 环境里的程序
  • Canal 安装前后记得关闭防火墙,或者开放相应端口
  • 单机模式,file-instance.xml,这样才能在 conf/example 的目录下看到 meta.dat,如果有 position 相关问题,删除 meta.dat,重启 canal 即可恢复。
  • 集群模式,default-instance.xml,binlog 的 position 相关都在 zookeeper 集群中,如果有 position 相关问题,可以删除节点/otter/canal/destinations/xxxxx/1001/cursor ,重启 canal 即可恢复。

单实例

材料

  • 单 canal server
  • 单 canal client,CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress(ip, 11111), destination, "", "");
  • 官方安装文档

简单说

  • 单服务的 Canal Server 就不用依靠 Zookeeper 集群了。

集群实例

材料

  • zookeeper 集群
  • canal server 集群(挂靠在 zookeeper 集群)
  • canal client,CanalConnector connector = CanalConnectors.newClusterConnector(zkHost, destination, "", "");
  • 官方安装文档
  • 其他博主的方法,可以参照,亲测可用。

简单说

  • Canal 的集群搭建是依赖 Zookeeper 集群的,所以应该先搭建 Zookeeper 集群

故障转移

注意,因为 Canal Client 要连接的是一个 Canal Instance,因此两台机器上的 Instance 目录的名字需要保证完全一致,HA模式是依赖于 Instance Name 进行管理。

Canal 集群在依赖 Zookeeper 集群成功启动后,实际上是只有一个 Canal Server 在运作,这是 Canal 自己的设计,主要是为了防止对数据库多次 dump。既然是集群,那么在当前运作的 Canal Server 停止后,会有下一个 Canal Server 继续生效,只不过,如果不通过 MQ 的话,对于客户端来说,这是一个快速恢复的方案,而不是故障转移

TSDB

细心的同学可能会注意到配置文件里带有tsdb,这么个关键词的配置。他是一种时序表结构方案的设计,解释来讲就是用来解决 Canal 集群下每当发生 DDL 的时候,dump 下来的 binlog 里面的字段可能匹配不上的情况。

  • 这里是 TSDB 官方文档的解释

我这里建议用 mysql 的方式进行配置。值得注意的是,官方给出了 h2 和 mysql 两种方式,这两种配置的地方分别在全局通用的 canal.properties 里和具体某实例的 instance.properties 里。虽然在两个地方,但是具体配置项基本都是重复的,只有 url 这一项不同,所以提醒大家,在配置 mysql 的时候,记得将全局的隐掉,只保留全局的 enable 即可。

集群实例(带 Kafka 集群)

材料

  • 修改部分 instance.properties,尤其注意打开canal.mq.dynamicTopic ,否则,要么接收不到,要么接收到的消息可能是莫名其妙的样子
  • 修改部分 canal.properties
  • canal client,KafkaCanalConnector connector = new KafkaCanalConnector(kafkaServers, "example", partition, groupId, null, false);
  • 具体参考集群实例的安装方法

简单说

  • 相比上面的集群实例,就是多了个 Kafka 集群,并且改了些配置。

顺序性

  • Canal 的顺序性可以由 Binlog 保证,因为 Binlog 本身就是顺序的。
  • Canal 的顺序性可以由 Kafka 保证,可以查看这个
  • Canal 的顺序性可以由 Zookeeper 集群保证,可以查看这个

相关命令

zookeeper

./zkServer.sh start #启动
./zkServer.sh status #查看状态

./zkCli.sh #启动客户端
ls /otter/canal/cluster #启动客户端后,此命令可以实时的查看注册到 zoo 的 canal server 们
ls /brokers/ids #启动客户端后,此命令可以实时的查看注册到 zoo 的 kafka server 们
ls /brokers/topics #启动客户端后,此命令可以查看在此 zoo 集群中曾经创建过的 topic 们

kafka

可以用同一个 kafka 目录下的 server.properties 造出三个配置文件,分别指定启动,就可以是三个 kafka server 了
./kafka-server-start.sh /home/kafka_2.13-2.4.0/config/server-1.properties #启动 kafka server 1
./kafka-server-start.sh /home/kafka_2.13-2.4.0/config/server-2.properties #启动 kafka server 2
./kafka-server-start.sh /home/kafka_2.13-2.4.0/config/server-3.properties #启动 kafka server 3