Canal 部署与问题排查指南

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 连接的用户需要有以下权限:

  • SELECT
  • REPLICATION SLAVE
  • REPLICATION 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 镜像版本与运行环境不兼容导致

解决方案

  1. 升级 Canal 版本(已在 docker-compose.yml 中更新为 v1.1.7):

    yaml 复制代码
    image: canal/canal-server:v1.1.7
  2. 检查配置文件冲突

    • 确保没有同时使用环境变量和挂载的配置文件设置相同参数
    • 已移除冲突的环境变量
  3. 验证 MySQL 连接

    powershell 复制代码
    # 从 Canal 容器内测试 MySQL 连接
    docker exec flash-sale-canal ping -c 2 mysql

问题 2:Canal 启动后没有日志

症状

powershell 复制代码
docker logs flash-sale-canal
# 输出为空

原因

  • Canal 容器启动失败,进程立即退出
  • 配置文件语法错误或路径问题

解决方案

  1. 检查配置文件是否存在

    powershell 复制代码
    # 检查本地配置文件
    Test-Path Docker/canal/conf/canal.properties
    Test-Path Docker/canal/conf/example/instance.properties
  2. 检查配置文件挂载

    powershell 复制代码
    docker exec flash-sale-canal ls -la /home/admin/canal-server/conf/
  3. 查看容器详细信息

    powershell 复制代码
    docker inspect flash-sale-canal | Select-String -Pattern "Error|Warning"

问题 3:Canal 无法连接 MySQL

症状

日志显示 Connection refusedUnknown MySQL server host

解决方案

  1. 检查 MySQL 容器是否运行

    powershell 复制代码
    docker ps --filter "name=mysql"
  2. 检查网络连接

    powershell 复制代码
    docker exec flash-sale-canal ping -c 2 mysql
  3. 验证 MySQL 连接信息

    • 主机名:mysql(Docker 内部网络)
    • 端口:3306
    • 用户名:root
    • 密码:WolfCode_2017

问题 4:Canal Client 无法连接 Canal Server

症状

Canal Client 日志显示 Connection refused 或超时

解决方案

  1. 确保 Canal Server 已正常启动

    powershell 复制代码
    docker logs flash-sale-canal --tail 50
  2. 检查 Canal 端口监听

    powershell 复制代码
    docker exec flash-sale-canal netstat -tuln | Select-String "11111"
  3. 验证网络连通性

    powershell 复制代码
    docker 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

🎯 本次问题解决步骤

  1. 升级 Canal 镜像版本 :从 v1.1.6 升级到 v1.1.7
  2. 版本问题害死了下次应该提前想到的。
  3. 添加健康检查:监控 Canal 端口 11111 是否正常监听
  4. 保留环境变量提示:添加关键配置的环境变量(不冲突)
  5. 重新启动 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

⚠️ 重要提示

  1. Canal 是可选功能

    • 如果不需要实时数据同步到 Redis,可以暂时禁用 Canal
    • 注释掉 docker-compose.yml 中的 canalcanal-client 服务
  2. 性能影响

    • Canal 会持续监听 MySQL binlog,有一定性能开销
    • 适用于需要实时同步数据的场景(如缓存同步、数据异构)
  3. 数据一致性

    • Canal 是异步同步,有延迟(通常毫秒级)
    • 不适合强一致性要求的场景

现在请执行上面的"立即执行"命令,重新启动 Canal 并告诉我结果! 🎯

相关推荐
龙门吹雪3 个月前
Docker 安装 canal 详细步骤
运维·docker·容器·canal·mysql binlog 日志·增量数据订阅消费
阿里嘎多哈基米3 个月前
Mac系统,Docker的MySQL + 本地 Canal
mysql·macos·docker·canal
菠菠萝宝3 个月前
【Java八股文】13-中间件面试篇
java·docker·kafka·rabbitmq·canal·rocketmq·es
gorgor在码农5 个月前
基于Canal实现MySQL数据库数据同步
数据库·mysql·canal·数据库数据同步工具
ζั͡山 ั͡有扶苏 ั͡✾10 个月前
从零搭建:Canal实时数据管道打通MySQL与Elasticsearch
mysql·elasticsearch·canal
Hello Dam1 年前
接口 V2 完善:基于责任链模式、Canal 监听 Binlog 实现数据库、缓存的库存最终一致性
数据库·缓存·canal·binlog·责任链模式·数据一致性
牛马程序员‍1 年前
【云岚到家】-day04-数据同步方案es-Canal-MQ
大数据·elasticsearch·canal·mq
Z灏1 年前
canal同步es,sql注意事项
数据库·sql·elasticsearch·canal
小灰灰__1 年前
整合版canal ha搭建--基于1.1.4版本
canal