淘宝DRDS/TDDL是阿里巴巴自主开发的阿里分布式数据库服务。这篇文章将继续为大家介绍DRDS/TDDL的功能特征:
1、数据碎片
DRDS的基本原理是分片,即数据分片。将单个数据库的数据拆分成多个单个数据库,以保持对外的逻辑一致性。拆分的后端数据库是子数据库,相应的表称为子表。每个子数据库负责阅读和写作一个数据,分散了整个访问压力。当系统容量扩大时,DRDS系统的整体容量只能通过横向增加子数据库的数量和迁移相关数据来提高。
对于数据分割,需要选择分割纬度,这是数据分布的基础。例如,对于用户订单信息表,如果数据按照订单ID进行分割,则同一订单ID的数据将被分割到同一阿里分布式数据库storage节点;如果数据按用户ID分割,同一用户的订单将被分发到同一数据库存实例的存储节点。
分割纬度的选择非常重要。一般来说,拆分按钮应根据实际业务场景进行选择。总的指导原则是尽可能保证每个数据库节点的数据量和负载更加均衡。单个SQL操作应尽可能在单个数据库节点执行,不同SQL的查询应在不同的阿里分布式数据库节点执行。这样可以减少多个节点之间的网络传输,保持分布式查询的效率,平衡负载,便于扩展。
2、平滑扩展
数据库扩展是数据库操作和维护中常见的操作。当数据库的数据存储容量不足时,传统的单机数据库需要增加单机的存储空间,以支持更多的数据写入。然而,随着数据的膨胀,基础数据的增加必然会降低查询效率。同时,随着数据量的增加,数据库的访问压力通常会翻倍,导致单机数据库的连接数达到极限。此时,单机数据库需要升级硬件规格,使用磁盘阵列,使用高端存储介质设备和更高端的小型移动服务器来承担数据的一致性。
通过增加更多的底层数据库实例,DRDS的分布式结构可以通过平滑扩展来解决上述问题,从而实现整体集群扩展。
顺利扩展的前提是用户需要根据上述子数据库和子表逻辑将逻辑数据库拆分为多个物理子数据库,不同的子数据库落在不同的底层物理数据库机上。子数据库和子表的数量通常建议用户预测未来3-5年数据量的增加,并根据这个数据量计算整个数据应该分成多少个子数据库,因为单个子数据库的数据量通常有一个建议值,这将导致单个节点的性能下降。有了具有特定数量的子数据库,数据库可以根据子数据库的逻辑将数据转移到不同的存储实例节点。
扩展过程实际上是物理数据迁移的过程。引擎层首先根据子数据库迁移后的逻辑在物理节点上建立新的子数据库,然后预留一个时间点进行全数据迁移。完全迁移后,增量数据将根据之前预留的时间点开始捕获。当增量数据几乎与两侧数据相同时,数据库会瞬间停止写入,最后一个数据会被捆绑。引擎层切换数据库划分逻辑的路由。路由规则切换后,核心扩展逻辑完成,整个切换过程在毫秒内完成。
为了保证数据本身的安全性,方便滚动和回滚,在路由标准切换后,逻辑子库数据在迁移前后会实时同步,原始子库数据只有在业务确认后才能清理干净。
上层业务接入在整个扩展过程中几乎没有注意到,这是一个完全平滑的扩展。但要尽量注意阿里分布式数据库中的扩展操作,尤其是写低期,避免切换时数据追赶时间过长。
3、MySQL分布式执行引擎
分布式数据库的数据定期存储在多个底层存储实例中,数据物理存储的变化会导致与原始数据库引擎的不兼容性。单个数据库的所有数据读写和计算都在单个物理机器上进行,数据状态保持在单个机器上,主要性能消耗在于磁盘的数据读取。在分布式架构下,数据和状态需要在多个数据库实例、底层实例和代理之间传输,这将导致网络I/O消耗,网络I/O的性能消耗远远大于本地磁盘I/O和本地计算。
因此,分布式SQL引擎的主要目标是实现与单机数据库SQL引擎的完全兼容,实现SQL的智能推送。它可以智能分析SQL,分析哪些SQL可以直接发送,哪些SQL需要优化转换,哪些需要优化转换,哪些实例节点可以执行路由,充分发挥阿里分布式数据库instance的所有能力,减少网络之间的数据传输,最终将少量不同实例处理的结果数据汇总回到应用调用者手中。这就是分布式SQL引擎的智能推送功能。