基于表格存储Tablestore和OSS实现企业网盘

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
对象存储 OSS,20GB 3个月
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介:   表格存储Tablestore是阿里云自研的结构化数据存储平台,提供海量结构化数据存储以及快速的查询和分析服务。表格存储Tablestore的分布式存储和强大的索引引擎能够支持PB级存储、千万TPS以及毫秒级延迟的服务能力。阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。 网
 

表格存储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的方案解决写入和查询能力等问题,这些方案的架构可能如下:

 

借助多个数据库各自的优势可以分别解决不同场景的需求,但多个数据库组合的方案同样也带来了新的问题:

  1. 牺牲了空间成本,Mysql和Elasticsearch中的数据存在无用的冗余数据;
  2. 较难保证两个数据库的数据一致性,存在数据丢失的可能性;
  3. 增加了开发工作量与运维复杂度。

 

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

 

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
运维 文件存储 对象存储
【运维知识进阶篇】用阿里云部署kod可道云网盘(配置Redis+MySQL+NAS+OSS)(三)
【运维知识进阶篇】用阿里云部署kod可道云网盘(配置Redis+MySQL+NAS+OSS)(三)
328 0
|
存储 运维 数据安全/隐私保护
【运维知识进阶篇】用阿里云部署kod可道云网盘(配置Redis+MySQL+NAS+OSS)(四)
【运维知识进阶篇】用阿里云部署kod可道云网盘(配置Redis+MySQL+NAS+OSS)(四)
312 0
|
存储 文件存储 对象存储
使用OSS快速搭建个人网盘
通过本实验,用户可学会如何创建OSS bucket,并利用oss自有的图形化工具来作为个人网盘进行上传下载等操作,帮助用户0代码文件上云。
|
存储 API 对象存储
使用OSS对象存储快速搭建个人网盘
使用OSS对象存储快速搭建个人网盘
766 1
|
存储 弹性计算 Linux
使用ECS和OSS搭建个人网盘
本场景主要介绍如何基于ECS和OSS快速搭建一个个人网盘。
|
对象存储
阿里云OSS如何对接外链网盘
阿里云OSS如何对接外链网盘
468 1
|
存储 弹性计算 开发工具
云存储Clouder认证:基于存储产品快速搭建网盘—课时7:基于对象存储OSS快速搭建网盘
云存储Clouder认证:基于存储产品快速搭建网盘—课时7:基于对象存储OSS快速搭建网盘
|
存储 数据可视化 Go
云存储Clouder认证:基于存储产品快速搭建网盘—课时6:对象存储OSS入门
云存储Clouder认证:基于存储产品快速搭建网盘—课时6:对象存储OSS入门
|
弹性计算 运维 NoSQL
【运维知识进阶篇】用阿里云部署kod可道云网盘(配置Redis+MySQL+NAS+OSS)(二)
【运维知识进阶篇】用阿里云部署kod可道云网盘(配置Redis+MySQL+NAS+OSS)(二)
473 0
|
弹性计算 运维 负载均衡
【运维知识进阶篇】用阿里云部署kod可道云网盘(配置Redis+MySQL+NAS+OSS)(一)
【运维知识进阶篇】用阿里云部署kod可道云网盘(配置Redis+MySQL+NAS+OSS)
463 0