Ali Canal 实现 MySQL 数据采集转储

栏目: 数据库 · 发布时间: 6年前

Ali Canal 实现  <a href='https://www.codercto.com/topics/18746.html'>MySQL</a>  数据采集转储

微信公众号: [深广大数据Club]

关注可了解更多大数据相关的咨询。问题或建议,请公众号留言;

[如果你觉得深广大数据Club对你有帮助,欢迎赞赏]

近期接触的比较多的关于mysql数据实时采集转储,以及后续计算分析的项目,这里对使用到的canal框架进行介绍、基于canal框架的架构设计以及升级canal1.1.0之后的架构优化。

Ali Canal 实现 MySQL 数据采集转储

ali canal介绍

canal 是阿里巴巴mysql数据库binlog的增量订阅&消费组件。早起是为了解决ali跨机房同步的需求。canal分内部版本以及外部版本,外部版本即开源版本,仅支持mysql以及mysql核心(mariadb)5.7及以下的版本.

基于日志增量订阅&消费支持的业务:

  • 数据库镜像

  • 数据库实时备份

  • 多级索引 (卖家和买家各自分库索引)

  • search build

  • 业务cache刷新

  • 价格变化等重要业务消息

工作原理

mysql主备复制实现

Ali Canal 实现 MySQL 数据采集转储

从上层来看,复制分成三步:

master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events,可以通过show binlog events进行查看);

slave将master的binary log events拷贝到它的中继日志(relay log);

slave重做中继日志中的事件,将改变反映它自己的数据。

canal的工作原理

Ali Canal 实现 MySQL 数据采集转储

原理相对比较简单:

  • canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议

  • mysql master收到dump请求,开始推送binary log给slave(也就是canal)

  • canal解析binary log对象(原始为byte流)

架构设计

需求

其实需求很简单,我们需要将数据从mysql抽取,将数据存储到kafka中,提供给后续程序的存储或者分析计算,但是时效性上要求实时。

需求分析

根据上述的需求理解,在做整体设计的时候,从kafka获取数据进行计算存储这块已经比较成熟了,所以我们更多的是要解决前面的从mysql采集数据存放到kafka的问题。

从mysql获取数据,整体来说有两种方法:

  • 第一种,可以直接从mysql读取新数据,不过这个方法一方面你要去判断新数据是否为新数据,另一方面还要考虑这种读取方法是否会对其他用户的访问造成影响,还有就是要做到实时很难。

  • 第二种,通过解析mysql binlog方式来解决实时数据抽取存储的问题,canal则可以满足这一点,不过canal无法直接存储到kafka中,需要通过其他手段将数据存入到kafka中

架构图

Ali Canal 实现 MySQL 数据采集转储

上图中,mysql数据通过binlog机制,生成binlog文件,通过canal进行binlog的解析,将数据通过canal source传入到flume,再通过flume写入到kafka,然后再提供给后续程序的存储以及分析计算。这里就不画的那么详细了,我们的重点放在前面的数据采集。其中canal source是需要自己自定义开发的canal source插件。

我们的标题中提到了要对上述架构的优化,其实这个优化主要由于canal新版本发布提供的一些很给力的功能,让我们的整体框架上得到了较好的改进,接下来我们先看下canal新版的介绍。

canal 1.1.0介绍

重要功能优化

  • 整体性能测试&优化,提升了150%.

  • 表结构TSDB相关问题全部修复(比较多的是DDL语法解析兼容性)

  • 基于bio修复binlog长时间无数据导致的半开链接无法恢复

功能新增

  • 原生支持prometheus监控

  • 原生支持kafka消息投递

  • 原生支持aliyun rds的binlog订阅 (解决自动主备切换/oss binlog离线解析) 参考: 【Aliyun RDS QuickStart】

  • 原生支持 docker 镜像

  • MySQL gtid模式订阅支持

  • MySQL XA binlog事件

  • Mysql Show Slave Hosts状态支持

基于canal 1.1.0的架构优化

其实这里我们最关注的功能其实是对于kafka的支持,因为在我们前面的架构设计过程中,由于数据从canal抽取之后无法直接存入kafka,所以需要我们自己读取数据写入到kafka中,有了这个功能我们可以大大简化我们的前期数据采集存储流程。

优化后架构图

Ali Canal 实现 MySQL 数据采集转储

采用canal1.1.0之后,整体架构就变成上图的样子,优化了从canal-flume-kafka的中间环节,直接通过canal写入到kafka topic中。整体优化之后我们既不需要自定义开发canal flume source,也不需要考虑使用flume过程中遇到的问题。

赞赏

如果你觉得到深广大数据Club对你有帮助,欢迎赞赏,有你的支持,我们一定会越来越好!

Ali Canal 实现 MySQL 数据采集转储


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Eloquent JavaScript

Eloquent JavaScript

Marijn Haverbeke / No Starch Press / 2011-2-3 / USD 29.95

Eloquent JavaScript is a guide to JavaScript that focuses on good programming techniques rather than offering a mish-mash of cut-and-paste effects. The author teaches you how to leverage JavaScript's......一起来看看 《Eloquent JavaScript》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具