实现原理

DDM作为数据库中间件,将底层数据库存储引擎以集群方式管理起来,用户使用非常方便。

应用程序不需要关心具体有多少分片。类似操作单机数据库,用户通过DDM管理控制台进行数据库运维,使用JDBC等驱动服务或SQL客户端连接数据库,进行数据读写。

DDM服务的业务架构如下图所示。

图1 DDM业务架构
说明:
  • 开发者通过DDM管理控制台申请DDM实例、创建逻辑库、逻辑表和DDM账号,完成数据库中间件的部署。
  • 开发者将开发的应用服务部署在与DDM相同VPC下的弹性云服务器上。
  • 应用服务与DDM建立连接,在用户访问过程中,应用服务通过DDM进行数据读写操作。
  • 数据库管理员通过DDM管理控制台进行数据库运维。
  • RDS实例需要由用户在华为云RDS服务上购买,购买后导入到DDM服务中。
  • DDM在创建逻辑库时,需要将RDS实例关联到逻辑库。

以下对DDM几处重要的功能进行详细介绍。

数据分片

分片是解决数据库存储容量限制的直接途径。分片包括垂直分片与水平分片两种方式。

  • 垂直分片

    垂直分片又叫纵向分割,即以逻辑表为单位,把原有数据库切分成多个数据库。切分后不同的表存储在不同的数据库上。

    垂直分片与业务架构设计有密切的联系。比如从业务领域对系统进行架构优化,分成多个子业务系统,各个子业务系统耦合度较低。子业务系统间以接口方式进行数据通信和数据交换。

    图2 垂直分片示意图

    垂直拆分后业务清晰,拆分规则明确,系统之间容易整合与扩展。一般用于数据库上层架构设计。

  • 水平分片

    水平分片又叫横向分割,即以逻辑表中的数据行记录为单位,把原有逻辑数据库切分成多个物理数据库分片,表数据记录分布存储在各个分片上。

    水平分片主要用业务架构无法继续细分,而数据库中单张表数据量太大,查询性能下降的场景。通过水平分片,即解决单库容量问题,同时提高并发查询性能。

    图3 水平分片示意图

    DDM实现了自动水平分片,应用无需关心某个数据该存储在哪一块分片上。

    对逻辑表水平分片需要依据一定的分片规则,例如一个订单跟踪系统(见图3),我们选取订单号(OrderId)作为拆分键,分别对“订单流水表”、“订单详情表”以及“物流跟踪表”进行水平拆分,拆分算法以Hash为例,对拆分键的值Hash后求模,分片计算规则如下:

    H(Key(OrderId)) = Hash(Key(OrderId))%N

    其中,N表示一共有N个数据分片,H(Key(OrderId))表示该订单经过订单号Hash并求模后存储的分片编号。

    图4 分片后数据存储示意图
    说明:

    除了Hash拆分算法外,DDM当前还支持选择Range和日期函数对数据进行拆分,详细信息请参见创建逻辑表

路由分发

路由分发与水平分片同为DDM的基础功能。

在分布式数据库中,路由的作用即将SQL语句进行解析,并转发到正确的分片上,保证SQL执行后得到正确的结果,并且节约QPS资源。

例如:订单支付系统包含了shard0、shard1、shard2三个分片,订单号2017010112345678的订单数据存储在shard0分片上,则应该将以下语句路由分发到shard0分片上执行。

select Customer, OrderStatus, CreateDate from Order

where OrderId = '2017010112345678';

如果同时路由到shard0、shard1、shard2三个分片,会造成多余的查询,浪费资源;如果路由到shard1、shard2分片,则得不到正确的返回结果。

DDM对单张表的路由解析流程如下:

图5 单张表的路由解析流程

读写分离

数据库中对计算和缓存资源消耗较多的往往是密集或复杂的SQL查询。当系统资源被查询语句消耗,反过来会影响数据写入操作,进而导致数据库整体性能下降,响应缓慢。因此,当数据库CPU和内存资源占用居高不下,且读写比例较高时,可以为数据库添加只读实例。

添加只读实例的作用有以下:

  • 将查询非事务性查询SQL路由到只读实例中执行,主实例上执行事务性SQL,在很大程度上缓解主实例上的S锁与X锁的竞争。
  • 对只读实例上的表可配置不提供事务支持的数据库引擎,进而提升查询效率。
  • 增加只读实例,也相当于数据库横向扩展,直接增加负载能力,同时增加数据冗余,确保数据库高可用。

DDM服务实现了自动读写分离,用户购买了RDS只读实例后,将只读实例信息同步到DDM中即可,无需再做其他配置。

同时,DDM支持用户在SQL中自定义读写分离策略,具体用法请参考如何实现读写分离

图6 读写分离示意图
说明:

DDM会在一个RDS实例上创建多个分片。

为了方便描述,上图假设一个DDM实例在RDS实例上只创建一个分片。

平滑扩容

随着业务增长,逻辑库存储空间不足,并发压力较大,此时可对DDM实例逻辑库进行平滑扩容,通过增加RDS实例来提高数据存储能力与并发支持能力。

平滑扩容是一种水平扩容方式,通过增加RDS实例的数量来提升总体数据存储容量,把分库平滑扩容到新增加的RDS实例上,保证所有的数据都是均衡分布在每个分库上,降单个RDS实例的处理压力。

平滑扩容使用限制如下:

  • RDS实例与DDM实例需要在相同VPC,且RDS实例没有被其它DDM实例使用。
  • 逻辑库下必须有表才能进行平滑扩容。
  • 实例存在节点故障情况下不能进行扩容。
  • 一个DDM实例内,只允许同时对一个实例逻辑库进行平滑扩容操作;不同的DDM实例内,可以同时扩容实例逻辑库。
  • 不允许使用正在扩容中的RDS实例进行建库建表操作。
  • 最多仅支持扩容50个RDS实例。
  • 扩容最大规格为:
    • 每个分片不超过20张表。
    • 每张表不超过800万数据。

平滑扩容原理如图7所示。

图7 平滑扩容原理

进入社区