canal同步binlog实战

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: canal同步binlog实战

1. canal原理介绍



canal简介



640.png

canal [kǝ'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。


基于日志增量订阅和消费的业务包括

  1. 数据库镜像
  2. 数据库实时备份
  3. 索引构建和实时维护(拆分异构索引、倒排索引等)
  4. 业务cache刷新
  5. 带业务逻辑的增量数据处理


当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x


canal原理

640.png


主从复制原理:

  1. MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过show binlog events 进行查看)
  2. MySQL slave 将 master 的 binary log events 拷⻉到它的中继日志(relay log)
  3. MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据


所以canal模拟mysql slave也实现了自己的binlog同步,原理如下:

  1. canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
  2. MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
  3. canal 解析 binary log 对象(原始为 byte 流)


2. canal实战



首先去下载安装相关canal组件


这里可以参考官网:https://github.com/alibaba/canal

安装完canal服务,然后按照文档介绍去配置相应的参数,就可以启动canal的服务了,由于官网介绍的比较细,大家自行去安装和配置,这里着重介绍canal同步binlog代码实践。


canal-go订阅和消费canal binlog


下载canal-go客户端,运行里面samples下的main.go,当然可能报错,将路径替换正确就OK了。(有问题欢迎私信) 部分订阅消费代码如下:


func main() {
 // 192.168.199.17 替换成你的canal server的地址
 // example 替换成-e canal.destinations=example 你自己定义的名字
 connector := client.NewSimpleCanalConnector("127.0.0.1", 11113, "", "", "example", 60000, 60*60*1000)
 err := connector.Connect()
 if err != nil {
  log.Println(err)
  os.Exit(1)
 }
 err = connector.Subscribe(".*\\..*")
 if err != nil {
  log.Println(err)
  os.Exit(1)
 }
 for {
  message, err := connector.Get(100, nil, nil)
  if err != nil {
   log.Println(err)
   os.Exit(1)
  }
  batchId := message.Id
  if batchId == -1 || len(message.Entries) <= 0 {
   time.Sleep(300 * time.Millisecond)
   fmt.Println("===没有数据了===")
   continue
  }
  printEntry(message.Entries)
 }
}

我们可以对canal配置文件中已经配置的数据库表进行增删改,看看我们程序是否能显示相关binlog日志


  1. 增加
mysql> insert into canal(`id`, `name`) values(1,"hah");
Query OK, 1 row affected (0.04 sec)
mysql>


打印日志:

===没有数据了===
================> binlog[mysql-bin.000002 : 2069],name[test,canal], eventType: INSERT
id : 1  update= true
name : hah  update= true
sex :   update= true
age :   update= true
amount :   update= true
email :   update= true
occur_time : 2021-09-15 09:47:09  update= true
  1. 更新
mysql> update canal set name="hello" where id=1;
Query OK, 1 row affected (0.04 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql>


打印日志如下:

===没有数据了===
================> binlog[mysql-bin.000002 : 2348],name[test,canal], eventType: UPDATE
-------> before
id : 1  update= false
name : hah  update= false
sex :   update= false
age :   update= false
amount :   update= false
email :   update= false
occur_time : 2021-09-15 09:47:09  update= false
-------> after
id : 1  update= false
name : hello  update= true
sex :   update= false
age :   update= false
amount :   update= false
email :   update= false
occur_time : 2021-09-15 09:47:09  update= false
===没有数据了===
  1. 删除
mysql> delete from canal where id=1;
Query OK, 1 row affected (0.03 sec)
mysql>


打印日志如下:

================> binlog[mysql-bin.000002 : 2643],name[test,canal], eventType: DELETE
id : 1  update= false
name : hello  update= false
sex :   update= false
age :   update= false
amount :   update= false
email :   update= false
occur_time : 2021-09-15 09:47:09  update= false
===没有数据了===


3. 总结



通过canal-go客户端可以订阅和消费canal server,那么同样我们可以配置kafka,mysql,es,mq等也可以去订阅和消费数据,项目中比较常见的就是将mysql数据同步到es中提供搜索查询能力,而这最好的方式就是通过canal中间件来做,减少人工的维护成本,提供工作效率。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
关系型数据库 MySQL 数据挖掘
MySQL - binlog同步过程
MySQL - binlog同步过程
328 0
|
3月前
|
canal 消息中间件 关系型数据库
Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
【9月更文挑战第1天】Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
841 4
|
3月前
|
消息中间件 canal 关系型数据库
Maxwell:binlog 解析器,轻松同步 MySQL 数据
Maxwell:binlog 解析器,轻松同步 MySQL 数据
397 11
|
4月前
|
存储 关系型数据库 MySQL
【TiDB原理与实战详解】5、BR 物理备份恢复与Binlog 数据同步~学不会? 不存在的!
BR(Backup & Restore)是 TiDB 分布式备份恢复的命令行工具,适用于大数据量场景,支持常规备份恢复及大规模数据迁移。BR 通过向各 TiKV 节点下发命令执行备份或恢复操作,生成 SST 文件存储数据信息与 `backupmeta` 文件存储元信息。推荐部署配置包括在 PD 节点部署 BR 工具,使用万兆网卡等。本文介绍 BR 的工作原理、部署配置、使用限制及多种备份恢复方式,如全量备份、单库/单表备份、过滤备份及增量备份等。
|
7月前
|
关系型数据库 MySQL 数据处理
实时计算 Flink版产品使用合集之在同步MySQL的时候卡在某个binlog文件处如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
实时计算 Flink版产品使用合集之在同步MySQL的时候卡在某个binlog文件处如何解决
|
7月前
|
存储 缓存 NoSQL
Redis与数据库同步指南:订阅Binlog实现数据一致性
本文由开发者小米分享,探讨分布式系统中的一致性问题,尤其是数据库和Redis一致性。文章介绍了全量缓存策略的优势,如高效读取和稳定性,但也指出其一致性挑战。为解决此问题,提出了通过订阅数据库的Binlog实现数据同步的方法,详细解释了工作原理和步骤,并分析了优缺点。此外,还提到了异步校准方案作为补充,以进一步保证数据一致性。最后,提醒在实际线上环境中需注意日志记录、逐步优化和监控报警。
401 3
|
7月前
|
SQL 算法 关系型数据库
实时计算 Flink版产品使用合集之全量历史数据比较多,全量同步阶段时间长,是否会同时读取binlog进行合并输出
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
7月前
|
存储 数据库 流计算
Flink CDC 2.2.1 版本不支持通过 source 指定 binlog 或者 timestamp 的方式来做增量同步
Flink CDC 2.2.1 版本不支持通过 source 指定 binlog 或者 timestamp 的方式来做增量同步
75 3
|
canal 负载均衡 关系型数据库
Flink CDC如何获得增量binlog,可能是跟canal一样,伪装成从节点获取日志?
Flink CDC如何获得增量binlog,可能是跟canal一样,伪装成从节点获取日志?
173 1
|
7月前
|
存储 SQL NoSQL
[MySQL binlog实战] 增量同步与数据搜索~从入门到精通
[MySQL binlog实战] 增量同步与数据搜索~从入门到精通
453 0