本地部署和运行 Canal
目录
相关背景
本文使用的是截止本文发布时 Canal 最新发布包 canal-1.1.8-alpha-2
,后续最新包可到 canal release 页下载。 本地部署及运行环境为 Windows 10,MySQL 版本为 8.0 +。
必要准备
Canal 发布包
通过前文提供的地址下载 Canal 发布包 canal.admin-1.1.8-SNAPSHOT.tar.gz
和 canal.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-admin
和 canal-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 后台管理。

集群管理
在集群管理中,点击“新建集群“,新建一个集群配置,其中“zk 地址” 是服务端集群的 ZooKeeper 地址[1],这里使用默认地址:127.0.0.1:2181
。 Canal 集群是将多个Canal Deployer 节点组成一个集群,以提高系统的可用性和扩展性。
集群建立后,还需要给集群添加配置模板,否则在后续运行 Canal Deployer 时,将出现“requestGet for canal config error: canal.properties config is empty”的错误。
在集群管理列表,选择一个集群,在“操作”下拉功能中,点击“主配置”,如下图示:

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

根据实际情况调整该配置模板中的相关配置,这里,我使用的 Canal 服务模式是 “RocketMQ”,相应配置设定为:canal.serverMode = rocketMQ
,并设定好配置模板中 MQ Properties
和 RocketMQ
部分配置。
由于使用的是阿里云的 RocketMQ,所以配置中的 MQ Properties
部分需要调整以下配置:
=[从阿里云获取]
=[从阿里云获取]
# Set this value to "cloud", if you want open message trace feature in aliyun.
= cloud
如果不设置 accessKey
和 secretKey
,Canal Deployer 将无法正常启动。相应地,RocketMQ
部分也要调整,如下示例:
= GID_xxx
= canal_xxx
=
= [阿里云内部 VPC 网络 TCP 协议接入点,Canal 默认 TCP]
= 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
= 127.0.0.1
# canal admin config
= 127.0.0.1:8089
= 11110
= admin
# admin 密码,使用 mysql 的 password 加密后的密码,
# 与 admin 的 conf/applicaiton.yml 中设置的密码对应
= 6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
# admin auto register
= true
= cluster-dev
= 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”手动添加),结果如下图示:

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

然而,这里仍然存在一个问题,在 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.log
和 rocketmq_client.log
是按天保存,当天之前的日志被归档到目录中。
本文部分内容参考Canal介绍。