Canal 部署与问题排查指南
本人的是通过修改canal的镜像版本实现成功运行的 ,真是不容易啊。。。
📋 Canal 运行前提条件
1. MySQL 必须启用 binlog
Canal 通过解析 MySQL 的 binlog 来实现数据同步,必须确保 MySQL 开启了 binlog。
检查命令:
powershell
docker exec flash-sale-mysql mysql -uroot -pWolfCode_2017 -e "SHOW VARIABLES LIKE 'log_bin%';"
期望输出:
log_bin ON
2. MySQL binlog 格式必须为 ROW
Canal 需要 ROW 格式的 binlog 才能正确解析数据变更。
检查命令:
powershell
docker exec flash-sale-mysql mysql -uroot -pWolfCode_2017 -e "SHOW VARIABLES LIKE 'binlog_format';"
期望输出:
binlog_format ROW
3. MySQL 用户权限
Canal 连接的用户需要有以下权限:
SELECTREPLICATION SLAVEREPLICATION CLIENT
检查权限:
powershell
docker exec flash-sale-mysql mysql -uroot -pWolfCode_2017 -e "SHOW GRANTS FOR 'root'@'%';"
⚠️ Canal 常见问题与解决方案
问题 1:Canal 容器不断重启(退出代码 139)
症状:
STATUS: Restarting (139) X seconds ago
原因:
- 退出代码 139 = Segmentation Fault(段错误)
- 通常是 Canal 镜像版本与运行环境不兼容导致
解决方案:
-
升级 Canal 版本(已在 docker-compose.yml 中更新为 v1.1.7):
yamlimage: canal/canal-server:v1.1.7 -
检查配置文件冲突:
- 确保没有同时使用环境变量和挂载的配置文件设置相同参数
- 已移除冲突的环境变量
-
验证 MySQL 连接:
powershell# 从 Canal 容器内测试 MySQL 连接 docker exec flash-sale-canal ping -c 2 mysql
问题 2:Canal 启动后没有日志
症状:
powershell
docker logs flash-sale-canal
# 输出为空
原因:
- Canal 容器启动失败,进程立即退出
- 配置文件语法错误或路径问题
解决方案:
-
检查配置文件是否存在:
powershell# 检查本地配置文件 Test-Path Docker/canal/conf/canal.properties Test-Path Docker/canal/conf/example/instance.properties -
检查配置文件挂载:
powershelldocker exec flash-sale-canal ls -la /home/admin/canal-server/conf/ -
查看容器详细信息:
powershelldocker inspect flash-sale-canal | Select-String -Pattern "Error|Warning"
问题 3:Canal 无法连接 MySQL
症状 :
日志显示 Connection refused 或 Unknown MySQL server host
解决方案:
-
检查 MySQL 容器是否运行:
powershelldocker ps --filter "name=mysql" -
检查网络连接:
powershelldocker exec flash-sale-canal ping -c 2 mysql -
验证 MySQL 连接信息:
- 主机名:
mysql(Docker 内部网络) - 端口:
3306 - 用户名:
root - 密码:
WolfCode_2017
- 主机名:
问题 4:Canal Client 无法连接 Canal Server
症状 :
Canal Client 日志显示 Connection refused 或超时
解决方案:
-
确保 Canal Server 已正常启动:
powershelldocker logs flash-sale-canal --tail 50 -
检查 Canal 端口监听:
powershelldocker exec flash-sale-canal netstat -tuln | Select-String "11111" -
验证网络连通性:
powershelldocker exec flash-sale-canal-client ping -c 2 canal
🔧 当前项目配置
配置文件位置
Docker/
├── canal/
│ └── conf/
│ ├── canal.properties # Canal Server 主配置
│ └── example/
│ └── instance.properties # Instance 实例配置
关键配置项
canal.properties
properties
canal.serverMode = tcp # 使用 TCP 模式(不是 Kafka/RocketMQ)
canal.destinations = example # 实例名称
canal.port = 11111 # Canal 监听端口
instance.properties
properties
canal.instance.master.address=mysql:3306 # MySQL 地址
canal.instance.dbUsername=root # MySQL 用户名
canal.instance.dbPassword=WolfCode_2017 # MySQL 密码
canal.instance.filter.regex=shop_seckill\\..*,shop_integral\\..*,shop_uaa\\..*
# 监听的数据库表(正则表达式)
🚀 重启 Canal 服务
如果修改了配置或升级了版本,需要重新启动 Canal:
完全重建(推荐)
powershell
# 停止并删除 Canal 相关容器
docker-compose stop canal canal-client
docker-compose rm -f canal canal-client
# 清理 Canal 日志卷(可选)
docker volume rm flash_sale-master_canal-logs
# 重新构建并启动
docker-compose up -d canal
docker-compose up -d canal-client
简单重启
powershell
docker-compose restart canal
docker-compose restart canal-client
✅ 验证 Canal 是否正常工作
1. 检查容器状态
powershell
docker ps --filter "name=canal"
期望状态:Up X seconds (healthy)
2. 查看 Canal 日志
powershell
# Canal Server 日志
docker logs flash-sale-canal --tail 50
# Canal Client 日志
docker logs flash-sale-canal-client --tail 50
3. 测试数据同步
powershell
# 在 MySQL 中更新数据
docker exec flash-sale-mysql mysql -uroot -pWolfCode_2017 shop-seckill -e "UPDATE t_seckill_product SET stock_count = stock_count + 1 WHERE id = 2;"
# 查看 Canal Client 日志,应该能看到捕获的变更
docker logs flash-sale-canal-client --tail 20
🎯 本次问题解决步骤
- ✅ 升级 Canal 镜像版本 :从
v1.1.6升级到v1.1.7 - 版本问题害死了下次应该提前想到的。
- ✅ 添加健康检查:监控 Canal 端口 11111 是否正常监听
- ✅ 保留环境变量提示:添加关键配置的环境变量(不冲突)
- ⏳ 重新启动 Canal:需要执行下面的命令
立即执行
powershell
# 停止并删除旧的 Canal 容器
docker-compose stop canal canal-client
docker-compose rm -f canal canal-client
# 重新启动(使用新配置)
docker-compose up -d canal
# 等待 30 秒后检查状态
Start-Sleep -Seconds 30
docker ps --filter "name=canal"
# 查看日志
docker logs flash-sale-canal --tail 50
📊 健康检查说明
新增的健康检查机制:
yaml
healthcheck:
test: ["CMD-SHELL", "netstat -an | grep 11111 || exit 1"]
interval: 10s # 每 10 秒检查一次
timeout: 5s # 超时时间 5 秒
retries: 5 # 失败 5 次后标记为 unhealthy
start_period: 30s # 启动后 30 秒才开始健康检查
这样可以确保 Canal 服务真正启动并监听端口后,其他依赖服务才会启动。
🔍 深度调试
如果问题仍然存在,可以进入容器内部调试:
powershell
# 进入 Canal 容器
docker exec -it flash-sale-canal bash
# 查看 Canal 进程
ps aux | grep canal
# 查看端口监听
netstat -tuln | grep 11111
# 查看配置文件
cat /home/admin/canal-server/conf/canal.properties
cat /home/admin/canal-server/conf/example/instance.properties
# 查看日志文件
tail -f /home/admin/canal-server/logs/canal/canal.log
tail -f /home/admin/canal-server/logs/example/example.log
⚠️ 重要提示
-
Canal 是可选功能:
- 如果不需要实时数据同步到 Redis,可以暂时禁用 Canal
- 注释掉
docker-compose.yml中的canal和canal-client服务
-
性能影响:
- Canal 会持续监听 MySQL binlog,有一定性能开销
- 适用于需要实时同步数据的场景(如缓存同步、数据异构)
-
数据一致性:
- Canal 是异步同步,有延迟(通常毫秒级)
- 不适合强一致性要求的场景
现在请执行上面的"立即执行"命令,重新启动 Canal 并告诉我结果! 🎯