DRDS

分布式关系型数据库服务(Distributed Relational Database Service,简称 DRDS)专注于解决单机关系型数据库扩展性问题,具备轻量(无状态)、灵活、稳定、高效等特性,

DRDS 兼容 MySQL 协议和语法,支持分库分表、平滑扩容、服务升降配、透明读写分离和分布式事务等特性,具备分布式数据库全生命周期的运维管控能力。

DRDS 主要解决了以下问题:

  • 单机数据库容量瓶颈: 随着数据量和访问量的增长,单机数据库会遇到很大的挑战,依赖硬件升级并不能完全解决问题。
  • 单机数据库扩展困难:传统数据库容量扩展往往意味着服务中断,很难做到业务无感知或者少感知。
  • 传统数据库使用成本高: 当业务数据和访问量增加到一定量时,传统数据库需要依赖特定的高端存储和小型机设备,成本曲线快速上升。

注意:

  • 如果 DRDS 实例为专享实例,默认只提供内网地址,建议使用相同地域 的 ECS 安装 MySQL 命令行连接。
  • 如果 DRDS 实例为共享实例,可以使用其公网地址,从外网机器或者办公机器进行连接使用
  • 已有的共享实例上的 DRDS 的逻辑库元信息可以随时自助迁移到指定专享实例,无需重新导入数据即可快速完成从共享实例到专享实例的迁移。

创建类型对应使用 DRDS 的不同方式。

  • 拆分:即分库分表,将数据按照拆分规则分拆到多个库表中,由 DRDS 代理 SQL 执行。拆分涉及到数据导入导出、SQL 功能/性能测试和改造,对应用功能和性能会有一定的影响。
  • 非拆分:将已有的 RDS 数据库交由 DRDS 进行代理访问,实现读写分离的功能。无需进行数据导入,无需修改程序代码,修改数据库连接串和用户名密码即可。

名词解释

DRDS

DRDS(Distributed Relational Database Service)是阿里巴巴自主研发,高度兼容 MySQL 协议和语法的分布式关系型数据库服务中间件。

DRDS 服务节点(DRDS Server)

DRDS Server 是 DRDS 核心组件,提供 SQL 的解析、优化、路由和结果归并。

DRDS 实例

DRDS 实例是由一组 DRDS Server 节点组成的分布式数据库服务集群。各服务节点无状态,同时处理 SQL 请求。

DRDS 实例规格

DRDS 实例规格是 DRDS 实例处理能力体现,按照 CPU 和 内存提供不同的规格的实例,规格越高处理能力越强。如 4Core8G 和 8Core16G,在标准的 DRDS 测试场景下,后者的处理能力是前者的两倍。

实例升降配

DRDS 可以通过改变实例规格来改变处理能力,提升实例规格称为升配,降低实例规格称为降配。

水平拆分

水平拆分是将一个单机数据库拆分为多个物理分库,将数据库中的表数据按照拆分规则,拆分为多个物理分表,存储到不同的数据库分库上的过程。

拆分规则

水平拆分过程中将逻辑数据库表拆分为多个物理分表规则称为拆分规则。

拆分键

水平拆分过程中,生成拆分规则的数据库字段称为拆分键。

分库

DRDS 水平拆分后,逻辑数据库数据存储在多个物理存储实例上,每个存储实例上的物理库称为分库。

分表

DRDS 水平拆分后,每一个分库上的物理数据表称为分表。

逻辑 SQL

由应用端发送到 DRDS 的 SQL 称为逻辑 SQL。

物理 SQL

由 DRDS 对逻辑 SQL 进行解析之后发送到 RDS 上执行的 SQL 称为物理 SQL。

透明读写分离

DRDS 的单个存储实例节点遇到访问瓶颈时,可通过增加只读实例来分担主实例的压力。DRDS 的读写分离功能不需要修改任何应用代码,称为透明读写分离。

非拆分模式

DRDS 支持不进行数据库水平拆分而仅通过 DRDS 提供的透明读写分离来扩展数据库的服务能力。这种模式称为非拆分模式。

平滑扩容

DRDS 可通过增加存储实例节点完成数据库的扩容。扩容不影响原有数据的正常访问,称为平滑扩容。

小表广播

DRDS 将一些数据量小且更新频度不高的数据表存储为单表模式,这些数据表称为小表。通过数据同步将小表复制到与之 JOIN 的分库上进而提升 JOIN 效率的解决方案称为“小表广播”或者“小表复制”。

全表扫描

数据库拆分模式下,如果 SQL 语句中没有指定拆分键,DRDS 将在所有分表上执行 SQL 并归并结果返回,这个过程称为全表扫描。为避免影响性能,用户应尽量避免全表扫描。

全局唯一数字序列(DRDS Sequence)

DRDS 全局唯一数字序列(64位数字,对应 MySQL 中 BIGINT 类型)的主要目标是为了保证所定义唯一字段中的数据的全局唯一(比如 PRIMARY KEY,UNIQUE KEY 等)和有序递增。

DRDS 自定义注释(DRDS Hint)

DRDS 提供的自定义注释,用于指定一些特殊行为,通过相关的语法影响 SQL 的执行方式,从而对 SQL 进行特殊的优化。

数据导入

  • 当待导入的数据量比较小时,如总数据量少于500万条,可以使用 mysqldump 等工具导出数据,再使用 MySQL source 命令将数据导入到 DRDS 数据库里。具体示例请参考数据导入与导出文档。
  • 当数据量较大时,可以通过 DRDS 控制台导入数据。
  • 数据导入是通过阿里云 DTS 服务实现,具体操作可以参考数据导入操作。在选择目标库时,实例类型选择 DRDS。
    注意:通过 DTS 数据迁移到 DRDS,不支持结构导入,请先在 DRDS 库上建表。
  • 通过 DTS 向 DRDS 导入数据时,由于记录含有主键 ID,会导致 DRDS Sequence 无法变更,产生导入数据主键 ID 值领先于 DRDS Sequence 当前值,从而引起主键冲突的情况。为了避免出错,需要修改 Sequence 起始值,方法可参考 Sequence 修改。

以下转载自:
DRDS的基础原理是Sharding,即数据分片,是典型的水平扩展分布式数据库模型,和传统单机数据库share anything架构不同,DRDS采用的是share nothing架构。

DRDS主要解决单机数据库容量瓶颈,单机数据库扩展困难,传统数据库使用成本高的问题,是高性价比,低运维成本的分布式数据库。主要场景是大规模在线数据操作,如 : 高并发实时交易,海量数据存储和访问,数据库云上备份容灾。

DRDS兼容MySQL协议和语法,支持分库分表、平滑扩容、服务升降配、透明读写分离,分布式事务,分布式数据库生命周期管理。

share nothing架构核心思路利用普通的服务器,将单机数据拆分到底层的多个数据库实例上,通过统一的Proxy集群(DRDS 节点)进行SQL解析优化、路由和结果聚合,对外暴露简单唯一的数据库链接。

DRDS不支持Mysql视图、存储过程、跨库外键和级联删除,不支持自定义数据类型、流程控制类语句、自定义函数。

DRDS实例是由一组DRDS Server节点和底层存储组成的分布式集群,分为共享实例(规格只有8Core8G,使用公网地址)和专享实例(最小规格8Core16G,即两个DRDS节点,默认提供内网地址)

DRDS Server,即DRDS节点,主要作用是SQL解析优化、路由和结果归并。

DRDS可以进行购买创建实例,创建克隆实例(DRDS实例必须是专享实例),实例间数据库迁移,实例释放,实例变配,平滑扩容操作。

DRDS实例性能主要由DRDS规格和选择的RDS性能决定。DRDS可进行性能监控,重要监控指标有逻辑QPS和物理QPS,连接数,线程活跃数,CPU 利用率,RT逻辑和物理RT,网络输入和输出流量。

DRDS实例变配(变配实例的规格,主要是增加了处理节点和均摊QPS)实现服务的弹性扩展,解决DRDS性能问题(资源合理利用和解决瓶颈)。

衡量DRDS实例规格的重要指标是QPS,QPS和CPU性能是正相关的,CPU利用率超出90%或持续超出80%说明DRDS性能瓶颈,需要实例升配。

衡量DRDS数据库性能主要从响应时间(RT)和QPS两个指标进行衡量,RT一般是单个SQL性能,可SQL优化解决,QPS性能请选择实例变配。

SQL优化 : 主要原则让更多的计算可以下推到RDS/MySQL上执行,DRDS可制定执行计划。

DRDS是否需要平滑扩容(即增加RDS的数量)一般观察RDS的三个指标 : IOPS,CPU,磁盘空间。如果IOPS和CPU任何一个指标长期保持在80%以上或频繁收到报警信息,请尝试SQL优化,升高RDS规格或设置只读库,如果仍不能解决请进行扩容。RDS的磁盘容量剩余请尽量保持在30%以上。扩容有风险,扩容时请不要执行SQL,请在RDS低负载时和业务低谷期时进行,扩容不影响原有数据正常访问。

DRDS控制台地址为 https://drds.console.aliyun.com

DRDS控制台提供查看数据库具体信息、删除数据库、重置密码、只读用户管理等功能。

DRDS控制台不支持直接执行带有dbpartition 或 tbpartition 关键字的分布式DDL。

DRDS的数据库只能在控制台上面创建,需要选择至少一个(多个)RDS(类型为MySQL,状态为运行中)作为存储节点。如果选择的RDS区域和DRDS不相同,即跨区,会带来最高3ms的网络延迟。

数据库创建类型分为拆分型(主要类型),非拆分型(将RDS数据库交由DRDS代理访问,实现读写分离)。拆分型的数据库,DRDS默认在1个RDS上创建8个物理库(不能更改),总物理库数量 = 选择RDS数量 * 8。分表数理论上没有限制,但受限于DRDS本身的规格资源。单个物理分表的容量不超过500万行数据。

删除数据库只会删除由DRDS所创建的数据库,不会影响原本在RDS上的数据库。
DRDS选择数据库连接池(提高了应用性能),主要作用是资源复用,提高系统响应效率,避免连接泄漏,DRDS可使用后端连接池数自动调整功能。

DRDS读写分离,对应用透明的设计,无需更改代码。

拆分型只需在DRDS控制台中调整读权重比例(设置读策略),就可将读流量在主RDS和只读RDS中进行分流,写流量都在主RDS上,不分流。可通过SHOW NODE指令查看实际读流量分布。

主RDS上是强读(强一致性,即强实时性),只读RDS上是弱读(存在毫秒级延迟),个别需要实时性、强一致性读的SQL可通过HINT实现。

非拆分型直接选择RDS的数据库引入到DRDS做读写分离。读写分离只对查询有效,写请求和显式事务查询都在主RDS中。

DRDS HINT可指定在主RDS或只读RDS上执行SQL,HINT基于MySQL注释实现的。自定义的HINT作用读写分离(通过将SQL指定发给主RDS或自读RDS实现),切断延迟的只读RDS,自定义SQL超时时间,指定分库执行SQL,扫描全部分库分表。

每个DRDS数据库可以创建一个只读用户,只读用户只能进行SELECT、SHOW等读操作。

DRDS数据库的表操作权限有8个,CREATE、DROP、ALTER、INDEX、INSERT、DELETE、UPDATE、SELECT。进行相关操作必须要以上对应的权限,如TRUNCATE需要DROP权限,REPLACE需要INSERT和DELETE权限,INSERT ON DUPLICATE UPDATE需要INSERT和UPDATE权限。

DRDS广播表,(小表广播,主要提升JOIN效率,BROADCAST),DRDS将数据量小(小表),更新频率不高并设置为单表的表叫做广播表。广播表通过同步机制进行数据同步,有秒级延迟,广播表会在每一个分库中都会创建同样的表,但数据只存储在第一个分库上(即分库中数据不是全量复制)。

DRDS数据库水平拆分到每个RDS的数据库中,拆分的库叫分库,分库的表叫分表(也叫分片),拆分分为库级拆分(即进行分库),表级拆分(即进行分表)。通过拆分键实现,拆分键分为分库键(DB_PARTITION_KEY),分表键(TB_PARTITION_KEY)。可通过SHOW RULE查看数据库下每一个逻辑表的拆分情况。 通过SHOW TOPOLOGY查看逻辑表的拓扑分布(保存在哪些分库中,每个分库下包含哪些分表)。dbpartition by hash(按hash分库),tbpartition by WEEK(支持按时间分表,但不支持按时间分库)。

DRDS拆分键是生成拆分规则的数据库字段,只支持单个字段,建好分库分表后拆分键不能变更,值不可修改。选择拆分键请尽量规避热点数据。拆分原则是 : 尽可能找到数据表中的数据在业务逻辑上的主体。

DRDS SQL路由,即按照拆分键和SQL语义把SQL分发到底层各个存储的分表进行执行。拆分键是DRDS中数据分布和SQL路由的凭证,DRDS将返回的数据按照原始SQL语义进行合并返回给用户。

DRDS中的sequence序列的特点是全局唯一,有序递增,分为三种类型 : Group,Time,Simple。DRDS默认使用Group(不会单点,性能好),但序列不连续、可能会有跳跃段,不能循环,不会严格从起始值开始取值(即show sequences命令看到的不一定是最大值)。Time(性能很高),用于自增时必须是BIGINT类型。Simple(性能差),单调递增,有瓶颈,谨慎使用。

DRDS可以进行数据表管理,可查看表结构、设置全表扫描、删除表。DRDS可设置白名单。DRDS支持数据导入导出。DRDS支持分布式JOIN,但对复杂情况,如对大表之间的JOIN,执行代价高,速度过慢容易导致性能或者系统不可用。

全表扫描是SQL语句被分发到所有分库上执行,在执行带有WHERE条件的UPDATE、DELETE、SELECT语句时,SQL语句中没有使用拆分键或者虽指定拆分键但是范围太广会导致全表扫描。全表扫描默认是关闭的,响应较慢,避免在高并发业务场景中使用。

DRDS将执行时间超过1秒的SQL定义为慢SQL,分为逻辑慢SQL(应用发送到DRDS,使用SHOW FULL SLOW查看),物理慢SQL(DRDS发送到RDS,使用SHOW FULL PHYSICAL_SLOW查看)。SHOW SLOW可查看慢SQL,SHOW PROCESSLIST查看数据库实时执行信息。

DRDS支持由经典网络(Classic)切换到VPC(实例必须是共享实例,且地域和VPC的必须相同),切换后Classic类型的ECS无法访问DRDS,VPC环境的ECS才能访问VPC环境的DRDS。DRDS切换到VPC后,不会影响DRDS之下的RDS,RDS实例的域名会自动解析为VPC的IP段地址 ,因此RDS的网络类型不需要切换。

DRDS默认支持只单机事务,不支持跨库事务。分布式事务服务请单独申请开通。