Network Attached Storage一个提供了存储功能和文件系统的网络服务器。客户端可访问NAS上的文件系统,还可上传和下载文件。NAS客户端和服务端之间使用的协议SMB、NFS以及AFS等网络文件系统协议对于客户端,NAS就是一个网络上的文件服务器。
Storage Area Network的简称。和NAS的区别 SAN只提供了块存储,把文件系统的抽象交给客户端来管理。 SAN的客户端和服务端之间的协议有 Fibre Channel、 E ISCSI、 ATA over Ethernet(AoE)和 Hyperscsi。 对于客户端来说,SAN就是一块磁盘,可对其格式化、创建文件系统并挂载
NAS和SAN不完全对立,现代的网络存储两者混合用,可同时提供文件级别的协议和块级别的协议。
对象存储跟它们有什么区别?首先是对数据的管理方式不同。
对象的数据就是该对象中存储的数据本身。一个对象可以用来保存大量无结构的数据,比如一首歌、一张照片或是一个在线文档
元数据是对象的描述信息,为了和对象的数据本身区分开来,我们称其为元数据。某首歌的歌名、某张照片拍摄的时间、某个文档的大小等都属于描述信息,也就是元数据。元数据第3章会详细介绍
对象的标识符用于引用该对象。和对象的名字不同,标识符具有全局唯一性。名字不具有这个特性,名字为阿黄的对象可以有很多个。但若是用标识符来引用就只可能有一个。通常用对象的散列值来做其标识符,关于散列值的详细介绍见第3章
除了对数据的管理方式不同以外,对象存储跟网络存储访问数据的方式也不同。
Representational State Transfer。
REST网络服务通过标准HTP服务对网络资源提供一套预先定义的无状态操作
万维网刚兴起时,网络资源被定义为可通过URL访问的文档或文件。
现对于它的定义已更宽泛和抽象
网络上一切可通过任何方式被标识、命名、引用或处理的东西都是网络资源
对对象存储来说,
对象就是一种网络资源,除对象本身以外,也需提供一些其他的网络资源用来访问对象存储的各种功能,本书后续一一介绍客户端向REST网络服务发起请求并接收响应,以确认网络资源发生了某种变化HTTP预定义的请求方法(RequestMethod) 包括且不限于GET、POST、PUT、DELETE等 GET在REST标准中获取某个网络资源PUT创建或替换某个网络资源(POST一般不同于替换网络资源,如果该资源已经存在,POST通常会返回一个错误而不是覆盖它);POST创建某个网络资源,DELETE删除某个网络资源。
后续章节看到对象存储的接口是如何使用这些HTTP请求方法
以更低代价提供了数据冗余在分布式对象存储系统中一个或多个节点失效情况下,对象依然可用,大多数情况下客户都不会意识到有节点出问题传统网络存储对于数据冗余通常采用的方式是保留多副本(至少3份,一个副本出了错,还能用少数服从多数的方式解决争议)而对象存储的冗余效率更高第5章讨论数据冗余
本章要实现一个单机版的对象存储原型, 对象存储有一个直观的了解。 单机版的服务程序还称不上分布式服务, 但可借此了解对象存储的接口,也就是将了解客户端是如何通过REST接口上传和下载一个对象 这个对象又是以什么样的形式被保存在服务器下一章还将不断丰富架构和功能来适应各种新需求
PUT /objects/<object_name> 请求正文( Request Body)
客户端通过PUT将一个对象上传至服务器,服务器则将该对象保存在本地磁盘上。
/objects/<object_name>是标识该对象网络资源的URL。
URL是 Uniform Reesource Locator
也就是一个网络地址,用于引用某个网络资源在网络上的位置。
对象存储中,PUT方法来上传一个对象。
GET /objects/<obiect_name> 响应正文(Response Body)
客户端通过GET从服务器上下载一个对象,服务器在本地磁盘上查找并读取该对象,如果该对象不存在,则服务器返回HTP错误代码404 Not Found在对象存储中,总用GET来下载一个对象
客户端的PUT请求提供对象的名字<object_name> 和对象的数据 它们最终被保存在本地磁盘上的文件$STORAGE_ROOT/objects/<object_name>中$STORAGE_ROOT环境变量保存本地磁盘上的存储根目录的名字
客户端的GET请求提供了<object_name>我们的服务进程从本地磁盘上的文件$STORAGE_ROOT/objects/<object_name>中读取对象并将其写入HTTP响应正文
看一下如何用Go实现这样一个服务
注册成功后,调http.ListenAndServe监听端口该端口由系统环境变量 LISTEN_ADDRESS定义正常情况下该函数永不返回,程序运行后会始终监听端口上的请求, 除非发送信号中断进程。 非正常情况下,该函数会将错误返回, 此时log.Fatal会打印错误的信息并退出
objects.Handler函数属objects包, 该包一共有3函数,还有put和get。在Go中,变量或函数名首字母大写,意味该变量或函数可在包外部被引用;小写,意味着该变量或函数名仅可在包内部被引用。 H大写就表明该函数可以在 objects包外部被调用(被main包的main函数调用),而put和get函数则仅在 objects包内部可见。 Handler函数 见例1-2。