本地部署和运行 Canal

  • 更新于 8 8月 2024

相关背景

本文使用的是截止本文发布时 Canal 最新发布包 canal-1.1.8-alpha-2,后续最新包可到 canal release 页下载。 本地部署及运行环境为 Windows 10,MySQL 版本为 8.0 +。

必要准备

Canal 发布包

通过前文提供的地址下载 Canal 发布包 canal.admin-1.1.8-SNAPSHOT.tar.gzcanal.deployer-1.1.8-SNAPSHOT.tar.gz,再通过命令行解压下载包,如下:

## 执行以下命令后,需要将相关文件转移到 canal-admin 目录下
> tar -zxvf .\canal.admin-1.1.8-SNAPSHOT.tar.gz

## 执行以下命令后,需要将相关文件转移到 canal-deployer 目录下
> tar -zxvf .\canal.deployer-1.1.8-SNAPSHOT.tar.gz

确认 MySQL connector 版本

由于使用的是 MySQL8.0,需要确认一下 canal-admincanal-deployer 中,默认提供的驱动器是否为 mysql8.0+。如果驱动器是 mysql8.0+,则什么都不用做。如果不是,需要替换其解压目录下的lib 文件夹中相应的包,(Linux 下可能确认是否需要授权)。

MySQL connector 官方下载地址:https://downloads.mysql.com/archives/c-j/

在下载页需要选择 Product Version(选择 8.0 以上版本)和 Operating System(操作系统选择 Platform Independent)。

部署运行 Canal Admin

如未特别说明,本节文件根目录为 canal-admin

创建数据库

Canal Admin 运行需要 MySQL 数据库支持,通过脚本创建其数据库及相应的数据表,脚本位置:conf/canal_manager.sql

变更配置文件

配置文件位置为:conf/application.yml。需要根据实际情况,修改该文件中的相应配置。

启动运行

进入到 bin 目录,命令行运行:

bin> .\startup.bat

启动成功后,浏览器访问:http://127.0.0.1:8089/,输入默认账号和密码 admin/123456,便进入到 Canal 后台管理。

Canal 后台管理界面

集群管理

在集群管理中,点击“新建集群“,新建一个集群配置,其中“zk 地址” 是服务端集群的 ZooKeeper 地址[1],这里使用默认地址:127.0.0.1:2181。 Canal 集群是将多个Canal Deployer 节点组成一个集群,以提高系统的可用性和扩展性。

集群建立后,还需要给集群添加配置模板,否则在后续运行 Canal Deployer 时,将出现“requestGet for canal config error: canal.properties config is empty”的错误。

在集群管理列表,选择一个集群,在“操作”下拉功能中,点击“主配置”,如下图示:

Canal 集群添加配置模板

然后在 Server 配置页,点击“载入模板”,将加载canal.properties配置默认模板,如下图示:

Canal 集群配置模板

根据实际情况调整该配置模板中的相关配置,这里,我使用的 Canal 服务模式是 “RocketMQ”,相应配置设定为:canal.serverMode = rocketMQ,并设定好配置模板中 MQ PropertiesRocketMQ 部分配置。

由于使用的是阿里云的 RocketMQ,所以配置中的 MQ Properties 部分需要调整以下配置:

canal.aliyun.accessKey =[从阿里云获取]
canal.aliyun.secretKey =[从阿里云获取]

# Set this value to "cloud", if you want open message trace feature in aliyun.
canal.mq.accessChannel = cloud

如果不设置 accessKeysecretKey,Canal Deployer 将无法正常启动。相应地,RocketMQ 部分也要调整,如下示例:

rocketmq.producer.group = GID_xxx
rocketmq.customized.trace.topic = canal_xxx
rocketmq.namespace =
rocketmq.namesrv.addr = [阿里云内部 VPC 网络 TCP 协议接入点Canal 默认 TCP]
rocketmq.retry.times.when.send.failed = 1

TableMetaTSDB

时序表结构是为了解决 DDL 同步的问题,详细可参考时序表结构方案设计,如果不关注表结构变化,可以将集群 Server 配置 canal.properties 设置 canal.instance.tsdb.enable = false禁用该功能。

部署运行 Canal Deployer

如未特别说明,本节文件根目录为canal-deployer

变更配置文件

conf 目录下,先备份 canal.properties,然后将 canal_local.properties 重命名为 canal.properties

变更后的内容如下:

# 当前节点 register ip
canal.register.ip = 127.0.0.1

# canal admin config
canal.admin.manager = 127.0.0.1:8089
canal.admin.port = 11110
canal.admin.user = admin

# admin 密码,使用 mysql 的 password 加密后的密码,
# 与 admin 的 conf/applicaiton.yml 中设置的密码对应
canal.admin.passwd = 6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9

# admin auto register
canal.admin.register.auto = true
canal.admin.register.cluster = cluster-dev
canal.admin.register.name = server-01

如果要调整 admin 密码,可以通过如下 mysql 指令设置:

# mysql5.0
select password('xxx')

# mysql8.0
select upper(sha1(unhex(sha1('xxx'))))

拷贝 RocketMQ 连接器依赖包

由于使用的服务模式是 RocketMQ,需要将 plugin 目录下的文件 connector.rocketmq-xxx-SNAPSHOT-jar-with-dependencies.jar,拷贝到 lib 目录中,否则后续的启动运行失败,并且 canal.log 日志中将出现如下错误:

interface com.alibaba.otter.canal.connector.core.spi.CanalMQProducer) could not be instantiated: class could not be found.

启动运行

进入到 bin 目录,命令行运行:

bin> .\startup.bat

启动成功后,该 server-01 将自动注册到集群中(如果没有成功自动注册,可通过“新建Server”手动添加),结果如下图示:

Canal Server 列表

然后,可以在[操作->日志]中查看到该 server-01 的日志情况。

Canal Server 日志

然而,这里仍然存在一个问题,在 logs 目录下的日志文件 rocketmq_client.log 中,存在大量的下述异常:

WARN RocketmqClient - get Topic [TBW102] RouteInfoFromNameServer is not exist value WARN RocketmqClient - updateTopicRouteInfoFromNameServer Exception org.apache.rocketmq.client.exception.MQClientException: CODE: 17 DESC: No topic route info in name server for the topic: TBW102

经排查分析,该异常为 RocketMQ 自身原因[2],也没有比较好的解决办法,要么是屏蔽该日志,或者是调整源码。

关于日志

经发现,日志文件 canal.logrocketmq_client.log 是按天保存,当天之前的日志被归档到目录中。

本文部分内容参考Canal介绍


  1. ZooKeeper 服务端需要在本地另行部署,后续再补充文章

  2. 因禁用 Broker 自动创建 Topic 导致,详见:https://github.com/apache/rocketmq/issues/3179