表格存储Tablestore是阿里云自研的结构化数据存储平台,提供海量结构化数据存储以及快速的查询和分析服务。表格存储Tablestore的分布式存储和强大的索引引擎能够支持PB级存储、千万TPS以及毫秒级延迟的服务能力。阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。
网盘是一种在线存储服务,服务商为用户提供文件的存储、访问、共享等文件管理必备的基本功能。我们将其数据分为两种:
- 文件。
- 用户存放的真实文件。早期,网盘中的文件大多存储在文件系统中,如本地磁盘、HDFS、NAS等。现在网盘更多的选择存储在对象存储中,如OSS,其在稳定性、安全性、成本、弹性上都会具有优势。
- 元数据(Meta)。
- 描述文件信息的数据,如归属者、目录、大小、创建时间、文件类型等。利用该元数据可以找到真实的文件地址,也可以利用元数据做文件的查询、分享、归类等。
文件数据直接使用OSS存储即可,简单高效。最复杂的是元数据的存储和查询,接下来我们看下网盘元数据(Meta)的存储和查询解决方案。
网盘元数据特点
网盘类型的元数据非常适合存储在Tablestore,主要是因为网盘类型元数据的一些特征和Tablestore匹配。
数据量大
存储海量网盘元数据的同时,需要满足强一致、高可用、低成本等要求。用户的文件数量巨大,比如图片、视频、工作文档是数量最多的数据,一个企业的网盘元数据规模通常在TB级别。传统的Mysql方案中,数据量一旦达到瓶颈,便需要重新创建更大规模的分库然后进行数据的全量迁移,同时数据迭代、膨胀带来的困扰是MySql方案难于逾越的门槛。因此,如此规模的数据存储已经不适合用单机的关系型数据库了,也不适合分库分表了,而需要一款分布式NoSQL数据库,这样可以将数据按一定的路由规则分布到不同机器上,实现自动的水平扩展,非常适合存储海量数据。
查询类型多样
网盘类型元数据与一般元数据不同的是有很多的tag标签,因此系统需要具备搜索查询多维度嵌套标签的能力。以图片为例:用户通过智能媒体的分析服务,分析图片然后为图片增加标签,用户还可提取人脸识别相关信息,提取的信息也需要存储到文件元数据信息中。图片的元数据信息量不断增加,格式、类型也在不断呈现多元化。因此,需要具备丰富的查询类型,如多维度、范围、模糊查询、地理位置等,同时具备排序、统计等功能。比如用户希望查找在杭州市某个商圈1km内的照片?查找2019年所有关于儿子成绩单的excel文件?这时候关系型数据库可能在查询功能和性能上不一定能满足需求,需要额外使用一些查询引擎如Solr、Elasticsearch等。
服务性能及成本
新业务需要产品快速上线,这时候既要高并发,又要保证低延迟,同时又希望兼顾成本最低。随着系统用户的增多减少以及不可预期的热点事件,需要能够动态的扩容和缩容来节约成本,比如系统起步阶段可以使用一款全托管的Serverless数据库,来专注于业务研发,无需担心软硬件配置、故障、集群扩展、安全等问题,在保证服务高可用性的同时,极大地减少了管理及运维成本,帮助产品快速上线。
开源解决方案
传统的网盘元数据可能会采用关系数据库Mysql的方案,借助关系型数据库强大的查询能力,用户可直接通过SQL语句实现文件的元数据多维度查询、数据统计分析等。但是,Mysql等关系数据库通常有如下一些问题:
- 随着数据量的膨胀无法水平扩展。数据库要满足易扩展、低成本等基本要求;
- 对文件的多维查询需求支持不佳。数据库需要具备强大的查询能力,如多类型索引、多维度组合查询等,同时具备排序、统计等功能;
- 在数量比较大的情况下,写入性能较差。数据库需要应对高并发请的同时,保证低延迟、强一致、高可用等特性。
为了解决如上问题,多种数据库组合的方案便孕育而生,如Mysql分库分表+Elasticsearch的方案解决写入和查询能力等问题,这些方案的架构可能如下:
借助多个数据库各自的优势可以分别解决不同场景的需求,但多个数据库组合的方案同样也带来了新的问题:
- 牺牲了空间成本,Mysql和Elasticsearch中的数据存在无用的冗余数据;
- 较难保证两个数据库的数据一致性,存在数据丢失的可能性;
- 增加了开发工作量与运维复杂度。
Tablestore云解决方案
在现有的各种各样的云产品中,能满足上述网盘元数据需求的产品并不多。表格存储Tablestore是阿里云借鉴谷歌Bigtable论文研发的一款分布式数据库产品,可以提供超大规模的存储容量,天然的分布式架构也提供了易于横向扩展的特性,理论上可以存储的数据量是不受限制的。该数据库10年前就开始自研,经过多年的双十一、公有云客户的锤炼沉淀,保证了系统的可靠性和稳定性。
基于Tablestore存储网盘架构方案如图:
网盘文件的存储
OSS和表格存储Tablestore一样,都是Serverless的云服务,其数据设计持久性不低于99.9999999999%(12 个 9),服务设计可用性(或业务连续性)不低于 99.995%。OSS按量使用且无需关心运维。使用oss进行文件的存储会使应用在稳定性、安全性、成本、弹性上都会具有优势。不用自己搭建和维护文件系统,开发人员可以把精力放在核心功能的开发上。
网盘元数据的存储
- 网盘元数据数据存储在Tablestore中,Tablestore可以提供10个9的数据可靠性保障,数据可靠性有保障。
- 网盘元数据和索引都在一个系统里面,写入,读取都是通过同一套API写入和查询,易用性更高。
- Tablestore支持二级索引、多元索引等索引功能,完全满足上述提出的查询需求,包括:
- 多字段自由组合查询。
- 范围查询。
- 地理位置查询。
- Tablestore是分布式系统,可以水平扩展,目前生产环境单表最大有几十PB,每秒写入有几千万行,完全能胜任任何大数据的写入和存储。
示例
接下来,我们通过一个网盘元数据的使用示例增加理解。
假设我们的产品需要给用户提供个人相册服务。将相册中的图片和视频存储在对象存储OSS中,将图片和视频的元数据(Meta Data)存储在表格存储Tablestore中。一般的文件Meta信息包括:用户id、文件id、文件类型、创建时间、照片地点、文件大小、文件状态、标签信息、OSS链接、是否星标文件、用户描述信息。
首先,我们设计Tablestore中主表结构:
|
主键列 |
主键列 |
主键列 |
属性列 |
属性列 |
属性列 |
属性列 |
属性列 |
属性列 |
属性列 | 属性列 |
字段描述 |
用户id |
创建时间 |
文件id |
文件类型 |
拍摄地点 |
文件大小 |
文件状态 |
标签信息 |
OSS链接 |
是否星标文件 |
用户描述信息 |
数据类型 |
String |
Integer | String |
String |
String |
Double |
String |
String |
String |
Boolean |
String |
举例 |
abc |
1573543009 |
aaaa1 |
image |
35.8,-45.91 | 42.5 |
uploading |
[{"name:"place", "tag": "北京" }, { "name": "people", "tag": "男" }, { "name": "annimal", "tag": "狗" } ] |
http://abc.oss-cn-hangzhou.aliyun.com/xxxxxx/aa.png |
true |
考上大学 |
举例 |
def |
1573543012 |
bbbb2 |
video |
35.8,-45.91 | 9822.34 |
available |
[{"name:"place", "tag": "上海" }, { "name": "weather", "tag": "雷阵雨" } ] |
http://abc.oss-cn-hangzhou.aliyun.com/xxxxxx/aa.mp4 |
false |
和小明一起上海跨年 |
Tablestore的主表在查询时候可以理解为是几个主键列上的前缀索引,上述主表结构中,支持的查询包括:
- 一个用户下的所有图片或视频
- 一个用户某一段时间内的图片或视频
- 查看用户最近的图片或视频
Tablestore支持全局二级索引。全局二级索引支持在指定列上建立索引,生成的索引表中数据按您指定的索引列进行排序,主表的每一个写入都将自动异步同步到索引表。您只向主表中写入数据,根据索引表进行查询,在许多场景下,将极大的提高查询的效率。例如网盘场景下如果主键查询不能满足需求,对于简单的查询(例如单个字段查询)我们可以直接创建全局二级索引,通过全局二级索引能够快速的查询信息。
通过主表和二级索引,已经能够完成相册的基本功能,如文件的上传下载等。如果想完成更加丰富和复杂的查询功能(多个字段关联查询),可以使用Tablestore的多元索引功能,其中多元索引的索引定义:
列 |
列 |
列 |
列 | 列 |
列 |
列 |
列 |
用户id | 创建时间 |
文件类型 |
拍摄地点 |
文件大小 |
标签信息 |
是否星标文件 | 用户描述信息 |
Keyword | Long |
Keyword | GeoPoint |
Double |
Nested,Nested中的name和tag都是Keyword |
Boolean |
Text,分词采用: 单字分词 |
- 用户描述信息采用了Text类型, 支持分词,分词使用了单字分词。该字段可以进行模糊匹配查询。
- 拍摄地点采用了GeoPoint类型,这个类型支持范围查询。比如某个点附近几公里内的所有照片,同时也支持某个多边形范围内的所有照片信息。
- 标签信息是Nested嵌套类型的,其支持的查询和非嵌套类型一致,只是使用方式上有一些小差别。
- 多元索引支持多字段组合查询,可以满足任意几个列与或非组合查询,如:查询文件类型是图片且拍摄地点是上海且文件大小超过100MB且是标星文件且创建时间在9月份之前的所有照片?
另外,可能还有一些统计聚合需求,在运营产品和制作报表时候可能会用到。这些都可以基于多元索引完成,比如:
- 目前所有用户的相册中一共有多少张?通过Aggregation.Count(*);
- 所有用户中超过1G的文件有多少个?GroupBy.GroupByRange(文件大小);
- 视频和图片各有多少张?通过 GroupBy.GroupByField(文件类型);
- 过去三年每年相册的上传数量? 通过 GroupBy.GroupByRange(创建时间);
- 视频文件中最大文件有多大? 通过Aggregation.Max(文件大小);
- ...
基于上述的表、二级索引和多元索引,我们就能满足几乎所有的查询需求。
总结
至此,开源解决方案和Tablestore云解决方案都介绍完了,使用了Tablestore云解决方案后,能带来不少的收益。
减少运维负担
在Tablestore云解决方案中,用户只需要运维自己的应用程序,不需要运维任何的存储系统、查询系统和其他中间件,运维压力大大减少,同时也减少了运维方面的成本开支。另外,Tablestore是Serverless的服务化产品,不需要关注扩容、水位等事项,只需要关注功能开发即可。
系统架构更简单
在开源解决方案中使用多个系统,而Tablestore解决方案中只有1个系统,系统数减少后,系统架构会更简单,系统可能产生的风险会更少,系统的稳定性等会更高,可以提供更优质的服务体验。
减少时间成本
Tablestore云架构方案相对于开源方案,系统更少,从零开始到上线需要的开发时间更少,同时,Tablestore是serverless的云服务,全球多个区域即开即用,可以大大降低客户的开发上线的时间,提前将产品推出,抢先争取市场领先优势。
数据可靠性更高
在开源解决方案中,数据有可能会丢失,影响最终的业务,而在Tablestore解决方案中,可以提供更高的可靠性,可以让数据不丢失,保障业务的准确执行。
扩展阅读
表格存储 (Tablestore) 提供专业的免费技术咨询服务,欢迎加入我们的钉钉讨论群。群号 : 23307953