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
复制代码
验证canal集群
#连上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

 

 

 

 

 

 

 

 

 

 

 

posted @   逆风飞翔的博客  阅读(409)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示