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