1 dx存储jj

    技术2022-07-15  37

    文章目录

    1.1和传统网络存储的区别1.1.1数据的管理方式1.1.2 访问数据的方式1.1.3对象存储的优势 1.2单机版对象存储的架构1.2.1 REST接口1.2.2对象PUT流程1.2.3 对象GET流程 1.3 Go语言实现

    1.1和传统网络存储的区别

    要理解对象存储,先谈传统的网络存储。传统的网络存储主要,NAS和SAN。

    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不完全对立,现代的网络存储两者混合用,可同时提供文件级别的协议和块级别的协议。

    对象存储跟它们有什么区别?首先是对数据的管理方式不同。

    1.1.1数据的管理方式

    对网络文件系统来说,数据是以一个个文件的形式来管理的;对块存储,数据是以数据块的形式来管理的,每个数据块有它自己的地址,但没有额外的背景信息;对象存储则是以对象的方式来管理数据的,一个对象通常包含了3个部分:对象的数据、对象的元数据以及一个全局唯一的标识符(即对象的ID)。

    对象的数据就是该对象中存储的数据本身。一个对象可以用来保存大量无结构的数据,比如一首歌、一张照片或是一个在线文档

    元数据是对象的描述信息,为了和对象的数据本身区分开来,我们称其为元数据。某首歌的歌名、某张照片拍摄的时间、某个文档的大小等都属于描述信息,也就是元数据。元数据第3章会详细介绍

    对象的标识符用于引用该对象。和对象的名字不同,标识符具有全局唯一性。名字不具有这个特性,名字为阿黄的对象可以有很多个。但若是用标识符来引用就只可能有一个。通常用对象的散列值来做其标识符,关于散列值的详细介绍见第3章

    除了对数据的管理方式不同以外,对象存储跟网络存储访问数据的方式也不同。

    1.1.2 访问数据的方式

    网络文件系统的客户端通过NFS等网络协议访问某个远程服务器上存储的文件。块存储的客户端通过数据块的地址访问SAN上的数据块。对象存储通过REST网络服务访问对象

    Representational State Transfer。

    REST网络服务通过标准HTP服务对网络资源提供一套预先定义的无状态操作

    万维网刚兴起时,网络资源被定义为可通过URL访问的文档或文件。

    现对于它的定义已更宽泛和抽象

    网络上一切可通过任何方式被标识、命名、引用或处理的东西都是网络资源

    对对象存储来说,

    对象就是一种网络资源,除对象本身以外,也需提供一些其他的网络资源用来访问对象存储的各种功能,本书后续一一介绍

    客户端向REST网络服务发起请求并接收响应,以确认网络资源发生了某种变化HTTP预定义的请求方法(RequestMethod) 包括且不限于GET、POST、PUT、DELETE等 GET在REST标准中获取某个网络资源PUT创建或替换某个网络资源(POST一般不同于替换网络资源,如果该资源已经存在,POST通常会返回一个错误而不是覆盖它);POST创建某个网络资源,DELETE删除某个网络资源。

    后续章节看到对象存储的接口是如何使用这些HTTP请求方法

    1.1.3对象存储的优势

    提升了存储系统的扩展性。存储系统中保存的数据越来越多,存储系统也需要同步扩展, 由于存储架构的硬性限制,传统网络存储系统的管理开销会呈指数上升。而对象存储架构的扩展只需要添加新的存储节点就可。

    以更低代价提供了数据冗余在分布式对象存储系统中一个或多个节点失效情况下,对象依然可用,大多数情况下客户都不会意识到有节点出问题传统网络存储对于数据冗余通常采用的方式是保留多副本(至少3份,一个副本出了错,还能用少数服从多数的方式解决争议)而对象存储的冗余效率更高第5章讨论数据冗余

    本章要实现一个单机版的对象存储原型, 对象存储有一个直观的了解。 单机版的服务程序还称不上分布式服务, 但可借此了解对象存储的接口,也就是将了解客户端是如何通过REST接口上传和下载一个对象 这个对象又是以什么样的形式被保存在服务器下一章还将不断丰富架构和功能来适应各种新需求

    1.2单机版对象存储的架构

    一台服务器上运行一个HTTP服务提供的REST接口,该服务通过访问本地磁盘来对象的存取,见图1-1。

    1.2.1 REST接口

    单机版的REST接口简单,只实现了对象的PUT和GET

    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来下载一个对象

    1.2.2对象PUT流程

    简单的图来概括PUT流程,见图1-2

    客户端的PUT请求提供对象的名字<object_name> 和对象的数据 它们最终被保存在本地磁盘上的文件$STORAGE_ROOT/objects/<object_name>中$STORAGE_ROOT环境变量保存本地磁盘上的存储根目录的名字

    1.2.3 对象GET流程

    客户端的GET请求提供了<object_name>我们的服务进程从本地磁盘上的文件$STORAGE_ROOT/objects/<object_name>中读取对象并将其写入HTTP响应正文

    看一下如何用Go实现这样一个服务

    1.3 Go语言实现

    Go语言也有一个main函数作为系统的入口。main函数中需注册一个HTTP处理函数并开始监听端口,见例1-1。

    func main() { http.HandleFunc("/objects/",objects.Handler) log.Fatal(http.ListenAndServe(os.Getenv("LISTEN_ADDRESS"),nil)) } http.HandleFunc注册HTTP处理函数objects.Handler, 客户端访问本机的HTTP服务且URL以“/objects/开头,那该请求将由objects.Handler处理。除此以外的HTTP请求会默认返回HTTP错误代码404NotFound。

    注册成功后,调http.ListenAndServe监听端口该端口由系统环境变量 LISTEN_ADDRESS定义正常情况下该函数永不返回,程序运行后会始终监听端口上的请求, 除非发送信号中断进程。 非正常情况下,该函数会将错误返回, 此时log.Fatal会打印错误的信息并退出

    objects.Handler函数属objects包, 该包一共有3函数,还有put和get。在Go中,变量或函数名首字母大写,意味该变量或函数可在包外部被引用;小写,意味着该变量或函数名仅可在包内部被引用。 H大写就表明该函数可以在 objects包外部被调用(被main包的main函数调用),而put和get函数则仅在 objects包内部可见。 Handler函数 见例1-2。

    Processed: 0.018, SQL: 9