1. 为什么选择Docker-Compose部署Canal-Server
第一次接触Canal-Server时,我尝试过直接部署在物理机上,结果被各种依赖冲突和配置问题折磨得够呛。后来发现用Docker容器化部署能完美解决环境隔离问题,而Docker-Compose更是将这种便利性提升到了新高度——只需要一个YAML文件就能定义完整的服务栈。
Canal作为阿里巴巴开源的MySQL数据库增量日志解析工具,在数据同步、实时计算等场景应用广泛。其单机版部署看似简单,但实际会遇到端口冲突、配置遗漏、依赖缺失等典型问题。通过容器化部署,我们可以实现:
- 环境隔离:避免与宿主机其他服务冲突
- 快速部署:一键启动所有关联服务
- 配置固化:YAML文件即部署文档
- 资源可控:精确限制CPU/内存用量
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 部署前的环境准备
2.1 基础环境检查
在开始之前,请确保你的工作环境满足以下条件:
bash复制# 检查Docker版本(要求20.10.0+)
docker --version
# 检查Docker-Compose版本(要求1.29.0+)
docker-compose --version
如果尚未安装,可以通过以下命令快速安装(以Ubuntu为例):
bash复制# 安装Docker
sudo apt-get update && sudo apt-get install docker.io
# 安装Docker-Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
2.2 MySQL主库配置
Canal需要读取MySQL的binlog,因此需要在MySQL主库进行以下配置:
sql复制-- 创建canal专用账号
CREATE USER 'canal'@'%' IDENTIFIED BY 'canal_password';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
-- 修改MySQL配置(my.cnf)
[mysqld]
log-bin=mysql-bin
binlog-format=ROW
server_id=1
binlog_row_image=FULL
expire_logs_days=30
重要提示:如果MySQL是8.0+版本,需要额外设置default_authentication_plugin=mysql_native_password,否则会导致连接认证失败。
3. Docker-Compose文件详解
3.1 完整compose文件
创建docker-compose.yml文件,内容如下:
yaml复制version: '3.7'
services:
canal-server:
image: canal/canal-server:v1.1.6
container_name: canal-server
ports:
- "11111:11111" # admin端口
- "11110:11110" # 数据传输端口
volumes:
- ./canal/conf:/home/admin/canal-server/conf
- ./canal/logs:/home/admin/canal-server/logs
environment:
- canal.admin.manager.url=http://127.0.0.1:8089/api/v1/${canal.admin.manager.url.base}
- canal.admin.manager.url.base=/canal/admin
restart: unless-stopped
networks:
- canal-network
canal-admin:
image: canal/canal-admin:v1.1.6
container_name: canal-admin
ports:
- "8089:8089"
volumes:
- ./canal/admin/conf:/home/admin/canal-admin/conf
- ./canal/admin/logs:/home/admin/canal-admin/logs
environment:
- server.port=8089
- spring.datasource.url=jdbc:h2:mem:canal-admin;DB_CLOSE_DELAY=-1
depends_on:
- canal-server
restart: unless-stopped
networks:
- canal-network
networks:
canal-network:
driver: bridge
3.2 关键配置解析
-
端口映射:
- 11111:Canal Server的管理端口
- 11110:客户端连接的数据传输端口
- 8089:Admin管理界面端口
-
数据卷挂载:
/conf:存放配置文件/logs:持久化运行日志
-
环境变量:
canal.admin.manager.url:Admin管理地址spring.datasource.url:使用内存数据库H2(生产环境建议改为MySQL)
-
网络配置:
- 创建专用网络
canal-network确保容器间互通
- 创建专用网络
4. 配置文件定制
4.1 核心配置文件结构
在宿主机创建配置目录:
bash复制mkdir -p ./canal/{conf,admin/conf,logs,admin/logs}
主要配置文件说明:
code复制canal/
├── conf/
│ ├── canal_local.properties # 本地模式配置
│ ├── canal.properties # 主配置文件
│ └── example/
│ └── instance.properties # 实例配置
└── admin/
└── conf/
└── application.yml # admin配置
4.2 canal.properties关键配置
properties复制# 服务模式(默认local)
canal.serverMode = local
# 实例配置目录
canal.conf.dir = ../conf
# 实例列表(对应instance.properties)
canal.destinations = example
# 并行线程数
canal.instance.parser.parallelThreadSize = 8
# 存储模式(MEMORY或FILE)
canal.instance.memory.batch.mode = MEMORY
4.3 instance.properties配置
properties复制# 数据源配置
canal.instance.mysql.slaveId=1234
canal.instance.master.address=host.docker.internal:3306
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal_password
canal.instance.connectionCharset=UTF-8
# 过滤规则
canal.instance.filter.regex=.*\\..*
注意:在Docker中访问宿主机MySQL时,Mac/Windows使用
host.docker.internal,Linux需要额外配置--add-host=host.docker.internal:host-gateway
5. 服务启动与验证
5.1 启动服务栈
bash复制# 后台启动
docker-compose up -d
# 查看日志
docker-compose logs -f canal-server
正常启动后应该看到类似日志:
code复制2023-11-15 14:30:21.545 [main] INFO com.alibaba.otter.canal.deployer.CanalLauncher - ## the canal server is running now ......
5.2 管理界面访问
打开浏览器访问http://localhost:8089,默认账号密码:
- 用户名:admin
- 密码:123456
在管理界面可以:
- 查看服务状态
- 修改实例配置
- 监控数据同步延迟
- 启停实例
5.3 客户端连接测试
使用Java客户端测试连接:
java复制CanalConnector connector = CanalConnectors.newSingleConnector(
new InetSocketAddress("127.0.0.1", 11110),
"example", // 实例名
"", // 账号
"" // 密码
);
connector.connect();
connector.subscribe(".*\\..*");
while (true) {
Message message = connector.getWithoutAck(100);
// 处理message
connector.ack(message.getId());
}
6. 常见问题排查指南
6.1 连接MySQL失败
现象:日志中出现Connect to mysql://host:3306 failure
解决方案:
- 检查MySQL账号权限
- 确认网络连通性(在容器内执行
telnet host 3306) - 如果是Docker Desktop,添加
extra_hosts配置:
yaml复制services:
canal-server:
extra_hosts:
- "host.docker.internal:host-gateway"
6.2 Admin界面无法访问
现象:8089端口无响应
排查步骤:
- 检查容器是否运行:
docker-compose ps - 查看admin日志:
docker-compose logs canal-admin - 常见原因是端口冲突,修改
docker-compose.yml中的端口映射
6.3 数据同步延迟高
优化方案:
- 增加解析线程数:
properties复制canal.instance.parser.parallelThreadSize=16 - 调整批次大小:
properties复制canal.instance.memory.batch.size=1024 - 检查MySQL服务器性能
7. 生产环境优化建议
7.1 资源限制配置
在docker-compose.yml中添加资源限制:
yaml复制services:
canal-server:
deploy:
resources:
limits:
cpus: '2'
memory: 4G
reservations:
memory: 2G
7.2 高可用方案
- ZooKeeper注册中心:
properties复制canal.zkServers=zookeeper:2181 canal.serverMode=cluster - 多实例负载均衡:
yaml复制deploy: replicas: 3 restart_policy: condition: on-failure
7.3 监控集成
推荐监控方案:
- Prometheus + Grafana:
properties复制canal.metrics.pull.port=11112 canal.metrics.pull.address=0.0.0.0 - 日志收集到ELK
- 健康检查端点:
bash复制
curl http://localhost:11111/health
8. 版本升级与数据迁移
当需要升级Canal版本时:
- 备份重要数据:
bash复制
tar czvf canal-backup.tar.gz ./canal/conf ./canal/logs - 修改
docker-compose.yml中的镜像版本 - 执行滚动更新:
bash复制
docker-compose pull docker-compose up -d - 验证新旧版本兼容性
经验之谈:每次升级前务必检查GitHub Release Notes中的Breaking Changes,我曾因跳过1.1.4直接升级到1.1.6导致配置不兼容。
