最近搞了个毫秒级返回百亿数据!我都做了啥! 下

简介: 最近搞了个毫秒级返回百亿数据!我都做了啥! 下

PB 级的 ES 准实时索引构建之道

该如何解决呢?仔细观察上面两个问题,其实都是同一个问题,如果我们能实时监听到 db 的字段变更,再将变更的内容实时同步到 ES 和宽表中不就解决了我们的问题了。

怎么才能实时监听到表字段的变更呢?

答案:binlog

来一起复习下 MySQL 的主从同步原理

  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 中事件,将数据变更反映它自己的数据

可以看到主从复制的原理关键是 Master 和 Slave 遵循了一套协议才能实时监听 binlog 日志来更新  slave 的表数据,那我们能不能也开发一个遵循这套协议的组件,当组件作为 Slave 来获取 binlog 日志进而实时监听表字段变更呢?阿里的开源项目 Canal 就是这个干的,它的工作原理如下:

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

这样的话通过 canal 就能获取 binlog 日志了,当然 canal 只是获取接收了 master 过来的 binlog,还要对 binlog 进行解析过滤处理等,另外如果我们只对某些表的字段感兴趣,该如何配置,获取到 binlog 后要传给谁? 这些都需要一个统一的管理组件,阿里的 otter 就是干这件事的。

什么是 otter

Otter 是由阿里提供的基于数据库增量日志解析,准实时同步到本机房或异地机房 MySQL 数据库的一个分布式数据库同步系统,它的整体架构如下:

注:以上是我司根据 otter 改造后的业务架构,与原版 otter 稍有不同,不过大同小异

主要工作流程如下

  1. 在 Manager 配置好 zk,要监听的表 ,负责监听表的节点,然后将配置同步到 Nodes 中
  2. node 启动后则其 canal 会监听 binlog,然后经过 S(select),E(extract),T(transform),L(load) 四个阶段后数据发送到 MQ
  3. 然后业务就可以订阅 MQ 消息来做相关的逻辑处理了

画外音:zookeeper 主要协调节点间的工作,如在跨机房数据同步时,可能要从 A 机房的节点将数据同步到 B 机房的节点,要用 zookeeper 来协调,

大家应该注意到了node 中有 S,E,T,L 四个阶段,它们的主要作用如下

image.png

  • Select 阶段: 为解决数据来源的差异性,比如接入 canal 获取增量数据,也可以接入其他系统获取其他数据等。
  • Extract阶段: 组装数据,针对多种数据来源,mysql,oracle,store,file等,进行数据组装和过滤。
  • Transform 阶段: 数据提取转换过程,把数据转换成目标数据源要求的类型
  • Load 阶段: 数据载入,把数据载入到目标端,如写入迁移后的数据库, MQ,ES 等

以上这套基于阿里 otter 改造后的数据服务我们将它称为 DTS(Data Transfer Service),即数据传输服务。

搭建这套服务后我们就可以通过订阅 MQ 来实时写入 ES 让索引实时更新了,而且也可以通过订阅 MQ 来实现宽表字段的更新,解决了上文中所说的宽表字段更新与原表紧藕合的问题,基于 DTS 服务的索引改进架构如下:

image.png

注意:「build 数据 」这一模块对实时索引更新是透明的,这个模块主要用在更新或插入 MySQL 宽表,因为对于宽表来说,它是几个表数据的并集,所以并不是监听到哪个字段变更就更新哪个,它要把所有商品涉及到的所有表数据拉回来再更新到宽表中。

于是,通过 MySQL 宽表全量更新+基于 DTS 的实时索引更新我们很好地解决了索引延迟的问题,能达到秒级的 ES 索引更新!

这里有几个问题可能大家比较关心,我简单列一下

需要订阅哪些字段

对于 MySQL 宽表来说由于它要保存商品的完整信息,所以它需要订阅所有字段,但是对于红框中的实时索引更新而言,它只需要订阅库存,价格等字段,因为这些字段如果不及时更新,会对销量产生极大的影响,所以我们实时索引只关注这些敏感字段即可。

有了实时索引更新,还需要全量索引更新吗

需要 ,主要有两个原因:

  • 实时更新依赖消息机制,无法百分百保证数据完整性,需要全量更新来支持,这种情况很少,而且消息积压等会有告警,所以我们一天只会执行一次全量索引更新
  • 索引集群异常或崩溃后能快速重建索引

全量索引更新的数据会覆盖实时索引吗

会,设想这样一种场景,你在某一时刻触发了实时索引,然后此时全量索引还在执行中,还未执行到实时索引更新的那条记录,这样在的话当全量索引执行完之后就会把之前实时索引更新的数据给覆盖掉,针对这种情况一种可行的处理方式是如果全量索引是在构建中,实时索引更新消息可以延迟处理,等全量更新结束后再消费。也正因为这个原因,全量索引我们一般会在凌晨执行,由于是业务低峰期,最大可能规避了此类问题。

总结

本文简单总结了我司在 PB 级数据下构建实时 ES 索引的一些思路,希望对大家有所帮助,文章只是简单提到了 ES,canal,otter 等阿里中间件的应用,但未对这些中间件的详细配置,原理等未作过多介绍,这些中间件的设计非常值得我们好好研究下,比如 ES 为了提高搜索效率、优化存储空间做了很多工作,再比如 canal 如何做高可用,otter 实现异地跨机房同步的原理等,建议感兴趣的读者可以之后好好研究一番,相信你会受益匪浅。

巨人的肩膀



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
8月前
|
人工智能 自然语言处理 API
Dify+DeepSeek实战教程:从零搭建企业级AI应用
2025年,AI落地成本成关键。本文以Dify+DeepSeek-R1为核心,详解知识库、智能客服、代码生成、合同审核四大场景,手把手构建企业级AI应用流水线,助力开发者高效低成本实现AI转型。
|
存储 分布式计算 大数据
基于阿里云大数据平台的实时数据湖构建与数据分析实战
在大数据时代,数据湖作为集中存储和处理海量数据的架构,成为企业数据管理的核心。阿里云提供包括MaxCompute、DataWorks、E-MapReduce等在内的完整大数据平台,支持从数据采集、存储、处理到分析的全流程。本文通过电商平台案例,展示如何基于阿里云构建实时数据湖,实现数据价值挖掘。平台优势包括全托管服务、高扩展性、丰富的生态集成和强大的数据分析工具。
|
机器学习/深度学习 传感器 监控
深度解析ISO 50007-结合MyEMS开源系统的能源服务技术实践
在全球能源转型中,满足ISO 50007标准是提升能源服务质量的关键。MyEMS开源能源管理系统提供高效工具,从能效监控到清洁能源整合,助力企业智能化与可持续发展。本文解析其技术细节与实战案例,如某工业园区通过MyEMS优化空压机逻辑节能12%,清洁能源占比提升至65%,年节省成本300万元。未来,MyEMS还将借助AI预测、区块链溯源等技术推动能源服务数字化变革。
180 2
|
存储 弹性计算 缓存
阿里云数据库 SelectDB 版内核 Apache Doris 2.0 如何实现导入性能提升 2-8 倍
Apache Doris 2.0 进一步增强数据导入能力,性能提升 2-8 倍,加速数据实时处理和分析效率!
1484 0
阿里云数据库 SelectDB 版内核 Apache Doris 2.0 如何实现导入性能提升 2-8 倍
|
SQL Java 数据库连接
从理论到实践:Hibernate与JPA在Java项目中的实际应用
【6月更文挑战第25天】在Java持久层,Hibernate与JPA提供ORM及数据库操作简化。JPA是EE规范,定义ORM接口;Hibernate是其实现,功能丰富。在一个在线书店项目中,使用@Entity标注实体类如Book,通过JpaRepository接口(如BookRepository)进行数据访问。服务层调用仓库接口方法,如搜索书籍。当需自定义查询时,可使用JPQL或SQL。Spring的@Transactional注解处理事务管理,展示出高效开发流程。
226 0
|
运维 Linux
1.1 为什么要源码编译
1.1 为什么要源码编译
547 0
|
SQL 关系型数据库 MySQL
|
数据安全/隐私保护 开发工具
|
程序员 数据安全/隐私保护 C语言
学习C语言的必备书籍-从入门到精通
学习好并精通C语言是成为优秀程序员的首要要求,在这里推荐一些学习C语言从小白到高手的必看书籍。也是我几年来收集的一些精华本。
2037 0