1 dx存儲jj

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會打印錯誤的信息並退出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章