阿里云分析型数据库ADS优势和特点

在上周的集团内部阿里云技术论坛上,杨总分享了阿里云分析型数据库的实战经验,就让我对阿里云分析型数据库ADS的认知从“不知道自己不知道”变成了“知道自己不知道”。

阿里云分析型数据库开通地址 https://www.aliyun.com/product/ads
阿里云分析型数据库ADS(AnalyticDB)官方文档
https://help.aliyun.com/document_detail/122234.html

阿里云分析型数据库是阿里巴巴自研的满足海量数据实时多维分析的大数据产品。
阿里云分析型数据库的产品定位:
AnalyticDB(大存储)和AnalyticDB(高性能)是两种特性的ADS实例,前者偏向于海量数据后者偏向于快速响应。从中可以看出如果您既要处理千亿甚至是万亿级别的数据,同时又要实现毫秒级的响应,那么这个分析型数据库就是你的菜。根据杨总的分享,他们把分析型数据库应用在海量贸易数据的实时快速检索上,通过对ADS数据库的合理使用,最终实现了几十亿条数据上千客户端并发进行全文检索的“秒开”。
全文检索为什么能这么快,因为之前对商品的特征信息进行了分词,并把分词后的结果存入了多值列。

进一步探究阿里云ADS为神马这么快,还要看架构:
主要发挥作用的是计算集群,计算集群有三类节点:
前端节点:Front Node
计算节点:Compute Node
缓存节点:Buffer Node
阿里云ADS会根据任务的不同自动在MPP工作模式和Local/Merge工作模式之间进行切换,其中MPP模式功能更强,兼容性更好,但速度稍慢,而Local/Merge模式的速度更快。
创建一个ADS服务实例的过程非常简单,登陆阿里云,在大数据产品中找到分析型数据库,选择包年包月或者按量计费模式(可以先用按量付费的测试下),再选择ECU的类型和数量,最后下订单,付款。而且,我发现最终的价格也不是想象中的那么高,据杨总介绍,针对海量数据的查询场景,使用ADS的成本是RDS的五分之一。

目前有四种节点可以选择,c4,c8都属于性能型,全部使用SSD磁盘,s2n和s8n属于存储型,同时使用SSD和大容量磁盘,数据通过SSD进行缓存,节点数量最少选择两个,在使用过程中发现不够,可以随时扩容。ADS服务实例创建完成后就可以创建表组和表了。表组是ADS特有的概念,表组是一系列可发生关联的数据表的集合。一个表组所有表的副本数一致,一个表组的所有表的一级Hash分区数目必须一致。

一个表组内的表才能进行快速的Join,维度表除外。

个表组的表共享一些配置,例如查询超时时间。

在创建表组后就可以创建表了,ADS中的表有两种,一种是正常表,即可以存储海量数据的表,另一种是维度表,维度表的记录数比较少,一般存储一些描述性的维度信息,维度表一般通过和普通表进行join配合使用。

创建表的时候需要指定某列作为一级分区列,ADS调度模块会将相同表组的所有表的相同分区分配在一个计算节点上(一个表组下的两个表,分区号相同的两个分区存储在一个节点下),当多表使用分区列join时,单节点内部直接计算,避免跨机计算,所以在选择分区列时应尽可能考虑使用后期查询经常需要用的列。
ADS需要在建表的时候就指定分区个数,不可修改,且参与快速join的多个表的分区数必须相同。这是因为ADS使用的是Hash分区,分区列的值通过Hash计算被映射到某个分区,单个分区的记录数建议在300万-2000万之间。
ADS除了一级分区外还有二级分区,二级分区主要是解决数据固定时间(天、周、月)增量导入,同时需要保留历史数据而设计的。二级分区设置的过多会导致性能下降,设置的过少会限制增量数据的导入频率从而导致数据查询的实时性较差。

阿里云ADS还有一个概念是聚集列,当以聚集列为查询条件时,查询结果相同或相近的数据保存在磁盘相同位置以减少IO次数,使用聚集列实现了预排序的功能。

阿里云ADS是不需要建立索引的,因为ADS从本质上说是一种列式数据库。

向阿里云ADS的表中导入数据可以直接使用程序Insert写入,或采用阿里云的DTS、CDP数据集成或者通过第三方的Kettle等工具进行导入。 在使用Insert导入数据时可以采取四种方式:

单并发写入,单并发插入400-800条记录。

多并发写入,每个FrontNode支持20个写入并发。

Batch Insert、每个Insert插入20–50条数据。

Shuffle Batch Insert、配合ADS提供的代码,能让写入把带宽完全打满。

在用程序连接ADS时,可以使用MySQL连接库,SQL语法与MySQL兼容度95%以上。

以下是杨总分享的在阿里云ADS使用过程中的一些注意事项:

不支持分页查询,例如select a from table1 limit10,10,但支持select a from table1 limit 10 。

要善于使用聚集列和多值列。

尽量不要用联表查询或者子查询。

无需处理索引。

一次查询最多返回10000行。