网站首页 > 技术文章 正文
本文作者:珍爱网技术团队 二爷
随着公司业务的不断发展,公司对于实时报表的需求越来越旺盛,原则上来说,实时报表最好的实现方式的通过Spark,storm这类的技术去支撑,由于人手原因,并不能很好的支撑业务,所以,只能靠我们自己去实现,传统的做法的话,通过业务埋点,上报数据的方式,然后再对数据做一些汇总,统计是可以满足我们的需求的,但是埋点方式最大的痛点就是容易遗漏,新增一个业务或者改动业务的时候非常容易忘记埋点,导致报表的需求不正确,所以我们想要一个无埋点的方式来实现这种需求,再经过技术调研之后,发现canal完美的符合我们的需求。
canal简介
canal是基于数据库增量日志解析,提供增量数据订阅和消费的中间件,它主要工作原理是模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议,收到binlog后将binlog解析成Java对象,提供给业务使用.
整体架构
- canal向Mysql发送dump命令,并开始下载binlog
- Binlog parser模块负责将binlog进行解析
- EventSink将解析的binlog进行过滤,加工
- EventStore将binlog存储
- Zookeeper负责存储消费位点等meta信息
BinlogParser
- canal在获取了数据库的链接后,模拟成Slave(详细可以去了解下Mysql的主从协议,canal只是实现了部分主从同步的协议),像主库发送BINLOG_DUMP命令,主库收到之后开始推送Binlog
- 从zk拿到上次同步位置后,通过Binlog Parser解析binlog
- 将解析到的binlog传递给EventSink处理,同时记录binlog解析位点
- 如果有配置从库,当主库挂了后,会自动从从库获取binlog
EventSink
EventSink主要有以下几个功能:
- 数据过滤:支持通配符,正式表达式过滤掉binlog,减轻客户端的压力
- 数据归并:解决分库分表之后数据合并问题
- 数据加工:在进入到store之前进行额外的处理,比较join
- 数据路由:解决一个parse多个store的问题
EventStore
用来储存解析出来的binlog,目前只实现了Memory内存(数据放内存已经足够了,因为位点信息放到zk,基本不会丢失数据),通过RingBuffer设计,提升了数据读取效率。定义了3个cursor:
- Put: Sink模块进行数据储存最后一次写入位置
- Get: 数据订阅最后一次提取的位置
- Ack: 数据消费成功最后一次消费位置
实战
在了解了Canal的原理之后,我们来看看珍爱网用Canal做了哪些事情
- 实时报表
- 通过canal来触发时间,对数据进行加工处理后,写入到结果表,延迟可以控制在S级
- 数据同步
- 因为业务的需求,我们的表设计是有一些冗余的字段,但是冗余的字段带来的问题是运维困难,通过canal来实现冗余字段的维护,极大了减轻了维护的成本
- 公司企业业务部门需要使用我们实时的业务数据,通过canal同步,完美解决这个问题
canal的客户端本身来说还不是很完善,为了提升开发效率,我们对canal的客户端进行了一层封装,整体架构如下:
- 通过canal集群拿到解析好的binlog日志
- 每个需要使用binlog的工程都有一个单独的data-sync模块,专门来消费canal的日志,并将日志投递到消息服务器(RocketMQ)
- 业务去订阅MQ消息,来完成各种消息处理
遇到的问题
- canal在监控这块比较弱,在项目刚上线的时候,经常会出现canal挂了然后没人知道,运行了好久才发现数据有问题,于是我们对canal进行了监控,主要原理是通过获取canal的消费位点,跟主数据库的position进行对比,如果大于一定的阈值,则进行告警。
- 最开始的时候没有引入分布式消息队列,通过本地队列的方式+dubbo远程调用来做,消息入本地队列后我们就ack了,如果这段时间重启机器会导致binlog丢失,并且如果dubbo接口比较耗时,会导致canal的延迟比较大
拓展
otter是基于数据库增量日志解析,准实时同步到本机房或异地机房的mysql/oracle数据库的 一个分布式数据库同步系统。
原理描述:
- 基于Canal开源产品,获取数据库增量日志数据。什么是Canal, 请点击
- 典型管理系统架构,manager(web管理)+node(工作节点)
- manager运行时推送同步配置到node节点
- node节点将同步状态反馈到manager上
- 基于zookeeper,解决分布式状态调度的,允许多node节点之间协同工作.
- 通过界面配置化的方式轻松实现不通数据库实例之间的数据同步,并且支持自定义同步功能,目前otter在珍爱通的应用场景主要是:
- 应用重构的时候,新老数据库集群间的数据同步
- 不通业务之间的数据同步
原文来自:珍爱网技术团队。
关注TechTree,关注互联网一线大厂技术干货。
猜你喜欢
- 2024-11-01 Canal数据同步实战 数据同步工具有哪些
- 2024-11-01 支持断点续传的数据库同步服务 断点续传需要服务器支持吗
- 2024-11-01 Oracle OGG 单向DDL同步 oracle ogg双向同步
- 2024-11-01 MySQL 到 Hazelcast Cloud 实时数据同步实操分享
- 2024-11-01 用Spark实现高并发数据同步 spark并行
- 2024-11-01 PostgreSQL中使用FDW+MV玩转数据同步
- 2024-11-01 mysql:Otter跨机房数据同步(单向)
- 2024-11-01 「数据库」 如何解决异地机房的数据同步问题?
- 2024-11-01 阿里数据同步工具Otter和Canal简介
- 2024-11-01 DataX-Web - 可视化分布式数据同步工具
你 发表评论:
欢迎- 633℃几个Oracle空值处理函数 oracle处理null值的函数
- 626℃Oracle分析函数之Lag和Lead()使用
- 614℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 608℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 606℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 598℃【数据统计分析】详解Oracle分组函数之CUBE
- 588℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 572℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- oracle 19cOCM认证有哪些内容(oracle认证ocm月薪)
- Oracle新出AI课程认证,转型要持续学习
- oracle 表的查询join顺序,可能会影响查询效率
- Oracle DatabaseAmazon Web Services正式可用,Oracle数据库上云更容易了
- Oracle 19.28 RU 升级最佳实践指南
- 汉得信息:发布EBS系统安装启用JWS的高效解决方案
- 如何主导设计一个亿级高并发系统架构-数据存储架构(三)
- Java 后端开发必看!工厂设计模式轻松拿捏
- ORA-00600 「25027」 「x」报错(抱错孩子电视剧 爸爸是武术 另一个爸爸是画家)
- 新项目终于用上了jdk24(jdk新建项目)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)