对象存储
网络存储
- NAS: Network Attached Storage的简称,是一个提供了存储功能和文件系统的网络服务器。客户端可以访问NAS上的文件系统,还可以上传和下载文件。NAS客户端和服务端之间使用的协议有SMB、NFS 以及AFS等网络文件系统协议。对于客户端来说,NAS就是一个网络上的文件服务器。
- SAN: Storage Area Network 的简称。和NAS的区别是SAN只提供了块存储,而把文件系统的抽象交给客户端来管理。SAN 的客户端和服务端之间的协议有FibreChannel、iSCSI、ATA over Ethernet(AoE)和 HyperSCSI。对于客户端来说,SAN就是一块磁盘,可以对其格式化、创建文件系统并挂载。
现代的网络存储通常混合使用NAS和SAN,同时提供文件级别的协议和块级别的协议。
网络文件系统、块存储与对象存储的区别
数据管理
- 网络文件系统:数据是以一个个文件的形式来管理
- 块存储:数据是以数据块的形式来管理的,每个数据块有它自己的地址,但是没有额外的背景信息。
- 对象存储:以对象的方式来管理数据的,一个对象通常包含了3个部分:对象的数据、对象的元数据以及一个全局唯一的标识符(即对象的ID)。其中
- 对象的数据就是该对象中存储的数据本身。一个对象可以用来保存大量无结构的数据(例如:音乐的具体内容)。
- 对象的元数据是对象的描述信息,为了和对象的数据本身区分开来,称其为元数据(例如:音乐的名字、大小等)。
- 对象的标识符用于引用该对象。和对象的名字不同,标识符具有全局唯一性。名字不具有这个特性。通常用对象的散列值来做其标识符
数据访问
- 网络文件系统的客户端通过NFS等网络协议访问某个远程服务器上存储的文件。
- 块存储的客户端通过数据块的地址访问SAN上的数据块。
- 对象存储则通过REST网络服务访问对象。
REST为Representational State Transfer的简称。REST网络服务通过标准HTTP服务对网络资源提供一套预先定义的无状态操作。网络资源被定义为可以通过URL 访问的文档或文件。更广发的:网络上一切可以通过任何方式被标识、命名、引用或处理的东西都是一种网络资源。
对于对象存储来说,对象就是一种网络资源,但除了对象本身以外,还需要提供一些其他的网络资源用来访问对象存储的各种功能。客户端向 REST网络服务发起请求并接收响应,以确认网络资源发生了某种变化。HTTP预定义的请求方法(Request Method)通常包括且不限于GET、POST、PUT、DELETE等。它们分别对应不同的处理方式:GET方法在REST 标准中通常用来获取某个网络资源,PUT通常用于创建或替换某个网络资源(注意,它跟PUT的区别是POST一般不同于替换网络资源,如果该资源已经存在,POST通常会返回一个错误而不是覆盖它,POST通常用于创建某个网络资源,DELETE通常用于删除某个网络资源。
对象存储的优势
- 扩展方便:扩展只需要添加新的存储节点就可以
- 低代价的数据冗余能力
单机版对象存储系统
通过在一台服务器上运行一个HTTP服务提供的REST接口,并通过接口实现本地服务器上的对象存取。
REST接口
实现PUT方法和GET方法
对象PUT
1 | PUT /object/<object_name> |
客户端通过PUT方法将一个对象上传至服务器,服务器则将该对象保存在本地磁盘上。/objects/<object_name>
是标识该对象网络资源的URL。URL是Uniform Resource Locator 的简称,也就是一个网络地址,用于引用某个网络资源在网络上的位置。
在对象存储中,通常使用PUT方法来上传一个对象。客户端的PUT请求提供了对象的名字<object_name>
和对象的数据<content of object>
,它们最终被保存在本地磁盘上的文件STORAGE_ROOT/objects/<object_name>
中。$STORAGE_ROOT
环境变量保存着在本地磁盘上的存储根目录的名字。
对象GET
1 | GET /objects/<object_name> |
客户端通过GET方法从服务器上下载一个对象,服务器在本地磁盘上查找并读取该对象,如果该对象不存在,则服务器返回HTTP错误代码404 Not Found
。
在对象存储中,总是使用GET方法来下载一个对象。客户端的GET请求提供了<object_name>
,服务进程从本地磁盘上的文件$STORAGE_ROOT/objects/<object_name>
中读取对象并将其写入HTTP响应正文。
具体实现
main函数
1 | func main() { |
objects包下的Handler
函数、get、put
函数:
1 | package objects |
put方法:
1 | package objects |
get方法:
1 | package objects |
linux下功能测试
运行服务器:
1 | mkdir /tmp/objects |
curl 进行http访问:
1 | curl -v 10.29.102.172:12345/objects/test #默认get操作,此时没有数据,返回404 Not Found |
参考
《分布式对象存储—原理、架构及Go语言实现》