对象存储从理论到实践
1. 三种存储类型
随着PC、平板电脑、智能手机等电子设备的普及,互联网极大的提升了人们的生活水平。网络在丰富人们生活的同时,也产生了庞大的数据量。
图1 各种电子设备
据IDC预测,全球数据总量预计2020年达到44个ZB,我国数据量将达到8060个EB,占全球数据总量的18%。44个ZB是什么规模呢?相当于44万亿GB。
数据量的迅速增加促进了存储行业的发展,硬件方面和软件方面都有了长足的进步。
本文主要对对象存储进行一个简单的说明,希望通过本文,您能对对象存储有个大致的了解。
主流存储类型分为三种:块存储、文件存储以及对象存储
块存储主要是将裸磁盘空间整个映射给主机,按照物理卷或逻辑卷的方式存储数据。特点:速度快、保存的数据尺寸大、数据变化频率高,缺点:可扩展程度小、容量小。(其实我们日常生活中见到的硬盘,就是块存储)
文件存储,典型代表NAS。NAS是类似一个共享文件夹,用户可以通过相应的传输协议,把数据放在上面。容量相对较大,但是速度较慢。
下面说到对象存储了,不知道大家有没有思考过一个问题。每天微信朋友圈或者微博,以及最近爆火的那些小视频app,用户上传了海量的图片或者视频,它们都是存放在什么地方的呢?我个人认为,对象存储,是存储它们的一个不错选择。
对象存储,对象指的是面向对象,集合了块存储和文件存储的优点,拥有速度快、容量大等特性。并且容易搭配云计算,是一种新的网络存储架构。
当然,三种存储类型并不是完全独立的,还是有依赖关系的。对象存储在底层存储介质方面上,还是部分依赖块存储和文件存储的。
图2 三种存储类型依赖关系
为了更好的说明三者的差异,我打个比方,假设有三个人想从A地到B地,现在有三种交通方式。甲选择轿车、乙选择公共汽车、丙选择地铁。块存储类似于轿车,速度快,但是容量小(轿车只能乘坐几个人);文件存储类似于公共汽车,速度慢(公共汽车有站点和红绿灯需要考虑),但是容量较大(能多坐不少人);对象存储类似于地铁,速度快,容量大。
图3 三种存储类型类比
2.对象存储原理
2.1 对象数据组成结构
与块存储和文件存储管理数据的方式不同,对象存储是以对象的形式管理数据的。对象和文件最大的不同,就是在文件基础之上增加了元数据。一般情况下,对象分为三个部分:数据、元数据以及对象id。
对象的数据通常是无结构的数据,比如:图片、视频或文档等;对象的元数据则指的是对象的相关描述,比如:图片的大小、文档的拥有者等;对象id则是一个全局的唯一标识符,用来区分对象的。
2.2 对象访问方式
对象存储,访问对象的方式很方便,是通过REST接口对对象进行操作,用HTTP动词(GET、POST、PUT、DELETE等)描述操作。除此之外,还有一种访问方式,就是使用各大云商提供的客户端去操作对象。比如:Amazon的s3cmd、阿里云的osscmd/ossutil、腾讯云的coscmd等。这些客户端都是各个云商开发出来,可以以命令行的形式在操作系统中操作对象的工具,各大云商都有详细的文档说明,在这就不一一赘述了。
2.3 对象存储优缺点
先说优点,之前大概也提了下:
可扩展性高:对象存储能够扩展数十乃至数百EB的容量,能够充分利用高密度存储;
效率高:扁平化结构,不受复杂目录系统对性能的影响;
无需迁移:对象存储是一种横向扩展系统,随着容量的增加,数据根据算法自动分布于所有的对象存储节点;
安全性高:对象存储通常凭借HTTP调用对象存储本身提供的认证密钥来提供数据访问;
访问方便:不光支持HTTP(S)协议,采用REST的API方式调用和检索数据,同样增加了NFS和SMB支持;
成本相对低:与块存储方式相比,对象存储是最具成本效益的数据存储类型,并且与云计算搭配,把对象存储的这一特性发挥的淋漓尽致。
再提缺点:
最终一致性:由于不同节点的位置不同,数据同步时可能会有一定时间的延迟或者错误;
不易做数据库:对象存储比较适合存储那些变动不大甚至不变的文件,而对于像数据库这种需要直接与存储裸盘相互映射的应用,还是块存储更合适。
3. 对象存储应用
前面说了许多定义,可能许多朋友还是云里雾里的,不知道对象存储怎么使用。下面,我以腾讯云的对象存储(cos)为例,使用python的代码方式来实际应用一下。
cos有一个存储桶(bucket,其他云商也有)的概念,它是对象的载体,可理解为存放对象的“容器”。用户可以通过腾讯云控制器、API、SDK等多种方式管理以及配置存储桶。下图是功能的整个流程图,具体含义后面会介绍:
图4 上传图片和查看图片流程图
3.1 创建bucket
我就不用代码的方式创建存储桶了,直接在腾讯控制台创建一个bucket,命名为“tyun-cn-test”。bucket有三种类型私有读写、公有读私有写、公有读写,凡是带“私有”二字的,是需要请求签名的。为了测试完整,我选择私有读写的方式,来做一个上传图片的功能。
创建完bucket之后,就可以写代码了,我使用cos提供的API进行图片上传。因为我选择的bucket是私有读写的,所以上传图片之前,还需要先生成一个请求签名。
3.2 生成cos的请求签名
图5 生成密钥的python代码
cos的请求签名的文档写的挺详细,不过它是以PHP的方式举例的,我把它重新用python封装了一个函数,有几个参数需要注意。
函数中,sign_time为签名的有效时间,http_method为操作方式(上传文件时用PUT,获取文件时用GET),remote_file_name为上传到cos的文件名,api_url为bucket的访问地址,secret_id和secret_key都是腾讯云API密钥。
3.3 上传图片到cos
上传图片到cos的整个流程:先通过POST方式暂时把图片上传到后端服务器,然后调用cos的API,使用PUT的方式把图片上传到cos,之后返回一个图片的cos地址,最后删除后端服务器上的图片。
图6 服务器上image上传到cos代码
上图,就是把图片从服务器上传到cos的大致实现,其中fname是图片在服务器上的地址,_get_cos_sign()函数就是前面生成请求签名的函数。
需要注意的是,上传图片(PUT)和获取图片(GET)的方式不同,所以生成请求签名的时传递的http_method也需要区分。访问返回的图片地址,就会发现图片已经上传成功到cos上了。
4.总结
对象存储,作为一个新的存储类型,在云计算高速发展的今天,有着很大的用武之地。不过,尽管有着扩展性好、效率高等优点,其一致性仍是不好处理的问题。所以,不能把鸡蛋放在同一个篮子里。合理选择存储类型,对用户和企业来说,都是一个需要考虑的问题。
黄平安 新钛云服后端研发工程师,两年研发和架构经验,曾在威锋网任职后端工程师,参与并主导过产品设计、研发、测试和运维(威锋网的rds、威锋搜索)等完整产品生命周期流程,python、php开发者,狂热技术爱好者。solr、zookeeper、saltstack、influxdb等开源项目爱好者和研究者。
↓↓ 点击"阅读原文" 【加入云技术社区】
相关阅读:
更多文章请关注