基于MySql BinLog的增量订阅和消费组件:Canal

  • Cancal是阿里13年1月开源的一个基于MySql数据库Binlog实现的增量订阅和消费的组件。项目取名Canal取自管道的英文单词,流转的医生,是一个定位于基于MySql数据库Binlog增量日志来实现数据库镜像,试试备份和怎梁书记消费的通用组件。
  • 早期的数据库同步业务,大多使用MySql数据库的触发器机制(Trigger)来获取数据库的增量变更,之后逐步阐释基于数据库日志解析来获取数据,再次激起上实现数据同步,由此衍生出了数据库增量订阅和消费业务----Canal项目。

Canal核心思想

  • Canal工作原理比较简单,核心思想就是模拟MySql Slave的交互协议,将字节伪装称为一个MySql的Slave激起,不断向Master发送Dump请求。Master收到Dump后,开始推送对应Binary Log给这个Slave(其实是Canal)。Canal收到Binary log,解析出对应的Binary Log对象后就可以进行二次消费了,基本工作如下:

Canal Server主备切换设计

  • 在Canal的设计中,基于对容灾的设计,会配置两个或者更多的Canal Server负责一个MySql数据库实例的数据增量复制,另外一个方面,为减少CanalServer的Dump请求对MySql Master带来的影响,要求不同Canal Server上的Instance在同一个时刻只能有一个处于Running状态,其他的instance都处于Standby状态,这就使得Canal必须具备主从切换能力,此部分功能利用Zookeeper来完成,如下图:
  • 尝试启动: 每个Canal Server在启动某个Canal instance的时候,都会首先向Zookeeper进行一次阐释启动判断,都想Zookeeper创建同一个临时节点,那个Canal Server创建成功,就让哪一个启动。以“example”这个instance为例,都创建“/otter/canal/destinations/example/running”节点,Zookeeper保证只有一个成功
  • 启动instance: 假设最终IP:10.1.12.211的Canal Server成功创建,会将字节机器信息写入节点中,并同时启动instance,其他CanServer会将字节状态设置Standby同时对成功节点注册Watch监听,以监听节点变化情况。成功节点注册数据如下:
{"active":true,"address":"10.1.12.211:11111","cid":1}
  • 主备切换:CanalServer在运行过程中,发送异常,因为创建的是Zookeeper的临时节点,当Running状态的CanalServer挂点或者网络原因断开,那么“/otter/canal/destinations/example/running”节点就会在一段时间后消失。其他Standby状态的CanalServer已经添加过Watch,因此会接受到Zookeeper发来的通知,重复1 步骤以此实现主备切换

  • 特殊设计:Canal设计中,当有那种服务器网络闪断的假死清,导致Zookeeper任务其会话失效,此时其实CanalServer对应JVM并没有退出,状态正常,CanalServer做了一个策略:

    • 状态为Standby的CanalServer收到Running节点释放的通知后,会延迟一段时间抢占Running节点,而原来的Running状态的instance不需要等待直接获取Running节点。这样就尽可能保证瞬时假死情况下不需要切换避免了五位的资源释放和重新分配,目前延迟时间是5秒,即Running节点针对假死状态的保护器为5秒

Canal Server的HA设计

  • Canal Servers进行数据消费钱,需要找到Master的CanalServer节点,在上文中已经讲了,针对每一个数据复制实例,例如example,都会在“/otter/canal/destinations/example/running” 节点记录正在运行的CanalServer,所有CanalServer链接Zookeeper后读取这个节点信息即可
  1. 从Zookeeper中读取当前处于Running状态的server:CanalClient启动会首先从“/otter/canal/destinations/example/running” 节点读取当前Running状态的Server,同时客户端也会将字节的信息注册到Zookeeper的“/otter/canal/destinations/example/1001/running” 下面,其中1001目录层级是代表客户端唯一标识节点内容如下:
{"active":true,"address":"10.1.12.211:50544","clientId":1001}
  1. 注册Running节点数据变化的监听: 由于CanalServer有挂掉的风险,CanalClient还会对“/otter/canal/destinations/example/running”节点注册一个监听,一旦server主备切换,Client随时能感知到。
  2. 链接对应RunningServer进行数据消费。

数据消费点位记录

  • 由于存在CanalClient重启或者其他变化,为避免数据消费顺序错乱,Canal必须对数据消费点位进行实时的记录,也就是记录下本次读取到的Binlog日志到第几行了,数据消费后,CanalServer会在Zookeeper上记录当前最后一次消费成功的Binarylog点位,一旦发生Client重启,只需从这个点位后一个点位开始消费,具体做法如下:
  • 在Zookeeper的“/otter/canal/destinations/example/1001/cursor”节点中记录下客户端消费的详细点位信息:
  • 具体内容如下:
{"@type":"com.alibaba.otter.canal.protocol.position.LogPosition","identity":{"slaveId":-1,"sourceAddress":{"address":"10.21.16.8","port":3306}},"postion":{"gtid":"","included":false,"journalName":"mysql-bin.004073","position":82751773,"serverId":109065,"timestamp":1589508966000}}

上一篇Zookeeper–Watcher机制源码剖析二
下一篇Zookeeper实践与应用-- Nginx负载均衡差异

Zookeeper实践与应用- Canal相关推荐

  1. Zookeeper实践与应用-- Nginx负载均衡差异

    Nginx/ZooKeeper 负载均衡的差异 Nginx 是我们常见的反向代理服务器,也被广泛的用作负载均衡服务器 ZooKeeper是分布式协调服务框架,有时也被用来做负载均衡 Nginx Ngi ...

  2. Zookeeper实践与应用--分布式锁实现

    分布式锁 分布式锁是控制分布式系统之间同步访问资源的一种方式,如果不同系统是同一个系统的不同主机之间共享一个或一组资源,那么访问这些资源的时候,往往需要通过一些呼哧手段来防止彼此之间的干扰保证统一性, ...

  3. Flink 最佳实践之使用 Canal 同步 MySQL 数据至 TiDB

    摘要:本文将介绍如何将 MySQL 中的数据,通过 Binlog + Canal 的形式导入到 Kafka 中,继而被 Flink 消费的案例.内容包括: 背景介绍 环境介绍 部署 TiDB Clus ...

  4. Zookeeper--Watcher机制源码剖析二

    Watcher触发 我们从实际操作时候的表现来看Watcher的触发,比如Zookeeper中NodeDataChanged时间的触发是"Watcher监听的对应数据节点的数据内容发生变更& ...

  5. 基于Canal+kafka监听数据库变化的最佳实践

    1.前言 工作中,我们很多时候需要根据某些状态的变化更新另一个业务的逻辑,比如订单的生成,成交等,需要更新或者通知其他的业务.我们通常的操作通过业务埋点.接口的调用或者中间件完成. 但是状态变化的入口 ...

  6. ZooKeeper 源码和实践揭秘

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:runnerzhang,腾讯 CSIG 后台开发工程 ...

  7. 干货 | ZooKeeper 源码和实践揭秘

    精选30+云产品,助力企业轻松上云!>>> 摘要:ZooKeeper 是个针对大型分布式系统的高可用.高性能且具有一致性的开源协调服务,被广泛的使用.对于开发人员,ZooKeeper ...

  8. canal+zookeeper+mysql高可用配置

    一.部署环境 1.基础环境: 软件 版本 作用 Linux Centos7.1,8g Jdk 1.8.0_151 canal 1.1.1 canal server端,与mysql和zookeeper交 ...

  9. Greenplum 实时数据仓库实践(6)——实时数据装载

    目录 6.1 建立数据仓库示例模型 6.1.1 业务场景 1. 操作型数据源 2. 销售订单数据仓库模型设计 6.1.2 建立数据库表 1. 在MySQL主库中创建源库对象并生成测试数据 2. 在Gr ...

最新文章

  1. HTML和javascript 第二天
  2. mycat schema.xml 配置文件详解
  3. poj 2115 C Looooops(扩展欧几里德算法)
  4. python模块大全使用说明_python模块详解
  5. Java Spring MVC框架搭建(一)
  6. centos 6.5 openldap php,centos6.5安装openldap+phpldapadmin
  7. JavaScript玩转机器学习:​​​​​​​训练模型
  8. Django Navi 重用
  9. scintilla下载地址及scintilla文档教程
  10. SQL Server 计算年龄函数
  11. 循环冗余校验码CRC
  12. 【考前必读】致PMI项目管理认证系列考试考生
  13. css3练习——手风琴图片
  14. python读取txt文档乱码解决
  15. 让IE6,IE7,IE8共存
  16. 计算机无法连接到手机热点,电脑搜不到手机的热点是为什么_电脑无法发现手机热点的处理方法...
  17. python 行列式_python 中leastsq 中的雅可比行列式的作用是什么
  18. 自动化测试QQ邮箱登录【问题及完整测试代码】
  19. 2021高考成绩查询激动,2021高考成绩几天公布 什么时候可以查分
  20. Django框架之入门介绍

热门文章

  1. Android插件化开发基础之Java动态代理(proxy)机制的简单例子
  2. 2560x1600分辨率高吗_做设计还弄不清分辨率和像素之间的关系,来了解下他们是怎么换算...
  3. redhat yum 安装 mysql_Redhat 7 下Mysql8.0.19安装配置图文详解(配合使用 centos YUM源)...
  4. 软件与硬件我该选哪个_MacBook Air 和 MacBook Pro 该选哪个……?
  5. JavaWeb应用开发实验报告下载(共12个)
  6. 世界上最热的地方在哪里?原来火焰山不是第一...
  7. 开车走吗?朋友......
  8. 讲100个科学道理,不如做这些有趣的理科实验!
  9. 《SAS编程与数据挖掘商业案例》学习笔记之七
  10. sql not exists用法_SQL Server 2012 高级用法(一)