canal的部署(单机、集群、docker、k8s)

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. 前置条件

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

### 如何在 Kubernetes部署 Canal 为了在 Kubernetes 集群上成功部署 Canal,可以采用 Kubespray 这一工具来简化过程。Kubespray 支持多种网络插件的选择,其中包括 Canal[^2]。 #### 使用 Kubespray 部署带有 CanalKubernetes 集群 首先,获取最新的 Kubespray 版本并构建所需的 Docker 映像: ```bash git clone https://github.com/kubernetes-sigs/kubespray.git cd kubespray docker build -t "docker.io/ghostwritten/kubespray:$(git symbolic-ref --short -q HEAD)-$(git rev-parse --short HEAD)" . ``` 接着,在本地环境中安装 Ansible 并配置好环境变量以便后续操作顺利进行: ```bash sudo dnf update sudo dnf -y install epel-release sudo dnf -y install ansible ``` 创建用于描述集群配置的 inventory 文件,并指定使用 Canal 作为 CNI 插件。这通常涉及到编辑 `inventory/sample/inventory.ini` 或者创建一个新的库存文件,设置如下参数: ```ini [kube-node] node1 node2 [kube-master] master1 [cni] kube_network_plugin="canal" etcd_type="host" [all:vars] ansible_user=centos pod_cidr="10.233.64.0/18" service_cidr="10.233.0.0/18" cluster_name=kubernetes-the-hard-way networking_cilium_enabled=false networking_calico_ipip_mode="Always" networking_canal_flannel_backend="vxlan" ``` 最后一步是运行 Ansible playbook 来启动整个部署流程: ```bash ansible-playbook -i inventory/my_cluster/hosts.yml cluster.yml ``` 以上命令会自动完成 Canal 组件及相关依赖项的下载与安装工作,从而实现 CanalKubernetes 环境中的集成。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L.EscaRC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值