阿里巴巴数据库分库分表的实践(4)

简介: 阿里巴巴数据库分库分表的实践(4)

这时再来看看买家test1在获取订单信息进行页面展现时,应用对于数据库的访问流程就发生了如图的5-11变化。


在有了订单索引表后,应用首先会通过当前买家ID(以图示中test1为例),首先到订单索引表中搜索出test1的所有订单索引表(步骤),因为步骤②SQL请求中带了以buyer_ID的分库分表键,所以一次是效率最高的单库访问,获取到了买家test1的所有订单索引表列表并由DRDS返回到了前端应用(步骤),应用在拿到返回的索引列表后,获取到订单的ID列表(158),在发送一次获取真正订单列表的请求(步骤),同样在步骤SQL语句的条件中带了分库分表键order_ID的列表值,所以DRDS可以精确地将此SQL请求发送到后端包含in列表值中订单ID的数据库,而不会出现全表扫描的情况,最终通过两次访问效率最高的SQL请求代替了之前需要进行全表扫描的问题。


image.png


5-11 基于订单索引表实现买家订单列表查看流程示意


这时你可能会指出,为什么不是将订单的完整数据按照买家ID维度进行一次分库保存,这样就只需要进行一次按买家ID维度进行数据库的访问就获取到订单的信息?这是一个好问题,其实淘宝的订单数据就是在异构索引表中全复制的,即订单按照买家ID维度进行分库分表的订单索引表跟以订单ID维度进行分库分表的订单表中的字段完全一样,这样确实避免了多一次的数据库访问。但一般来说,应用可能会按照多个维度创建多个异构索引表,比如为了避免买家查看自己的订单时频繁进行全表扫描,实际中还会以买家ID的维度进行异构索引表的建立,所以采用这样数据全复制的方法会带来大量的数据冗余,从而增加不少数据库存储成本。


另外,在某些场景中,在获取主业务表的列表时,可能需要依赖此业务表所在数据库的子业务表信息,比如订单示例中的主、子订单,因为是以订单ID的维度进行了分库分表,所以该订单相关的子订单、订单明细表都会保存在同一个数据库中,如果我们仅仅是对主订单信息做了数据全复制的异构保存,还是通过一次对这张异构表的数据进行查询获取包含了子订单信息的订单列表时,就会出现跨库join的问题,其对分布式数据层带来的不良影响其实跟之前所说的全表扫描是一样的。所以我们还是建议采用仅仅做异构索引表,而不是数据全复制,


同时采用两次SQL请求的方式解决出现全表扫描的问题。


实现对数据的异步索引创建有多种实现方式,一种是从数据库层采用数据复制的方式实现;另一种是如图5-12所示在应用层实现,在这一层实现异构索引数据的创建,就必然会带来分布式事务的问题。


image.png


5-12 精卫实现数据同步的流程图这里给大家介绍的是在数据库层实现异构索引的方式,也是阿里巴巴内部目前采用的方式,通过一款名为精卫填海(简称精卫)的产品实现了数据的异构复制。本质上精卫是一个基于MySQL的实时数据复制框架,可以通过图形界面配置的方式就可以实现异构数据复制的需求。除了在同步异构索引数据的场景外,可以认为精卫是一个MySQL的数据触发器+分发管道。


数据从源数据库向目标数据库的过程中,可能需要对数据进行一些过滤和转换,精卫本身的结构分为抽取器(Extractor)、管道(Pipeline)、分发器(Applier),数据从抽取器流入管道,管道中有过滤器可以执行对数据的一些过滤的操作,然后再交由分发器写入到目标,如图5-12所示。


精卫平台通过抽取器(Extractor)获取到订单数据创建在MySQL数据库中产生的binlog日志(binlog日志会记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中),并转换为event对象,用户可通过精卫自带的过滤器(Filter)(比如字段过滤、转换等)或基于接口自定义开发的过滤器对event对象中的数据进行处理,最终通过分发器(Applier)将结果转换为发送给DRDSSQL语句,通过精卫实现异构索引数据的过程如图5-13所示。


虽然精卫平台在系统设计和提供的功能不算复杂,但其实但凡跟数据相关的平台就不会简单。这里不会对精卫核心的组件和机制做更详细的介绍,只是将精卫多年来能力演变后,目前提供的核心功能做一下介绍,为有志在该领域深耕细作的技术同仁多一些思路和借鉴。


image.png


相关文章
|
4月前
|
存储 人工智能 NoSQL
AI大模型应用实践 八:如何通过RAG数据库实现大模型的私有化定制与优化
RAG技术通过融合外部知识库与大模型,实现知识动态更新与私有化定制,解决大模型知识固化、幻觉及数据安全难题。本文详解RAG原理、数据库选型(向量库、图库、知识图谱、混合架构)及应用场景,助力企业高效构建安全、可解释的智能系统。
|
11月前
|
人工智能 前端开发 JavaScript
代码采纳率从 22% 到 33%,通义灵码辅助数据库智能编码实践
通义灵码本质上是一个AI agent,它已经进行了大量的优化。然而,为了更完美或有效地调用模型的潜在能力,我们在使用时仍需掌握一些技巧。通常,大多数人在使用通义灵码时会直接上手,这是 AI agent 的一个优势,即 zero shot 使用,无需任何上下文即可直接使用通义灵码的能力。
|
5月前
|
存储 弹性计算 Cloud Native
云原生数据库的演进与应用实践
随着企业业务扩展,传统数据库难以应对高并发与弹性需求。云原生数据库应运而生,具备计算存储分离、弹性伸缩、高可用等核心特性,广泛应用于电商、金融、物联网等场景。阿里云PolarDB、Lindorm等产品已形成完善生态,助力企业高效处理数据。未来,AI驱动、Serverless与多云兼容将推动其进一步发展。
271 8
|
7月前
|
人工智能 运维 数据挖掘
瑶池数据库Data+AI驱动的全栈智能实践开放日回顾
阿里云瑶池数据库重磅推出“Data+AI能力家族”,包括DTS AI数据准备、Data Agent系列智能体及DMS MCP统一数据访问服务,重构数据与AI协同边界。通过智能化工具链,覆盖数据全生命周期,提升企业数据开发、分析、治理与运维效率,降低技术门槛,激活数据资产价值,助力企业迈向全栈智能新时代。
|
8月前
|
人工智能 运维 数据挖掘
瑶池数据库开放日:全新发布Data+AI能力家族,赋能企业全栈智能实践
近日,阿里云瑶池数据库生态工具产品重磅升级,推出“Data+AI能力家族”,并举办了为期3天的全栈智能实践开放日活动。发布会上首次公开了 “Data Agent for Analytics、Data Agent for Meta、DAS Agent”等瑶池数据库Data Agent系列能力,以工具智能化 × 智能化工具的双引擎重构数据与AI的协同边界,揭秘AI时代数据价值释放的全新路径。
|
11月前
|
数据库
|
5月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
444 158
|
5月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
5月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1040 152