阿里巴巴数据库分库分表的实践(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


相关文章
|
1月前
|
弹性计算 安全 关系型数据库
活动实践 | 自建数据库迁移到云数据库
通过阿里云RDS,用户可获得稳定、安全的企业级数据库服务,无需担心数据库管理与维护。该方案使用RDS确保数据库的可靠性、可用性和安全性,结合ECS和DTS服务,实现自建数据库平滑迁移到云端,支持WordPress等应用的快速部署与运行。通过一键部署模板,用户能迅速搭建ECS和RDS实例,完成数据迁移及应用上线,显著提升业务灵活性和效率。
|
30天前
|
存储 数据管理 关系型数据库
数据库分库分表的原因?
分库分表通过减少单库单表负担来提升查询性能。垂直切分按业务耦合度将表或列分布于不同库或表中,减少数据量,优化性能。水平切分则按数据逻辑关系将表分散至多库多表,减小单表数据量,实现分布式处理。选择方式需根据具体需求决定。
58 19
|
4天前
|
运维 监控 Cloud Native
云原生之运维监控实践:使用 taosKeeper 与 TDinsight 实现对 时序数据库TDengine 服务的监测告警
在数字化转型的过程中,监控与告警功能的优化对保障系统的稳定运行至关重要。本篇文章是“2024,我想和 TDengine 谈谈”征文活动的三等奖作品之一,详细介绍了如何利用 TDengine、taosKeeper 和 TDinsight 实现对 TDengine 服务的状态监控与告警功能。作者通过容器化安装 TDengine 和 Grafana,演示了如何配置 Grafana 数据源、导入 TDinsight 仪表板、以及如何设置告警规则和通知策略。欢迎大家阅读。
20 0
|
2月前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
136 3
|
2月前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第21天】本文探讨了MongoDB Atlas的核心特性、实践应用及对云原生数据库未来的思考。MongoDB Atlas作为MongoDB的云原生版本,提供全球分布式、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了云原生数据库的未来趋势,如架构灵活性、智能化运维和混合云支持,并分享了实施MongoDB Atlas的最佳实践。
|
3月前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第20天】本文探讨了MongoDB Atlas的核心特性、实践应用及对未来云原生数据库的思考。MongoDB Atlas作为云原生数据库服务,具备全球分布、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了实施MongoDB Atlas的最佳实践和职业心得,展望了云原生数据库的发展趋势。
|
3月前
|
SQL 存储 关系型数据库
添加数据到数据库的SQL语句详解与实践技巧
在数据库管理中,添加数据是一个基本操作,它涉及到向表中插入新的记录
|
12天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
39 3
|
12天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
42 3
|
12天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
54 2