传统的网络存储:NAS和SAN
NAS是Network Attached Storage 的简称,提供存储功能和文件系统的网络服务器。客户端可以访问 NAS 上的文件系统,还可以上传和下载文件。NAS 客户端和服务端之间使用的协议有 SMB、NFS以及AFS等网络文件系统协议。对于客户端来说,NAS 就是一个网络上的文件服务器。
SAN是 StorageArea Network 的简称。它和NAS 的区别是SAN 只提供了块存储而把文件系统的抽象交给客户端来管理。 SAN 的客户端和服务端之间的协议有 FibreChannel、iSCSI、ATA over Ethernet (AoE)和HyperSCSI。对于客户端来说,SAN 就是一块磁盘,可以对其格式化、创建文件系统并挂载。
NAS和SAN并不是完全对立的,现代的网络存储通常都是两合使用,可以同时提供文件级别的协议和块级别的协议。
对象存储
数据的管理方式
网络文件系: 数据以一个个文件的形式来管理。
块存储: 据是以数据块的形式来管理,每个数据块有它自己的地址,但是没有额外的背景信息。
对象存储: 以对象的方式来管理数据。包含对象的数据、对象的元数据以及一个全局唯一的标识符(即对象的ID)
- 对象的数据: 一个对象可以用来保存大量无结构的数据,比如一首歌、一张照片或是一个在线文档。
- 对象的元数据是对象的描述信息。比如某首歌的歌名、某张照片拍摄的时间、某个文档的大小等都属于描述信息,也就是元数据。
- 对象的标识符用于引用该对象。标识符具有全局唯一性。
通常我们用对象的散列值来做其标识符。
访问数据的方式
- 网络文件系统:通过NFS等网络协议访问某个远服务器上存储的文件。
- 块存储:通过数据块的地址访问 SAN 上的数据块。
- 对象存储:通过 REST网络服务访问对象。
REST是 Representational State Transfer 的简称。REST网络服务通过标准HTTP服务对网络资源提供一套预先定义的无状态操作。
网络上一切可以通过任何方式被标识、命名、引用或处理的东西都是一种网络资源。因此对象也是一种网络资源。
HTTP 预定义的请求方法(Request Method)通常包括:GET 方法在 REST 标准中通常用来获取某个网络资源;PUT 通常用于创建或替换某个网络资源(注意,它跟 PUT 的区别是POST一般不同于替换网络资源,如果该资源已经存在,POST通常会返回一个错误而不是覆盖它);POST 通常用于创建某个网络资源,DELETE 通常用于删除某个网络资源。
对象存储的优势
- 对象存储提升了存储系统的扩展性。随着存储系统中保存的数据越来越多时,传统网络存储系统的管理开销会呈指数上升。而对象存储架构的扩展只需要添加新的存储节点就可以。
- 对象存储以更低的代价提供了数据冗余的能力。在分布式对象存储系统中一个或多个节点失效的情况下,对象依然可用,且大多数情况下客户都不会意识到有节点出了问题。传统网络存储对于数据冗余通常采用的方式是保留多个副本(一般至少 3 份,这样当其中一个副本出了错,我们还能用少数服从多数的方式解决争议),而对象存储的冗余效率则更高。
单机版对象存储的架构
在一台服务器上运行了一个 HTTP 服务提供的 REST 接口,该服务通过访问本地磁盘来进行对象的存取。
REST接口
PUT /objects/<object_name>
请求正文(Request Body)
客户端通过 PUT 方法将一个对象上传至服务器,服务器则将该对象保存在本地磁盘上。
/objects/<object_name> 是标识该对象网络资源的URL。
GET /objects/<object name>
响应正文(Response Body)
客户端通过 GET 方法从服务器上下载一个对象,服务器在本地磁盘上查找并读取该对象,如果该对象不存在,则服务器返回HTTP 错误代码404 Not Found。