type
Post
status
Published
date
Apr 3, 2021
slug
summary
本文介绍 Canal 的核心原理与部署使用流程:从 MySQL Binlog/主从复制机制出发,说明 Canal 的工作方式;给出 MySQL 环境与权限配置、单机 Canal 部署与 Canal Client 示例;进一步讲解对接 Kafka 的关键参数、消费示例与位点保存;最后补充 HA 架构与 canal-admin 的安装与注册要点,帮助快速搭建可用于生产的增量订阅链路。
tags
MySQL
Kafka
Big Data
category
Database
icon
password
wordCount
4205
前言
- Canal 的价值在于把数据库的变更(insert/update/delete)从 MySQL Binlog 里“实时拿出来”,让你可以把增量数据同步到下游系统,比如 Kafka、ES、数据仓库或缓存。
- 本文按“原理 → 环境配置 → 单机部署 → 客户端订阅 → Kafka 输出 → HA/运维”的顺序整理,目标是让你能从零搭建一条可用的增量订阅链路,并理解每一步为什么要这么配。
canal是纯Java开发。基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL

MySQL主备复制原理

- MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看) - MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log) - MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据
Cannel工作原理
canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
- canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送 dump 协议
- MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
- canal 解析 binary log 对象(原始为 byte 流)
配置mysql环境
- 需要先开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式
修改my.cnf,mysql 一般位于 maridb一般位于
- 验证
- 授权canal
搭建canal环境(单机)
- 下载canal(1.1.4) 版本
- 解压后目录结构
- 修改配置文件
- 启动 / 关闭
- 查看日志
- 运行 canal-client
新建maven工程,添加pom依赖
CanalClientDemo.java
- 控制台日志
Canal Kafka
- properties配置分为两部分:
- canal.properties (系统根配置文件)
- instance.properties (instance级别的配置文件,每个instance一份)
- canal.properties 相关配置
- example/instance.properties
- 启动
- kafka查看
- 偏移量保存
单机下 binlog的偏移量是保存在 {{destinations }} 文件夹下的meta.dat
搭建canal环境(HA)
- 机器准备
- 2 台canal服务器节点:10.34.11.136, 10.34.11.65
- 3 台zookeeper 节点:10.34.11.70 ,10.34.11.133 ,10.34.11.124
- mysql 服务器: 10.34.12.185
- 修改配置文件,在单台机器上各自完成配置
canal.propertis
example/instance.properties
- 运行
触发HA自动切换场景 (server/client HA模式都有效)
正常关闭(bin/stop.sh)
- 正常关闭canal server(会释放instance的所有资源,包括删除running节点)
- 平滑切换(gracefully)
canal-admin界面化安装
- 下载
- 修改conf/application.yml
- 在mysql运行conf/canal_manager.sql
- 启动
浏览器访问 127.0.0.1:8089 (默认用户/密码 admin/123456)
- 新建集群

4
- 选择编辑主配置

image-20200605162605369
- 将上面ha搭建的两台canal停止
- 分别修改conf/canal_local.properties
- 在分别启动canal
在server管理里面会多服务器

image-20200605163745709
- 新建instance ,指定所属集群为canal_cluster
