Canal
Canal-数据同步工具
Canal简介
https://github.com/alibaba/canal/wiki/AdminGuide
canal
是阿里的一款开源项目,纯 Java
开发。基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了 MySQL
(也支持 mariaDB
)。
canal工作原理
- canal模拟mysql slave的交互协议,伪装自己为Mysql slave,向mysql master发送dump协议
- mysql master收到dump请求,开始推送binary log给slave(即canal)
- canal解析binary log对象(原始为byte流)
canal集群部署
规划:
1、canal server两个节点
2、zookeeper集群三个节点
mkdir /opt/canal cd /opt/canal wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.deployer-1.1.5.tar.gz tar xvf canal.deployer-1.1.5.tar.gz
HA机制
整个 HA 机制的控制主要是依赖了zookeeper的两个特性:watcher、EPHEMERAL节点。canal的 HA 机制实现分为两部分,canal server 和 canal client分别有对应的实现。
Canal server实现流程如下:
1.canal server要启动某个canal instance时都向zookeeper进行一次尝试启动判断(实现:创建EPHEMERAL节点,谁创建成功就允许谁启动);
2.创建zookeeper节点成功后,对应的canal server就启动对应的canal instance,没有创建成功canal instance就会处于standby状态;
3.一旦zookeeper发现canal server A创建的节点消失后,立即通知其他的canal server再次进行步骤1的操作,重新选出一个canal server启动instance;
4.canal client每次进行connect时,会首先向zookeeper询问当前时谁启动了canal instance,然后和其建立链接,一旦链接不可用,会重新尝试connect。
重点:为了减少对mysql dump的请求,不同server上的instance要求同一时间只能有一个处于running,其他的处于standby状态。
Canal client实现流程
1.canal client的方式和canal server方式类似,也是利用zookeeper的抢占EPHEMERAL节点的方式进行控制。
2.为了保证有序性,一份instance同一时间只能由一个canal client进行get/ack/rollbak操作,否则客户端接收无法保证有序。
canal集群配置
注意:两台机器上的instance目录名字需要保证完全一致,HA模式是依赖instance name进行管理,同时必须都选择default-instace.xml配置
节点01
修改canal.properties配置文件
cp canal.properties canal.properties.bak cd /opt/canal/conf/ vim canal.properties #主要配置例举如下: #保证canal集群中每个canal server的id都是唯一的 canal.id = 11 #canal server的地址 canal.ip = 192.168.1.111 #canal服务socket监听端口,代码中连接canal-server时,使用此段口连接 canal.port = 11111 canal.metrics.pull.port = 11112 #canal server注册的zookeeper地址,集群各节点之间用逗号分隔 canal.zkServers = 192.168.1.113:2181,192.168.1.114:2181,192.168.1.115:2181 #表示实例的配置文件instance.properties地址 canal.destinations = example # 所有的组件(parser , sink , store)都选择了持久化模式, # 目前持久化的方式主要是写入zookeeper,保证数据集群共享 canal.instance.global.spring.xml = classpath:spring/default-instance.xml
修改instance.properties配置文件
cd /opt/canal/conf/example cp instance.properties instance.properties.bak vim instance.properties #主要配置例举如下: #canal集群中每个canal server的slaveld保持唯一 canal.instance.mysql.slaveId=111 #需要同步的数据库地址 canal.instance.master.address=192.168.1.77:3306 #数据库用户名、密码 canal.instance.dbUsername=root canal.instance.dbPassword=xxxxx #数据库连接编码 canal.instance.connectionCharset = UTF-8
#table regex 匹配数据库对应的表
canal.instance.filter.regex=centerdb_www.common_bespeak_info
#mysql 数据解析关注的表,Perl正则表达式.多个正则之间以逗号(,)分隔,转义符需要双斜杠(\)
canal.instance.filter.regex=.*\\..*
节点02
修改canal.properties配置文件
cd /opt/canal/conf/example cp canal.properties canal.properties.bak vim canal.properties #保证canal集群中每个canal server的id都是唯一的 canal.id = 22 #canal server的地址 canal.ip = 192.168.1.113 #canal服务socket监听端口,代码中连接canal-server时,使用此段口连接 canal.port = 11111 canal.metrics.pull.port = 11112 #canal server注册的zookeeper地址,集群各节点之间用逗号分隔 canal.zkServers = 192.168.1.113:2181,192.168.1.114:2181,192.168.1.115:2181 #表示实例的配置文件instance.properties地址 canal.destinations = example # 所有的组件(parser , sink , store)都选择了持久化模式, # 目前持久化的方式主要是写入zookeeper,保证数据集群共享 canal.instance.global.spring.xml = classpath:spring/default-instance.xml
修改 instance.properties配置文件
cd /opt/canal/conf/example cp instance.properties instance.properties.bak vim instance.properties canal.instance.mysql.slaveId=222 #需要同步的数据库地址 canal.instance.master.address=192.168.1.77:3306 canal.instance.master.journal.name=mysql-bin.000001 #数据库用户名、密码 canal.instance.dbUsername=root canal.instance.dbPassword=xxxxx
#table regex 匹配数据库对应的表
canal.instance.filter.regex=centerdb_www.common_bespeak_info #数据库连接编码 canal.instance.connectionCharset = UTF-8 #mysql 数据解析关注的表,Perl正则表达式.多个正则之间以逗号(,)分隔,转义符需要双斜杠(\) canal.instance.filter.regex=.*\\..*
启动canal server
cd /opt/canal ./startup.sh #查看进程状态 ps -ef |grep canal #查看canal端口 ss -ntlup |grep 111 tcp LISTEN 0 50 192.168.1.113:11111 *:* users:(("java",pid=20672,fd=82)) tcp LISTEN 0 3 *:11112 *:* users:(("java",pid=20672,fd=77)) tcp LISTEN 0 50 192.168.1.113:11110
#连上zookeeper ./zkCli.sh 目录结构
#读取binlog信息 ls /otter/canal/destinations/example [1001, cluster, running] get /otter/canal/destinations/example/1001/cursor {"@type":"com.alibaba.otter.canal.protocol.position.LogPosition","identity":{"slaveId":-1,"sourceAddress":{"address":"192.168.1.77","port":3306}},"postion":{"gtid":"","included":false,"journalName":"mysql-bin.000013","position":606163903,"serverId":1,"timestamp":1658313261000}} #查看当前哪个canal client在工作 get /otter/canal/destinations/example/1001/running {"active":true,"address":"192.168.10.38:62071","clientId":1001} #查看canal集群状态 ls /otter/canal/destinations/example/cluster [192.168.1.111:11111, 192.168.1.113:11111] #查看当前哪个canal server节点在工作 get /otter/canal/destinations/example/running {"active":true,"address":"192.168.1.111:11111"} #从上面信息可以看下,现在canal工作节点是192.168.1.111,现在咱们来验证下canal server集群工作节点的自动切换功能。 先停掉192.168.1.111的canal server cd /opt/canal ./stop.sh 然后再次查看当前哪个canal节点在工作 ./zkCli.sh get /otter/canal/destinations/example/running {"active":true,"address":"192.168.1.113:11111"} #从上面输出信息可以看到,canal集群当前工作节点自动切换到了另外一个canal server节点
canal热部署实例
备注:计划修改单点为HA,HA配置下。
当CANAL在运行时,如果想向容器添加实例,需要重启服务,影响生产业务,所以CANAL提供热加载部署方式,使用热加载,必须在canal.properties中开启这一功能,即设置:
canal.instance.global.lazy = true
同时开启配置扫描
canal.auto.scan = true
canal.auto.scan.interval = 5 # 每 5 秒钟扫描一次
注释实例列表配置
# canal.destinations = zyloops
这样,如果要新增实例,只需在 ${canal.conf.dir}目录创建新文件夹,进行相关配置,CANAL就能感知到实例变化,对实例进行初始化并开始启动运行实例。
如果要移除某个实例,只需将该实例文件夹从 ${canal.conf.dir} 目录中删除,CANAL 会自动将实例配置卸载并关闭实例,对实例的配置文件 instance.properties 文件的修改,CANAL 也能自动触发重载,并对实例进行重启操作
监控:
canal 默认已通过1112端口暴露同步相关的metric信息,只需通过集成prometheus与grafana即可实现实时监控同步情况。
指标 简述 Basic Canal instance 基本信息。 Network bandwith 网络带宽。包含inbound(canal server读取binlog的网络带宽)和outbound(canal server返回给canal client的网络带宽)。 Delay Canal server与master延时;store 的put, get, ack操作对应的延时。 Blocking sink线程blocking占比;dump线程blocking占比(仅parallel mode)。 TPS(events) Canal instance消费所有binlog事件的TPS, 以MySQL binlog events为单位计算。 TPS(transaction) Canal instance 处理binlog的TPS,以MySQL transaction为单位计算。 TPS(tableRows) 分别对应store的put, get, ack操作针对数据表变更行的TPS。 Client requests Canal client请求server的请求数统计,结果按请求类型分类(比如get/ack/sub/rollback等)。 Client QPS client发送请求的QPS,按GET与CLIENTACK分类统计。 Empty packets Canal client请求server返回空结果的统计。 Response time Canal client请求server的响应时间统计。 Store remain events Canal instance ringbuffer中堆积的events数量。 Store remain mem Canal instance ringbuffer中堆积的events内存使用量。
总结:
1、同一时间,两个canal(server),只会有一个工作,另一个处于阻塞状态;
2、同一时间,两个canal(client),也只会有一个工作,另一个处于阻塞状态
参考案例:
https://blog.csdn.net/zenglingmin8/article/details/125902173
canal HA机制
https://blog.csdn.net/echizao1839/article/details/127411538
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!