從網絡文件系統到對象存儲,聊聊對象存儲的前世今生

雲棲號資訊:【點擊查看更多行業資訊
在這裏您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!

每種技術的產生都有其原因,也有其淵源。網絡文件系統的產生有幾十年的歷史了,但是由於在互聯網盛行的當下無法滿足某些需求,於是對象存儲產生了。今天我們就從從網絡文件系統說起。

image

早些時候的企業級架構普遍採用網絡文件系統,這其中最爲著名的就是Sum的NFS了。微軟也有類似的網絡文件系統,也就是SMB。網絡文件系統的原理很簡單,其目的就是將存儲系統上的文件系統映射到計算節點(比如Web服務器)。這樣可以實現存儲資源的共享,提高存儲資源的利用率。具體映射方式如下所示。

image

但是文件系統有個天然的缺點。由於文件系統空間組織的特點,導致對文件訪問的時候需要比較多次的磁盤訪問。

以Ext4文件系統爲例,文件系統將磁盤空間分爲兩個主要的區域,一個是元數據區,用於存儲文件inode等信息;另外一個是數據區,用於存儲文件的數據,也就是用戶數據,具體如下圖所示。

image

這樣,當我們訪問一個文件的時候,首先需要找到文件對應的inode,然後根據inode信息找到數據的位置,並讀取數據。這個過程可能要涉及到2-3次的磁盤訪問。對於互聯網應用來說,多次磁盤訪問會顯著降低性能,影響用戶的體驗。

當然,除此之外還有其它一些問題,比如橫向擴展能力等。其實本質上來說,文件系統的目的是一個通用的存儲形態,其目的是爲了適用大多數的應用場景(比如文件鎖,擴展屬性,ACL等等)。而網絡文件系統爲了保證與文件系統語義的一致性,也需要實現這些特性,這就導致網絡文件系統比較臃腫。

對象存儲解決的問題

由於上述缺點,傳統的網絡文件系統是完全無法滿足互聯網領域應用的。我們舉一個例子,以FaceBook爲例,其每秒鐘都有幾十萬次的照片檢索請求。其存儲的照片總量每天新增3.5億張,對應的存儲增量大概在300TB左右。如果對應物理設備,每天大概需要新增上百塊硬盤。

這種問題在任何互聯網公司都會遇到的問題。比如國內的頭條,淘寶或者京東等等,在它們的平臺上每天也要產生海量的圖片訪問。傳統存儲很難滿足其性能和擴展性的要求。

雖然互聯網應用對性能和容量的要求極高,但是對其它特性卻沒什麼特別的要求。甚至可以說它對其它特性基本上沒有太多要求。由於其存儲的主要是圖片,而且對圖片的存儲是一次存儲,多次訪問,沒有修改。

爲了解決上述問題,對象存儲應運而生。可以看出對象存儲解決的問題很集中,如何保證橫向擴展能力、降低訪問延時。而不需要實現文件系統的其它額外特性(後面我們會介紹對象存儲還有一些高級特性)。下面是維基百科對對象存儲的定義。

Object storage (also known as object-based storage) is a computer data storage architecture that manages data as objects

從定義可以看出,對象存儲在數據處理層面的特點是將待處理的數據看做一個整體,這也就是爲什麼把它稱爲對象,而不是文件了。

其實對象存儲也並非全部如此簡單,很多對象存儲也實現了比較複雜的功能特性。比如S3對象存儲可以支持大數據處理、擴展屬性和二次處理(比如照片的轉換,水印等)等特性。

對象存儲的常見架構

爲了讓大家對對象存儲有更加深刻的理解,我們介紹一下常見對象存儲的架構。雖然亞馬遜的S3非常出名,但是並沒有公開太多技術信息,其架構也無從瞭解。今天本文將介紹一下比較流行的其它對象存儲的架構。

Swift對象存儲

首先介紹一下開源對象存儲Swift的架構。Swift是OpenStack的一個子項目,是非常流行的開源對象存儲軟件。Swift在OpenStack中主要用作虛擬機鏡像,其特點也是存儲大對象。對於小對象則想多弱勢。

Swift最主要的是實現橫向擴展能力,其前端有一個Proxy組件,該組件實現了數據的分發服務。該組件可以具備多個實例,每個實例可以安裝在一臺物理服務器。由於Proxy可以橫向擴展,因此不會成爲性能瓶頸。

image

在Proxy中最核心的算法是進行數據放置的一致性哈希算法。該算法實現了將一個對象映射到物理設備的過程。爲了保證整個系統的可靠性和可用性,Swift將設備劃分爲若干等級,比如Zone,Host和Disk。通過不同設備的分發,實現故障域的隔離。

image

如上圖哈希算法,首先將物理設備映射到哈希環上;當有對象訪問的時候根據對象名稱計算出哈希值,然後將對象映射到具體的物理設備上。

Haystack對象存儲

Facebook這對其照片應用開發了Haystack對象存儲。Haystack與前面Switf的差異是其存儲的是小對象。因爲圖片通常在10MB以下,大部分在KB級別。因此Haystack除了保證系統的橫向擴展能力外,其最主要的是實現對小文件的處理。

前面我們說過,對於小文件的性能問題,普通文件系統的問題在於多次讀盤操作。而Haystack正式解決了該問題。

Haystack的做法非常簡單,它將多個小文件作爲一個大文件的局部數據,這個局部數據稱爲needle。同時Haystack構建了一個描述needle在大文件中位置的索引文件。由於索引文件比較小,因此可以一次性的加載到內存當中。

image

通過這種方式,當客戶端需要訪問數據的時候,在存儲節點可以直接從內存中得到數據的位置,並一次從磁盤上讀取數據。這樣訪問存儲的性能得到大幅的提升。

由於篇幅有限,本文先介紹到這裏,關於存儲技術的更多細節,還請關注本號。本號後續還會步步深入,介紹關於存儲技術的諸多細節。

【雲棲號在線課堂】每天都有產品技術專家分享!
課程地址:https://yqh.aliyun.com/live

立即加入社羣,與專家面對面,及時瞭解課程最新動態!
【雲棲號在線課堂 社羣】https://c.tb.cn/F3.Z8gvnK

原文發佈時間:2020-07-28
本文作者:SunnyZhang的IT世界
本文來自:“51CTO”,瞭解相關信息可以關注“51CTO

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