分布式对象存储——原理、架构及Go语言实现 - (EPUB全文下载)
文件大小:0.15 mb。
文件格式:epub 格式。
书籍内容:
分布式对象存储——原理、架构及Go语言实现
第1章 对象存储简介
第2章 可扩展的分布式系统
第3章 元数据服务
第4章 数据校验和去重
第5章 数据冗余和即时修复
第6章 断点续传
第7章 数据压缩
第8章 数据维护
第1章 对象存储简介
1.1 和传统网络存储的区别
要理解对象存储,我们首先要来谈谈传统的网络存储。传统的网络存储主要有两类,分别是NAS和SAN。
NAS是Network Attached Storage的简称,是一个提供了存储功能和文件系统的网络服务器。客户端可以访问NAS上的文件系统,还可以上传和下载文件。NAS客户端和服务端之间使用的协议有SMB、NFS以及AFS等网络文件系统协议。对于客户端来说,NAS就是一个网络上的文件服务器。
SAN是Storage Area Network的简称。它和NAS的区别是SAN只提供了块存储,而把文件系统的抽象交给客户端来管理。SAN的客户端和服务端之间的协议有Fibre Channel、iSCSI、ATA over Ethernet(AoE)和HyperSCSI。对于客户端来说,SAN就是一块磁盘,可以对其格式化、创建文件系统并挂载。
NAS和SAN并不是完全对立的,现代的网络存储通常都是两者混合使用,可以同时提供文件级别的协议和块级别的协议。
介绍完传统的网络存储,那么对象存储跟它们又有什么区别呢?首先是对数据的管理方式不同。
1.1.1 数据的管理方式
对于网络文件系统来说,数据是以一个个文件的形式来管理的;对于块存储来说,数据是以数据块的形式来管理的,每个数据块有它自己的地址,但是没有额外的背景信息;对象存储则是以对象的方式来管理数据的,一个对象通常包含了3个部分:对象的数据、对象的元数据以及一个全局唯一的标识符(即对象的ID)。
对象的数据就是该对象中存储的数据本身。一个对象可以用来保存大量无结构的数据,比如一首歌、一张照片或是一个在线文档。
对象的元数据是对象的描述信息,为了和对象的数据本身区分开来,我们称其为元数据。比如某首歌的歌名、某张照片拍摄的时间、某个文档的大小等都属于描述信息,也就是元数据。对于对象的元数据,我们在第3章会详细介绍,这里不多展开。
对象的标识符用于引用该对象。和对象的名字不同,标识符具有全局唯一性。名字不具有这个特性,例如张三家的猫名字叫阿黄,李四家的狗名字也可以叫阿黄,名字为阿黄的对象可以有很多个。但若是用标识符来引用就只可能有一个。通常我们会用对象的散列值来做其标识符,关于散列值的详细介绍见第3章。
除了对数据的管理方式不同以外,对象存储跟网络存储访问数据的方式也不同。
1.1.2 访问数据的方式
网络文件系统的客户端通过NFS等网络协议访问某个远程服务器上存储的文件。块存储的客户端通过数据块的地址访问SAN上的数据块。对象存储则通过REST网络服务访问对象。
REST是Representational State Transfer的简称。REST网络服务通过标准HTTP服务对网络资源提供一套预先定义的无状态操作。在万维网刚兴起的时候,网络资源被定义为可以通过URL访问的文档或文件。现如今对于它的定义已经更为宽泛和抽象:网络上一切可以通过任何方式被标识、命名、引用或处理的东西都是一种网络资源。对于对象存储来说,对象当然就是一种网络资源,但除了对象本身以外,我们也需要提供一些其他的网络资源用来访问对象存储的各种功能,本书后续会一一介绍。
客户端向REST网络服务发起请求并接收响应,以确认网络资源发生了某种变化。HTTP预定义的请求方法(Request Method)通常包括且不限于GET、POST、PUT、DELETE等,它们分别对应不同的处理方式:GET方法在REST标准中通常用来获取某个网络资源;PUT通常用于创建或替换某个网络资源(注意,它跟POST的区别是POST一般不同于替换网络资源,如果该资源已经存在,POST通常会返回一个错误而不是覆盖它);POST通常用于创建某个网络资源,DELETE通常用于删除某个网络资源。
我们会在本书的后续章节看到对象存储的接口是如何使用这些HTTP请求方法的。
1.1.3 对象存储的优势
对象存储首先提升了存储系统的扩展性。当一个存储系统中保存的数据越来越多时,存储系统也需要同步扩展,然而由于存储架构的硬性限制,传统网络存储系统的管理开销会呈指数上升。而对象存储架构的扩展只需要添加新的存储节点就可以。
对象存储的另一大优势在于以更低的代价提供了数据冗余的能力。在分布式对象存储系统中一个或多个节点失效的情况下,对象依然可用,且大多数情况下客户都不会意识到有节点出了问题。传统网络存储对于数据冗余通常采用的方式是保留多个副本(一般至少3份,这样当其中一个副本出了错,我们还能用少数服从多数的方式解决争议),而对象存储的冗余效率则更高。我们会在第5章讨论数据冗余的问题。
本章将要实现的是一个单机版的对象存储原型,目的是让读者对我们讨论的对象存储有一个直观的了解。一个单机版的服务程序还称不上分布式服务,但是我们可以借此了解对象存储的接口,也就是说我们将了解客户端是如何通过REST接口上传和下载一个对象的,以及这个对象又是以什么样的形式被保存在服务器端的。从下一章开始,我们还将不断丰富架构和功能来适应各种新的需求。
1.2 单机版对象存储的架构
在一台服务器上运行了一个HTTP服务提供的REST接口,该服务通过访问本地磁盘来进行对象的存取,见图1-1。
图1-1 单机版对象存储的架构
1.2.1 REST接口
单机版的REST接口极其简单,只实现了对象的PUT和GET方法。
PUT /objects/
请求正文(Request Body)
客户端通过PUT方法将一个对象上传至服务器,服务器则将该对象保存在本地磁盘上。
这里/objects/
以上为书籍内容预览,如需阅读全文内容请下载EPUB源文件,祝您阅读愉快。
书云 Open E-Library » 分布式对象存储——原理、架构及Go语言实现 - (EPUB全文下载)