阿里云的对象存储服务,oss 简介
在电子科大的21学年的 数据库新技术 课程中,我接触到了一个 对象存储的 概念。
过往接触的就是那些 mysql 这些二维表的数据库,在做一些java 项目,比如 springboot 的项目中,也是直接讲对象的字段,逐一插入 数据库 的 一个 row;没有那种直接存储对象的数据库。
后来在写博客的时候,发现有人用阿里云的oss 对象存储作为图床。
所以,这篇文章就整理一下有关 阿里云 对象存储 的知识点。
什么是对象存储OSS
OSS的全称是:Object Storage Service;即对象存储服务。
在数据存储领域,存储数据的主要方法有三种: 文件、块和对象。
简单来说,对象的功能是模块化的单元,每个对象都充当自包含的存储库,其中包含描述权限、隐私、证券、意外事件和其他信息等详细信息的元数据。例如,它类似于一张照片,其中可能包含描述用于拍摄照片的相机设置以及拍摄时间和地点的元数据。
将OSS与传统的存储方式进行对比
传统上,Web 应用程序使用文件系统和数据库在后端存储用户数据。很简单,结构化数据进入数据库,其他任何东西进入文件系统。这很容易管理,因为很少有应用程序生成非结构化数据——大多数应用程序在表单中接受用户输入并将数据保存到数据库中。
然而,时代在变,随着社交媒体、云存储、数据分析平台和其他计算范式的出现,越来越多的非结构化数据被推送到互联网上。
DC 在 2014 年进行的一项研究预测,到 2020 年,全球创建和复制的非结构化数据将达到 44 泽字节,即每年 44 万亿千兆字节。2015 年非结构化数据已经占所有数字数据的 90%
所以,与其他计算范式一样,存储系统需要不断发展才能满足这一新的非结构化数据浪潮席卷互联网。
自现代计算开始以来人们一直在使用的存储机制,即文件系统,扩展比较困难;不仅需要管理文件系统强加的不必要的元数据和层次结构,还需要处理其他事情,例如备份管理。
而且,仅仅收集非结构化数据是不够的。我们还需要应用某种级别的组织来理解数据。文本分析、自动分类、自动标记等技术对于从我们收集的所有非结构化数据中获得商业意义至关重要。具有固定布局的文件系统使其难以实现。
我们最初接触到的文件系统不是为 HTTP(S) 设计的,而是为人类设计的。在文件系统中共享和管理文件很难以编程方式处理。处理文件流和可能的边界情况很容易出错,需要花费大量的时间和精力。
为了绕过这一切,需要一些新的东西。从头开始设想,始终关注新的需求。这导致了对象存储。
什么是 非结构化数据
无论何时使用大容量存储,大部分数据都可能是非结构化的。“非结构化数据”是一个关于对象存储的时髦词汇。这并不意味着文件本身是非结构化的。当然,每个文件都有某种类型的结构。当有人说他们的数据是非结构化的,他们的意思是这些数据不存储在数据库中。它只是一个松散的文件集合,由各种不同的应用程序创建。一个很好的例子是我们的文档文件夹。
总结一下,无法组织存储在关系数据库中的数据通常称为非结构化数据。我们可以拥有文本或非文本非结构化数据。文本文档、电子邮件、演示文稿等是文本非结构化数据的示例。非文本非结构化数据的示例包括视频、图像、音频文件等。
对象存储的特点
基于对象的存储已经成为当今数字通信(非结构化媒体、网络内容(电子邮件、视频、图像文件和网页)以及物联网设备产生的传感器数据)数据归档和备份的首选方法。这种存储系统不是将文件分解成存储在文件系统磁盘上的块,而是将对象作为存储在结构平面数据环境中的离散数据单元。
对象存储不使用文件夹、目录或复杂层次结构。相反,每个对象都是一个简单的、自包含的存储库,其中包括数据、元数据和一个惟一的标识 ID 号,应用程序使用这个 ID 号来定位和访问它。在这种情况下,元数据比基于文件的方法更具描述性。我们可以使用其他上下文自定义元数据,以便以后提取这些上下文并将其用于其他目的,如数据分析。
与文件系统中的文件不同,对象存储在平面结构中。只有一个对象池——没有文件夹、目录或层次结构。我们只需通过提供对象 ID 来请求给定对象。对象可能位于本地或位于千里之外的云服务器上,但由于它们位于平坦的地址空间中,因此它们的检索方式完全相同。
另一个重要方面是元数据处理。对象存储在存储对象元数据时提供了极大的灵活性。这意味着元数据不限于存储系统认为重要的内容(想想文件系统中的固定元数据)。我们可以手动添加任何类型或数量的元数据。例如,我们可以分配元数据,例如与对象关联的应用程序类型;申请的重要性;我们要分配给对象的数据保护级别;我们是否希望将此对象复制到另一个站点或多个站点;何时将此对象移动到不同的存储层或不同的地理位置;何时删除此对象。等等,可能性是无限的。
通过 HTTP(S) 访问文件非常重要。只有当文件易于访问时,才能对其进行分析或其他技术。对象存储可以很好地处理这个问题。几乎所有提供对象存储的平台都有可用的 REST API 来帮助我们通过 HTTP(S) 访问文件。 API 不仅有助于访问数据,还可以帮助我们进行身份验证、获取文件属性和管理权限——我们需要在文件系统中手动执行的所有操作。
对象存储的好处
总结一下,基于对象的存储的主要好处包括:
- 可扩展性:不受文件夹层次结构或块表阻碍的扁平架构提供近乎无限的可扩展性。在云计算时代,对象存储被广泛采用,分析师估计,在不久的将来,对象存储将占据全球所有数据的绝大多数非结构化数据。由物联网(Internet of Things)设备生成的网络内容——电子邮件、视频、社交媒体、文档、传感器数据等等——数量庞大,而且还在不断增长。非结构化数据文件通常是静态的(不变的) ,但可能在任何时间、任何地点都需要(比如图像和视频文件,或者存档的数据备份)。
- 按需数据:对象存储可以更轻松地仅为我们使用的存储容量付费。 对象存储与作为服务提供多租户存储的云或托管环境密切相关。这允许公司中的许多公司或部门共享相同的存储储存库,每个公司或部门都可以访问存储空间的一个单独的部分。这种共享存储方法本质上优化了规模和成本。通过使用低成本的云存储,同时在需要时保持数据的可访问性,可以减少组织的现场 IT 基础设施。
- 元数据驱动的数据分析:元数据让我们可以前所未有地控制系统中的数据。对象存储消除了带有文件夹和目录的分层文件系统文件夹的复杂性。由于没有文件夹、目录或复杂的层次结构可以导航,因此性能延迟的可能性较小,并且在检索数据时将实现高效性。这可以提高性能,特别是在管理大量数据时。
- API 支持:我们可以通过 REST 命令访问和管理对象存储系统中的数据。
- 提高数据完整性:对象存储系统可以利用纠删码通过重建数据块和执行完整性检查来防止损坏来保护数据完整性。
对象存储的设计结构
发展历史
不得不提到SAN(存储局域网) 和 NAS(网络附加存储),这两个主流的网络存储架构,而对象存储最早可以追溯到1999年成立的全球网络存储工业协会(SNIA)的工作组发布了ANSI的X3T10标准。总体上来讲,对象存储同兼具SAN高速直接访问磁盘特点及NAS的分布式共享特点。
SAN(Storage Area Network)结构
采用SCSI 块I/O的命令集,通过在磁盘或FC(Fiber Channel)级的数据访问提供高性能的随机I/O和数据吞吐率,它具有高带宽、低延迟的优势,在高性能计算中占有一席之地,如SGI的CXFS文件系统就是基于SAN实现高性能文件存储的,但是由于SAN系统的价格较高,且可扩展性较差,已不能满足成千上万个CPU规模的系统。
NAS(Network Attached Storage)结构
它采用NFS或CIFS命令集访问数据,以文件为传输协议,通过TCP/IP实现网络化存储,可扩展性好、价格便宜、用户易管理,如目前在集群计算中应用较多的NFS文件系统,但由于NAS的协议开销高、带宽低、延迟大,不利于在高性能集群中应用。
对象存储结构
核心是将数据通路(数据读或写)和控制通路(元数据)分离,并且基于对象存储设备(Object-based Storage Device,OSD)构建存储系统,每个对象存储设备具有一定的智能,能够自动管理其上的数据分布。
总体上来讲,对象存储同兼具SAN高速直接访问磁盘特点及NAS的分布式共享特点。
对象存储结构组成部分(对象、对象存储设备、元数据服务器、对象存储系统的客户端):
与文件存储的对比
文件存储将数据组织和存储在一个文件夹中。文件被命名,用元数据标记(通常是文件名、文件类型,以及创建和最后更新的时间) ,并在目录和子目录的层次结构下组织在文件夹中。我们可以像在文件柜中存储纸质文件一样来考虑文件存储。在每个抽屉(子目录)中都有多个抽屉(目录)和带标签的文件夹。要在文件柜中找到特定的文件夹,请打开适当的抽屉并查看文件夹标签。同样,要访问文件存储系统中的数据,我们的计算机系统只需要找到它的路径(目录和子目录)。像这样的分层存储系统可以很好地处理相对较小、易于组织的数据量。但是,随着文件数量的增加,搜索和检索过程可能变得繁琐和费时。
与块存储对比
块存储为基于文件的存储提供了一种替代方法:一种提高了效率和性能的方法。块存储将文件分解为相同大小的数据块,并将这些数据块分别存储在一个唯一的地址下。我们不需要文件夹结构。相反,我们可以在系统的任何地方存储块的集合,以获得最高的效率。
要访问一个文件,服务器操作系统使用唯一的地址将块拉回到一起,组装成文件。我们将获得更高的效率,因为系统不需要通过目录和文件层次结构来访问数据块。块存储适用于关键业务应用程序、事务性数据库和虚拟机,这些应用程序需要低延迟(最小延迟)、对数据的粒度或更详细的访问以及一致的性能。
对象的定义
对象是系统中数据存储的基本单位,一个对象实际上就是文件的数据和一组属性信息(Meta Data)的组合,这些属性信息可以定义基于文件的RAID参数、数据分布和服务质量等,而传统的存储系统中用文件或块作为基本的存储单位,在块存储系统中还需要始终追踪系统中每个块的属性,对象通过与存储系统通信维护自己的属性。在存储设备中,所有对象都有一个对象标识,通过对象标识OSD命令访问该对象。通常有多种类型的对象,存储设备上的根对象标识存储设备和该设备的各种属性,组对象是存储设备上共享资源管理策略的对象集合等。
对象存储设备
对象存储设备具有一定的智能,它有自己的CPU、内存、网络和磁盘系统,OSD同块设备的不同不在于存储介质,而在于两者提供的访问接口。OSD的主要功能包括数据存储和安全访问。目前国际上通常采用刀片式结构实现对象存储设备。OSD提供三个主要功能:
(1) 数据存储
OSD管理对象数据,并将它们放置在标准的磁盘系统上,OSD不提供块接口访问方式,Client请求数据时用对象ID、偏移进行数据读写。
(2) 智能分布
OSD用其自身的CPU和内存优化数据分布,并支持数据的预取。由于OSD可以智能地支持对象的预取,从而可以优化磁盘的性能。
(3) 每个对象元数据的管理
OSD管理存储在其上对象的元数据,该元数据与传统的inode元数据相似,通常包括对象的数据块和对象的长度。而在传统的NAS系统中,这些元数据是由文件服务器维护的,对象存储架构将系统中主要的元数据管理工作由OSD来完成,降低了Client的开销。
元数据服务器
即:Metadata Server,MDS
MDS控制Client与OSD对象的交互,主要提供以下几个功能:
(1) 对象存储访问
MDS构造、管理描述每个文件分布的视图,允许Client直接访问对象。MDS为Client提供访问该文件所含对象的能力,OSD在接收到每个请求时将先验证该能力,然后才可以访问。
(2) 文件和目录访问管理
MDS在存储系统上构建一个文件结构,包括限额控制、目录和文件的创建和删除、访问控制等。
(3) Client Cache一致性
为了提高Client性能,在对象存储系统设计时通常支持Client方的Cache。由于引入Client方的Cache,带来了Cache一致性问题,MDS支持基于Client的文件Cache,当Cache的文件发生改变时,将通知Client刷新Cache,从而防止Cache不一致引发的问题。
对象存储系统的客户端Client
对象存储通过将文件管理与底层块管理解耦来实现可伸缩性。每个磁盘都使用标准的本地文件系统进行格式化,如 ext4。然后,一组对象存储服务在其上面分层,将所有内容组合成一个单一的、统一的卷。文件作为“对象”存储在对象存储中,而不是文件系统中的文件。通过将低级块管理卸载到本地文件系统,对象存储区只需跟踪高级细节。这一层分离使文件查找表保持在可管理的大小,允许我们在不降低性能的情况下扩展到数百字节。
为了有效支持Client支持访问OSD上的对象,需要在计算节点实现对象存储系统的Client,通常提供POSIX文件系统接口,允许应用程序像执行标准的文件系统操作一样。
下文就是针对 阿里云这款国内的 oss 产品,进行一些技术内容分享。
阿里云的对象存储介绍
阿里云就有提供这样一个对象存储的服务,就叫做 aliyun oss, 它提供了海量,安全,低成本,高持久的云存储服务。
阿里云 oss 的一些技术指标为:
- 数据持久性不低于99.9999999999%(12个9)
- 服务可用性(或业务连续性)不低于99.995%。
oss 还有个好处,就是非常适合现在业务上云,多个客户端复用服务的时代需求,因为OSS具有与平台无关的RESTful API接口,我们就可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
原则上,我们可以使用阿里云提供的API、SDK接口或者OSS迁移工具轻松地将海量数据移入或移出阿里云OSS。
数据的存储方式,规格也有不同,可以让用户根据自己的数据使用场景,进行最优惠的选择。我们可以选择
- 标准存储(Standard):作为移动应用、大型网站、图片分享或热点音视频的主要存储方式
- 低频访问存储(Infrequent Access):成本更低、存储期限更长的
- 归档存储(Archive)
- 冷归档存储(Cold Archive):作为不经常访问数据的存储方式。
具体来说,标准存储类型提供高持久、高可用、高性能的对象存储服务,能够支持频繁的数据访问;低频访问存储类型适合长期保存不经常访问的数据(平均每月访问频率1到2次),存储单价低于标准类型;归档存储类型适合需要长期保存(建议半年以上)的归档数据;冷归档存储适合需要超长时间存放的极冷数据.
开通阿里云oss
通过
阿里云oss官方网站
我们安装指导就能开通便宜的oss。然后申请一个bucket 就可以开启oss的使用之旅了。
Bucket 的概念
Bucket 就是 桶的意思,我们开通了oss 服务后,数据就被放置在这些桶中。
之所以提供 bucket 的概念,其原因是我们的数据具有不同的用途,比如低频访问的存档数据,高频访问的图片,音视频数据,他们都需要两个不同的桶去存储。还比如,有些数据就在杭州使用,另外一些数据则常常在北京使用,此时,我们就可以申请两个 bucket ,一个地理位置在杭州,一个在北京。
除了 数据的访问频次,地理位置,还有访问权限,存储类型的不同,我们都要根据自己的业务要求,去开启不同的 bucket
Bucket 里面装 object
object 就是我们要存储的 对象,这是 oss 的基本单元。在 com.aliyun.oss.model 包中,有如下的 ossObject 定义:
public class OSSObject extends GenericResult implements Closeable {
private String key;
private String bucketName;
private ObjectMetadata metadata = new ObjectMetadata();
private InputStream objectContent;
public ObjectMetadata getObjectMetadata() {
return metadata;
}
一个 object 由几个部分组成:
- object meta: 对象的元信息
- Data:用户的真实数据
- key: 这个数据文件单元的名字 ,这是文件的唯一标识
其他一些 oss 里面的概念
region
地域信息,表明了我们的数据库所在的数据中心的真实地理位置,比如北京,深圳
访问域名:endpoint
oss以HTTP RESTful API的形式对外提供服务,当访问不同地域的时候,需要不同的域名。通过内网和外网访问同一个地域所需要的域名也是不同的。
访问密钥:AccessKey
AccessKey简称AK,指的是访问身份验证中用到的AccessKey ID和AccessKey Secret。OSS通过使用AccessKey ID和AccessKey Secret对称加密的方法来验证某个请求的发送者身份。AccessKey ID用于标识用户;AccessKey Secret是用户用于加密签名字符串和OSS用来验证签名字符串的密钥,必须保密。
有了这个 access key ,我们就能在一些 第三方客户端里面 去访问 阿里云 的oss 服务了。比如 我正在使用 的 typora 加上 oss 作为图片存储。
OSS实例:通过 Java api 访问 一个 oss
首先需要对 oss 进行初始化
我们需要初始化一个 oss client 的实例,才能访问 oss 存储的服务。并且可以再 初始化的 过程中,对 客户端进行 一些自定义配置。
连接到数据库之后,就能通过简单的 Java api 进行 oss 的操作了
BucketInfo info = ossClient.getBucketInfo(bucketName);
System.out.println("Bucket " + bucketName + "的信息如下:");
System.out.println("\t数据中心:" + info.getBucket().getLocation());
System.out.println("\t创建时间:" + info.getBucket().getCreationDate());
System.out.println("\t用户标志:" + info.getBucket().getOwner());
然后是存储的示范:
InputStream is = new ByteArrayInputStream("Hello OSS from TT".getBytes());
ossClient.putObject(bucketName, firstKey, is);
System.out.println("Object:" + firstKey + "存入OSS成功。");
读取操作:
OSSObject ossObject = ossClient.getObject(bucketName, firstKey);
InputStream inputStream = ossObject.getObjectContent();
StringBuilder objectContent = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
while (true) {
String line = reader.readLine();
if (line == null)
break;
objectContent.append(line);
}
inputStream.close();
System.out.println("Object:" + firstKey + "的内容是:" + objectContent);
文件存储操作:
String fileKey = "README.md";
ossClient.putObject(bucketName, fileKey, new File("README.md"));
System.out.println("Object:" + fileKey + "存入OSS成功。");
查看操作:
ObjectListing objectListing = ossClient.listObjects(bucketName);
List<OSSObjectSummary> objectSummary = objectListing.getObjectSummaries();
System.out.println("我们有以下Object:");
for (OSSObjectSummary object : objectSummary) {
System.out.println("\t" + object.getKey());
}
删除操作:
ossClient.deleteObject(bucketName, firstKey);
System.out.println("删除Object:" + firstKey + "成功。");
ossClient.deleteObject(bucketName, fileKey);
System.out.println("删除Object:" + fileKey + "成功。");
上述代码能够顺利连接到 oss 对象存储中心,并对数据库进行一系列操作,运行结果如下:
|