业务场景
在实际工作中,由于企业的业务量会逐渐增多,企业后端的单个关系型数据库经常会面临如下问题:
存储容量瓶颈问题:大量的历史订单存储在某个数据库,可能导致数据库存储容量达到瓶颈,通常我们可以通过在一台机器下面挂载多块磁盘,达到10TB/20TB/30TB的容量。然后再使用一个MySQL实例支持,但数据备份,数据管理(DDL),数据检索与更新性能(DML)都会出现大幅下滑。
访问容量瓶颈问题:当大量客户的访问请求发送到单个数据库,数据库响应连接的进程数达到瓶颈,导致数据库无法响应客户端的请求,影响业务的正常处理。虽然我们可以通过增加CPU/内存/磁盘/网络等硬件缓解这种情况,但是廉价X86 PC做到几十核目前就是顶配了,内存几百G也无法容纳几十T数据的各种索引,磁盘IO毕竟比内存还是差一些,通用网络也就到万兆,本质上是无法避免数据库单机瓶颈的。
容灾问题:单机总存在着0或者1的问题,所以做热备冷备,以求出故障时能够快速切换,但是数据库并不是应用,数据库存在状态,存在事务,真正宕机切换对于核心业务来说真的是一个很艰难的决定。
对于阿里云的客户,可以使用分布式数据库DRDS服务解决如上问题:
利用DRDS的分库分表功能分散单个数据库的整体访问压力;
由于DRDS的数据水平拆分对用户使用有一定的限制,所以DRDS还提供更低业务侵入性的读写分离功能;
DRDS自动继承快速扩展能力,稳定性监控,资源隔离,灾备恢复等特性。
总体来说,解决数据库容量问题的产品都是基于share anything或者share nothing架构:
share anything 架构使用共享内存、共享存储、infinibind、高配物理机结合出一个全功能数据库。这样的架构能够满足大部分用户的数据容量需求,但是本质上如同小型机+数据库,因此,这样的架构仍然会碰到容量天花板,并且相当昂贵;
share nothing架构使用多个廉价PC做数据拆分,服务和数据存储节点之间并不完全同步状态。这样的架构能够做到数据和访问容量通过简单堆叠机器进行扩展。DRDS就是利用这种架构,通过SQL引擎和自助管控系统尽可能降低用户对分布式细节的感知。
DRDS基本介绍
分布式数据库DRDS目前定位成一个中间件,在业务应用和RDS之间,本身不承担数据存储,只负责解决分布式情况下的数据操作、执行、数据处理等功能。DRDS的使用与MySQL非常接近,建实例、建库、建表、执行SQL操作,比较大的区别在于水平拆分模式下,DRDS对于建表需要指定拆分字段(类似索引),只要带上这个拆分字段,SQL只会在部分数据分片上执行,从而加速SQL执行速度。
“分库分表”在DRDS里面是一个很重要的概念。DRDS在后端将数据量较大的数据表水平拆分到后端的每个RDS数据库中,这些拆分到RDS中的数据库被称为分库,分库中的表称为分表。DRDS由每个数据库负责每一部分数据的读写操作,从而有效的分散了整体访问压力,在系统扩容时,只需要水平增加分库的数量,并迁移相关数据,就可以提高DRDS系统的总容量。
“拆分键”是分库分表的重要概念,拆分键也称为分库/分表字段。DRDS根据拆分键的值将数据表水平拆分到后端的每个RDS分库里。也就是,键值相同的数据,一定会位于同一个RDS数据库里。DRDS除了可以定义分库键以外,每一张逻辑表都可以定义自己的拆分键。拆分键暂时只能是单个字段。如果分库键与分表键相同,那么在插入时只需要指定该分库/分表键。如果分库键与分表键不同,则在插入时需要分别指定分库键和分表键。
DRDS水平拆分原理
拆分字段:是DRDS中数据分布和SQL路由的凭证。
图 1
数据分布:DRDS中的数据是按照拆分字段值,加上特定的算法进行计算,根据结果存储数据到对应分片
图 2
SQL路由:当用户SQL遇到DRDS时,DRDS会理解整个SQL含义,然后按照拆分字段的值和执行策略将SQL路由到对应分区进行执行。
图 3
数据合并:如果一个SQL对应多个分片数据执行,DRDS会将各个分片返回的数据按照原始SQL语义进行合并。
图 4
云中沙箱DRDS初级实验介绍
云中沙箱(http://www.aliyunedu.net)为学员提供一个云端实验平台,帮助用户熟练运用阿里云产品、技术、服务与解决方案,提升用户在阿里云上工作的操作能力。
云中沙箱提供 “SL034 使用分布式数据库DRDS突破单个数据库瓶颈” 自助实验,沙箱平台会在实验开始时,创建一台RDS实例和一台DRDS共享实例。首先,将数据样本导入到RDS新建数据库。模拟客户实际工作中,将百万行数据存储在单个RDS数据库中的场景。然后,使用DRDS建立拆分数据库和拆分数据表,也就是利用DRDS中的hash方法对单个RDS数据库进行拆分。之后,导入数据,开始进行拆分,将单个表中的数据可以拆分到分表中。后,通过DMS查看分库分表的结果。
通过此实验,用户有能力掌握:
在阿里云上使用DRDS拆分键,将RDS水平拆分;
通过 hint 方式实现对拆分的数据库进行查询。
实验架构图:
图 5