Canal(阿里巴巴开源的 MySQL Binlog 增量订阅 & 消费组件)

下面从概念、架构、部署方式(单机、集群、Docker、Kubernetes)等方面来进行介绍canal的一些相关的信息。

1. 基本概念与核心组件

组件 作用 关键配置文件
Canal Server 负责伪装成 MySQL slave,读取 binlog、解析成统一的增量事件(INSERT/UPDATE/DELETE) conf/example/instance.properties(每个实例)
Canal Admin 集群管理 UI,提供实例注册、监控、运维等功能;依赖 Zookeeper 进行注册/选举 conf/canal-admin.properties
Zookeeper 为多实例提供注册中心、选举、配置同步(可选) zookeeper.connect(在 canal.properties 中)
Instance 每个业务库对应一个实例,拥有独立的 instance.properties,可实现不同过滤规则 同上
TSDB(可选) 增量位点持久化,防止因异常导致的位点丢失 canal.instance.tsdb.*

Canal 通过 “伪装 MySQL slave” 的方式读取 binlog,兼容 MySQL、MariaDB、OceanBase、PolarDB 等多种数据源。

2. 前置条件

条件 说明
JDK Java 8 或以上
MySQL 开启 binlog、ROW 格式、GTID(可选)log-bin=mysql-bin、binlog_format=ROW、server-id 必须唯一
网络 Canal Server 能访问 MySQL 主库的 3306 端口;集群模式下各节点能互通 Zookeeper 2181 端口
磁盘 建议使用 SSD,尤其是存放 binlog 与 TSDB 的目录
用户权限 在 MySQL 上创建专用同步账号,例如 CREATE USER ‘canal’@‘%’ IDENTIFIED BY ‘Canal@123456’; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON . TO ‘canal’@‘%’;

3. 单机(Standalone)部署步骤

1.下载并解压

wget https://github.com/alibaba/canal/releases/download/canal-1.1.7/canal.deployer-1.1.7.tar.gz
tar -zxf canal.deployer-1.1.7.tar.gz -C /usr/local/
mv canal.deployer-1.1.7 /usr/local/canal

2.修改全局配置 conf/canal.properties(可选)

  • canal.instance.master.address:主库 IP:3306
  • canal.instance.dbUsername / canal.instance.dbPassword:同步账号
  • canal.instance.filter.regex:同步的库表正则(如 .\… 同步全部)

3.创建实例配置 conf/example/instance.properties(每个业务库对应一个实例)

canal.instance.master.address=10.0.1.10:3306
canal.instance.dbUsername=canal
canal.instance.dbPassword=Canal@123456
canal.instance.filter.regex=inventory\\..*

4.启动服务

cd /usr/local/canal
bin/startup.sh   # 启动 Canal Server
tail -f logs/example/example.log   # 查看启动日志

5.验证

  • 通过日志确认 Canal 已成功连接 MySQL 并开始读取 binlog。
  • 使用 curl http://:11111/metrics(默认 metrics 端口)检查健康状态。

单机模式适用于开发、测试或小流量业务,部署成本最低。

4. 集群模式(Canal Admin + 多个 Server)

4.1 部署 Zookeeper(推荐 3 节点)

# 以官方二进制为例
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.9.2/apache-zookeeper-3.9.2-bin.tar.gz
tar -zxf apache-zookeeper-3.9.2-bin.tar.gz -C /opt/
mv apache-zookeeper-3.9.2-bin /opt/zookeeper
# 配置 dataDir、clientPort 等

4.2 部署 Canal Admin(Web UI)

1.下载 Admin 包 canal.admin-1.1.7.tar.gz 并解压到 /opt/canal-admin。
2.配置 conf/canal-admin.properties
canal.admin.zkServers=zk1:2181,zk2:2181,zk3:2181
canal.admin.port=8089
canal.admin.datasource.url=jdbc:mysql://127.0.0.1:3306/canal_manager?characterEncoding=utf8
canal.admin.datasource.username=admin
canal.admin.datasource.password=admin123

  • 需要提前在 MySQL 中执行 canal.admin/conf/canal_manager.sql 创建管理库。
3.启动 bin/startup.sh,访问 http://:8089 进入管理控制台。

4.3 部署多个 Canal Server 实例

  • 在每台机器上重复 单机部署 步骤,只需在 canal.properties 中指定 canal.register.ip 为本机 IP,canal.port 为 11111(可自定义),并确保 canal.instance.register.cluster.name 与 Admin 中的 cluster.name 一致。
  • 启动后,Server 会向 Zookeeper 注册,Admin UI 能实时展示每个实例的状态、消费位点、异常日志等。

集群模式可实现 高可用(单点故障自动切换)和 水平扩容(增加 Server 处理更大吞吐)。

5.Docker 方式

5.1 直接使用官方镜像运行单容器

# 1)拉取官方镜像(截至 2025‑10‑17,最新 tag 为 v1.1.7)
docker pull canal/canal-server:v1.1.7

# 2)创建本地配置目录(建议挂载到宿主机,便于持久化)
mkdir -p /opt/canal/conf/example

# 3)在宿主机上编辑 instance.properties(下面给出最小示例):
cat > /opt/canal/conf/example/instance.properties <<EOF
# ---------- MySQL 连接 ----------
canal.instance.master.address=10.0.1.10:3306
canal.instance.dbUsername=canal
canal.instance.dbPassword=Canal@123456
# 伪装的 slaveId,避免与真实 slave 冲突
canal.instance.mysql.slaveId=9999
# 只同步 inventory 库的所有表(正则写法)
canal.instance.filter.regex=inventory\\..*
# 位点持久化(TSDB)使用本地文件
canal.instance.tsdb.enable=true
canal.instance.tsdb.dir=/opt/canal/tsdb
EOF

# 4)启动容器(映射端口 11111,挂载配置和 TSDB 目录)
docker run -d \
  --name canal \
  -p 11111:11111 \
  -v /opt/canal/conf/example:/canal-server/conf/example \
  -v /opt/canal/tsdb:/canal-server/tsdb \
  canal/canal-server:v1.1.7

注意:
canal.instance.mysql.slaveId 必须与 MySQL 中已有的 slaveId 不冲突。
canal.instance.tsdb.enable=true 能在容器重启后恢复位点,防止数据重复。
若容器内部启动脚本找不到 conf/example 目录,会导致 docker restart 失败,务必保证挂载路径与镜像内部路径一致。

5.2 Docker‑Compose(适合本地开发或小型生产)

docker-compose.yml(保存到 /opt/canal/docker-compose.yml):

version: "3.8"
services:
  canal:
    image: canal/canal-server:v1.1.7
    container_name: canal
    ports:
      - "11111:11111"
    volumes:
      - ./conf/example:/canal-server/conf/example   # 配置
      - ./tsdb:/canal-server/tsdb                 # 位点持久化
    environment:
      - TZ=Asia/Shanghai
    restart: unless-stopped

使用方式

cd /opt/canal
docker-compose up -d

验证:curl http://:11111/metrics 能看到 Prometheus 指标;使用 MySQL 客户端向 canal 发送 SHOW SLAVE STATUS(通过 mysql -h 127.0.0.1 -P 11111 -u root)检查Slave_IO_Running=Yes 即可。

6. Kubernetes(K8s)方式

K8s 部署适用于生产环境,可实现 自动伸缩、滚动升级、持久化卷、健康检查。下面提供两种实现路径:

6.1 原生 YAML(不依赖 Helm)

必要的 ConfigMap(存放 instance.properties)

apiVersion: v1
kind: ConfigMap
metadata:
  name: canal-instance-config
  namespace: data-sync
data:
  instance.properties: |
    canal.instance.master.address=10.0.1.10:3306
    canal.instance.dbUsername=canal
    canal.instance.dbPassword=Canal@123456
    canal.instance.mysql.slaveId=9999
    canal.instance.filter.regex=inventory\\..*
    canal.instance.tsdb.enable=true
    canal.instance.tsdb.dir=/canal/tsdb

PersistentVolumeClaim(TSDB 持久化)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: canal-tsdb-pvc
  namespace: data-sync
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

Deployment(单副本示例,可自行扩展 replicas)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: canal-server
  namespace: data-sync
spec:
  replicas: 2               # 根据业务吞吐自行调节
  selector:
    matchLabels:
      app: canal
  template:
    metadata:
      labels:
        app: canal
    spec:
      containers:
        - name: canal
          image: canal/canal-server:v1.1.7
          ports:
            - containerPort: 11111
          env:
            - name: TZ
              value: Asia/Shanghai
          volumeMounts:
            - name: instance-conf
              mountPath: /canal-server/conf/example
            - name: tsdb-data
              mountPath: /canal/tsdb
          readinessProbe:
            httpGet:
              path: /metrics
              port: 11111
            initialDelaySeconds: 10
            periodSeconds: 15
      volumes:
        - name: instance-conf
          configMap:
            name: canal-instance-config
            items:
              - key: instance.properties
                path: instance.properties
        - name: tsdb-data
          persistentVolumeClaim:
            claimName: canal-tsdb-pvc

Service(ClusterIP,供内部业务或 Canal Admin 访问)

apiVersion: v1
kind: Service
metadata:
  name: canal-service
  namespace: data-sync
spec:
  selector:
    app: canal
  ports:
    - protocol: TCP
      port: 11111
      targetPort: 11111

部署命令

kubectl apply -f canal-configmap.yaml
kubectl apply -f canal-pvc.yaml
kubectl apply -f canal-deployment.yaml
kubectl apply -f canal-service.yaml

验证

# 查看 Pod 状态
kubectl -n data-sync get pods -l app=canal

# 访问 metrics(在集群内部)
kubectl -n data-sync exec -it $(kubectl -n data-sync get pod -l app=canal -o jsonpath="{.items[0].metadata.name}") -- curl http://127.0.0.1:11111/metrics

6.2 使用 Helm Chart(更简洁、可升级)

官方提供的 Helm Chart(如 bitnami/canal、tianyi/canal)已经封装了上述 ConfigMap、PVC、Service 等资源。下面以 bitnami/canal 为例:

# 1)添加仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

# 2)自定义 values.yaml(示例)
cat > values.yaml <<EOF
replicaCount: 3

image:
  repository: canal/canal-server
  tag: v1.1.7

service:
  type: ClusterIP
  port: 11111

persistence:
  enabled: true
  size: 20Gi

canal:
  master:
    host: 10.0.1.10
    port: 3306
  username: canal
  password: Canal@123456
  slaveId: 9999
  filterRegex: inventory\\..*
  tsdb:
    enabled: true
EOF

# 3)安装
helm install my-canal bitnami/canal -f values.yaml --namespace data-sync --create-namespace

验证

helm status my-canal -n data-sync
kubectl -n data-sync get svc my-canal

7.总结

方式 适用场景 优势
Docker 单容器 本地开发、快速验证、轻量测试 只需一条 docker run 命令,配置持久化即可
Docker‑Compose 小规模生产或多实例本地部署 统一管理容器、环境变量、卷,支持 restart 策略
K8s 原生 YAML 需要自定义资源、细粒度控制的企业级部署 完整的 ConfigMap、PVC、Probe、滚动升级
Helm Chart 大规模集群、频繁升级、统一运维 参数化、版本管理、快速回滚

只要确保 MySQL binlog 正常、Canal 配置文件与容器路径对应、TSDB 持久化,上述任意一种方式都能在几分钟内完成 Canal 的可用部署。祝部署顺利,业务增量同步无缝进行!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐