一文講清:對象存儲、文件存儲、塊存儲。絕對好文

從應用角度看塊存儲、文件存儲、對象存儲

 

產品和市場需求有各種相互影響的關係,但不管是哪一種,最終呈現都是產品和應用需求需要對應匹配。應用需求越多樣化,市場也就劃分得更加細,產品種類也就更加豐富。在存儲行業,我們也可以從“應用適配”這個角度來聊聊各類存儲。

傳統認知上來說,IT設備分爲計算/存儲/網絡三大類,相互之間是有明顯的楚河漢界的。計算大家都清楚,服務器,小型機,大型機;網絡也就是路由器交換機;存儲有內置存儲和外置存儲,最常見的就是磁盤陣列。在HCI(超融合)這個概念沒被熱炒之前,計算網絡存儲還都是涇渭分明,各擔其責的。今天我們先不討論超融合的情況,僅基於傳統理解,看看存儲的情況。

從邏輯上存儲通常分爲塊存儲,文件存儲,對象存儲。這三類存儲在實際應用中的適配環境還是有着明顯的不同的。

塊存儲(DAS/SAN)通常應用在某些專有的系統中,這類應用要求很高的隨機讀寫性能和高可靠性,上面搭載的通常是Oracle/DB2這種傳統數據庫,連接通常是以FC光纖(8Gb/16Gb)爲主,走光纖協議。如果要求稍低一些,也會出現基於千兆/萬兆以太網的連接方式,MySQL這種數據庫就可能會使用IP SAN,走iSCSI協議。通常使用塊存儲的都是系統而非用戶,併發訪問不會很多,經常出現一套存儲只服務一個應用系統,例如如交易系統,計費系統。典型行業如金融,製造,能源,電信等。

文件存儲(NAS)相對來說就更能兼顧多個應用和更多用戶訪問,同時提供方便的數據共享手段。畢竟大部分的用戶數據都是以文件的形式存放,在PC時代,數據共享也大多是用文件的形式,比如常見的的FTP服務,NFS服務,Samba共享這些都是屬於典型的文件存儲。幾十個用戶甚至上百用戶的文件存儲共享訪問都可以用NAS存儲加以解決。在中小企業市場,一兩臺NAS存儲設備就能支撐整個IT部門了。CRM系統,SCM系統,OA系統,郵件系統都可以使用NAS存儲統統搞定。甚至在公有云發展的早幾年,用戶規模沒有上來時,雲存儲的底層硬件也有用幾套NAS存儲設備就解決的,甚至雲主機的鏡像也有放在NAS存儲上的例子。文件存儲的廣泛兼容性和易用性,是這類存儲的突出特點。但是從性能上來看,相對SAN就要低一些。NAS存儲基本上是以太網訪問模式,普通千兆網,走NFS/CIFS協議。

對象存儲概念出現得晚一些,存儲標準化組織SINA早在2004年就給出了定義,但早期多出現在超大規模系統,所以並不爲大衆所熟知,相關產品一直也不溫不火。一直到雲計算和大數據的概念全民強推,才慢慢進入公衆視野。

前面說到的塊存儲和文件存儲,基本上都還是在專有的局域網絡內部使用,而對象存儲的優勢場景卻是互聯網或者公網,主要解決海量數據,海量併發訪問的需求。基於互聯網的應用纔是對象存儲的主要適配(當然這個條件同樣適用於雲計算,基於互聯網的應用最容易遷移到雲上,因爲沒出現雲這個名詞之前,他們已經在上面了),基本所有成熟的公有云都提供了對象存儲產品,不管是國內還是國外。

對象存儲常見的適配應用如網盤、媒體娛樂,醫療PACS,氣象,歸檔等數據量超大而又相對“冷數據”和非在線處理的應用類型。這類應用單個數據大,總量也大,適合對象存儲海量和易擴展的特點。網盤類應用也差不多,數據總量很大,另外還有併發訪問量也大,支持10萬級用戶訪問這種需求就值得單列一個項目了(這方面的掃盲可以想想12306)。歸檔類應用只是數據量大的冷數據,併發訪問的需求倒是不太突出。

另外基於移動端的一些新興應用也是適合的,智能手機和移動互聯網普及的情況下,所謂UGD(用戶產生的數據,手機的照片視頻)總量和用戶數都是很大挑戰。畢竟直接使用HTTP get/put就能直接實現數據存取,對移動應用來說還是有一定吸引力的。

對象存儲的訪問通常是在互聯網,走HTTP協議,性能方面,單獨看一個連接的是不高的(還要解決掉線斷點續傳之類的可靠性問題),主要強大的地方是支持的併發數量,聚合起來的性能帶寬就非常可觀了。

從產品形態上來看,塊存儲和文件存儲都是成熟產品,各種規格形態的硬件已經是琳琅滿目了。但是對象存儲通常你看到都是一堆服務器或者增強型服務器,畢竟這東西現在還是互聯網行業用得多點,DIY風格。

關於性能容量等方面,我做了個圖,對三種存儲做直觀對比。

塊存儲就像超跑,根本不在意能不能多載幾個人,要的就是極限速度和高速下的穩定性和可靠性,各大廠商出新產品都要去紐北賽道刷個單圈最快紀錄,千方百計就爲提高一兩秒,跑不進7分以內都看不到前三名。(塊存儲容量也不大,TB這個數量級,支持的應用和適用的環境也比較專業(FC Oracle),在乎的都是IOPS的性能值,廠商出新產品也都想去刷個SPC-1,測得好的得意洋洋,測得不好自動忽略。)

文件存儲像集卡,普適各種場合,又能裝數據(數百TB),而且兼容性好,只要你是文件,各種貨物都能往裏塞,在不超過性能載荷的前提下,能拉動常見的各種系統。標準POXIS接口,後車門打開就能裝卸。卡車也不挑路,不像塊存儲非要上賽道才能開,普通的千兆公路就能暢通無阻。速度雖然沒有塊存儲超跑那麼塊,但跑個80/100碼還是穩穩當當.

而對象存儲就像海運貨輪,應對的是'真·海量',幾十上百PB的數據,以集裝箱/container(桶/bucket)爲單位碼得整整齊齊,裏面裝滿各種對象數據,十萬客戶發的貨(數據),一條船就都處理得過來,按照鍵值(KeyVaule)記得清清楚楚。海運速度慢是慢點,有時候遇到點網絡風暴還不穩定,但支持斷點續傳,最終還是能安全送達的,對大宗貨物尤其是非結構化數據,整體上來看是最快捷便利的。

從訪問方式來說,塊存儲通常都是通過光纖網絡連接,服務器/小機上配置FC光纖HBA卡,通過光纖交換機連接存儲(IP SAN可以通過千兆以太網,以iSCSI客戶端連接存儲),主機端以邏輯卷(Volume)的方式訪問。連接成功後,應用訪問存儲是按起始地址,偏移量Offset的方法來訪問的。

而NAS文件存儲通常只要是局域網內,千兆/百兆的以太網環境皆可。網線連上,服務器端通過操作系統內置的NAS客戶端,如NFS/CIFS/FTP客戶端掛載存儲成爲一個本地的文件夾後訪問,只要符合POXIS標準,應用就可以用標準的open,seek, write/read,close這些方法對其訪問操作。

對象存儲不在乎網絡,而且它的訪問比較有特色,只能存取刪(put/get/delete),不能打開修改存盤。只能取下來改好後上傳,去覆蓋原對象。(因爲中間是不可靠的互聯網啊,不能保證你在修改時候不掉線啊。所謂你在這頭,對象在那頭,所愛對象隔山海,山海不可平。)

另外再說一點分佈式存儲的問題,以上三種存儲都可以和分佈式概念結合,成爲分佈式文件系統,分佈式塊存儲,還有天生分佈式的對象存儲。

對象存儲的定義就把元數據管理和數據存儲訪問分開在不同的節點上,多個節點應對多併發的訪問,這自然就是一個分佈式的存儲產品。而分佈式文件系統就很多了,各種開源閉源的產品數得出幾十個,在不同的領域各有應用。至於分佈式的塊存儲產品就比較少,也很難做好。我個人認爲這個產品形態有點違和,分佈式的思想和塊存儲的設計追求其實是衝突的。前面講過,塊存儲主要是圖快,一上分佈式肯定嚴重拖後腿,既然都分佈開了,節點之間的通信必然增加額外負擔,再加上CAP,爲了保持一致性犧牲響應速度,得到的好處就是擴展性。這就像把超跑弄個鐵索連環,哪裏還可能跑出高速?鏈條比車都重了,穿起來當火車開嗎?

而文件存儲原來也就是集裝箱貨車,大家連起來扮火車還是有可行性的。

 

塊存儲、文件存儲、對象存儲的層次關係

 

應用的角度聊過了,我們再看看這三種存儲的一些技術細節,首先看看在系統層級的分佈。

我們從底層往上看,最底層就是硬盤,多個硬盤可以做成RAID組,無論是單個硬盤還是RAID組,都可以做成PV,多個PV物理卷捏在一起構成VG卷組,這就做成一塊大蛋糕了。接下來,可以從蛋糕上切下很多塊LV邏輯卷,這就到了存儲用戶最熟悉的卷這層。到這一層爲止,數據一直都是以Block塊的形式存在的,這時候提供出來的服務就是塊存儲服務。你可以通過FC協議或者iSCSI協議對卷訪問,映射到主機端本地,成爲一個裸設備。在主機端可以直接在上面安裝數據庫,也可以格式化成文件系統後交給應用程序使用,這時候就是一個標準的SAN存儲設備的訪問模式,網絡間傳送的是塊。

如果不急着訪問,也可以在本地做文件系統,之後以NFS/CIFS協議掛載,映射到本地目錄,直接以文件形式訪問,這就成了NAS訪問的模式,在網絡間傳送的是文件。

如果不走NAS,在本地文件系統上面部署OSD服務端,把整個設備做成一個OSD,這樣的節點多來幾個,再加上必要的MDS節點,互聯網另一端的應用程序再通過HTTP協議直接進行訪問,這就變成了對象存儲的訪問模式。當然對象存儲通常不需要專業的存儲設備,前面那些LV/VG/PV層也可以統統不要,直接在硬盤上做本地文件系統,之後再做成OSD,這種纔是對象存儲的標準模式,對象存儲的硬件設備通常就用大盤位的服務器。

從系統層級上來說,這三種存儲是按照塊->文件->對象逐級向上的。文件一定是基於塊上面去做,不管是遠端還是本地。而對象存儲的底層或者說後端存儲通常是基於一個本地文件系統(XFS/Ext4..)。這樣做是比較合理順暢的架構。但是大家想法很多,還有各種特異的產品出現,我們逐個來看看:

對象存儲除了基於文件,可以直接基於塊,但是做這個實現的很少,畢竟你還是得把文件系統的活給幹了,自己實現一套元數據管理,也挺麻煩的,目前我只看到Nutanix宣稱支持。另外對象存儲還能基於對象存儲,這就有點尷尬了,就是轉一下,何必呢?但是這都不算最奇怪的,最奇怪的是把對象存儲放在最底層,那就是這兩年大紅的Ceph。

Ceph是個開源的分佈式存儲,相信類似的架構圖大家都見過,我把底層細節也畫出來,方便分析。

底層是RADOS,這是個標準的對象存儲。以RADOS爲基礎,Ceph 能夠提供文件,塊和對象三種存儲服務。其中通過RBD提供出來的塊存儲是比較有價值的地方,畢竟因爲市面上開源的分佈式塊存儲少見嘛(以前倒是有個sheepdog,但是現在不當紅了)。當然它也通過CephFS模塊和相應的私有Client提供了文件服務,這也是很多人認爲Ceph是個文件系統的原因。另外它自己原生的對象存儲可以通過RadosGW存儲網關模塊向外提供對象存儲服務,並且和對象存儲的事實標準Amazon S3以及Swift兼容。所以能看出來這其實是個大一統解決方案,啥都齊全。

上面講的大家或多或少都有所瞭解,但底層的RADOS的細節可能會忽略,RADOS也是個標準對象存儲,裏面也有MDS的元數據管理和OSD的數據存儲,而OSD本身是可以基於一個本地文件系統的,比如XFS/EXT4/Brtfs。在早期版本,你在部署Ceph的時候,是不是要給OSD創建數據目錄啊?這一步其實就已經在本地文件系統上做操作了(現在的版本Ceph可以直接使用硬盤)。

現在我們來看數據訪問路徑,如果看Ceph的文件接口,自底層向上,經過了硬盤(塊)->文件->對象->文件的路徑;如果看RBD的塊存儲服務,則經過了硬盤(塊)->文件->對象->塊,也可能是硬盤(塊)->對象->塊的路徑;再看看對象接口(雖然用的不多),則是經過了硬盤(塊)->文件->對象或者硬盤(塊)->對象的路徑。

是不是各種組合差不多齊全了?如果你覺得只有Ceph一個這麼玩,再給你介紹另一個狠角色,老牌的開源分佈式文件系統GlusterFS最近也宣佈要支持對象存儲。它打算使用swift的上層PUT、GET等接口,支持對象存儲。這是文件存儲去兼容對象存儲。對象存儲Swift也沒閒着,有人在研究Swift和hadoop的兼容性,要知道MapReduce標準是用原生的HDFS做存儲的,這相當是對象存儲去兼容文件存儲,看來混搭真是潮流啊。

雖說現在大家都這麼隨便結合,但是這三種存儲本質上還是有不同的,我們回到計算機的基礎課程,從數據結構來看,這三種存儲有着根本不同。塊存儲的數據結構是數組,而文件存儲是二叉樹(B,B-,B ,B*各種樹),對象存儲基本上都是哈希表。

數組和二叉樹都是老生常談,沒有太多值得說的,而對象存儲使用的哈希表也就是常聽說的鍵值(KeyVaule型)存儲的核心數據結構,每個對象找一個UID(所謂的“鍵”KEY),算哈希值(所謂的“值Vaule”)以後和目標對應。找了一個哈希表例子如下:

鍵值對應關係簡單粗暴,畢竟算個hash值是很快的,這種扁平化組織形式可以做得非常大,避免了二叉樹的深度,對於真·海量的數據存儲和大規模訪問都能給力支持。所以不僅是對象存儲,很多NoSQL的分佈式數據庫都會使用它,比如Redis,MongoDB,Cassandra 還有Dynamo等等。

順便說一句,這類NoSQL的出現有點打破了數據庫和文件存儲的天然屏障,原本關係數據庫裏面是不會存放太大的數據的,但是現在像MongoDB這種NoSQL都支持直接往裏扔大個的“文檔”數據,所以從應用角度上,有時候會把對象存儲,分佈式文件系統,分佈式數據庫放到一個檯面上來比較,這纔是混搭。

當然實際上幾個開源對象存儲比如swift和ceph都是用的一致性哈希,進階版,最後變成了一個環,首首尾相接,避免了節點故障時大量數據遷移的尷尬,這個幾年前寫Swift的時候就提過。這裏不再深入細節。

 

文章地址:

從應用角度看塊/文件/對象三種存儲

http://www.aixchina.net/Article/178247

塊存儲,文件存儲,對象存儲的層次關係

http://www.aixchina.net/Article/178249

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