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 的可用部署。祝部署顺利,业务增量同步无缝进行!
5761

被折叠的 条评论
为什么被折叠?



