如何從應用角度比較塊存儲、文件存儲、對象存儲
產(chǎn)品和市場需求有各種相互影響的關(guān)系,但不管是哪一種,最終呈現(xiàn)都是產(chǎn)品和應用需求需要對應匹配。應用需求越多樣化,市場也就劃分得更加細,產(chǎn)品種類也就更加豐富。在存儲行業(yè),我們也可以從“應用適配”這個角度來聊聊各類存儲。
傳統(tǒng)認知上來說,IT設備分為計算/存儲/網(wǎng)絡三大類,相互之間是有明顯的楚河漢界的。計算大家都清楚,服務器,小型機,大型機;網(wǎng)絡也就是路由器交換機;存儲有內(nèi)置存儲和外置存儲,最常見的就是磁盤陣列。在HCI(超融合)這個概念沒被熱炒之前,計算網(wǎng)絡存儲還都是涇渭分明,各擔其責的。今天我們先不討論超融合的情況,僅基于傳統(tǒng)理解,看看存儲的情況。
從邏輯上存儲通常分為塊存儲,文件存儲,對象存儲。這三類存儲在實際應用中的適配環(huán)境還是有著明顯的不同的。
塊存儲(DAS/SAN)通常應用在某些專有的系統(tǒng)中,這類應用要求很高的隨機讀寫性能和高可靠性,上面搭載的通常是Oracle/DB2這種傳統(tǒng)數(shù)據(jù)庫,連接通常是以FC光纖(8Gb/16Gb)為主,走光纖協(xié)議。如果要求稍低一些,也會出現(xiàn)基于千兆/萬兆以太網(wǎng)的連接方式,MySQL這種數(shù)據(jù)庫就可能會使用IP SAN,走iSCSI協(xié)議。通常使用塊存儲的都是系統(tǒng)而非用戶,并發(fā)訪問不會很多,經(jīng)常出現(xiàn)一套存儲只服務一個應用系統(tǒng),例如如交易系統(tǒng),計費系統(tǒng)。典型行業(yè)如金融,制造,能源,電信等。
文件存儲(NAS)相對來說就更能兼顧多個應用和更多用戶訪問,同時提供方便的數(shù)據(jù)共享手段。畢竟大部分的用戶數(shù)據(jù)都是以文件的形式存放,在PC時代,數(shù)據(jù)共享也大多是用文件的形式,比如常見的的FTP服務,NFS服務,Samba共享這些都是屬于典型的文件存儲。幾十個用戶甚至上百用戶的文件存儲共享訪問都可以用NAS存儲加以解決。在中小企業(yè)市場,一兩臺NAS存儲設備就能支撐整個IT部門了。CRM系統(tǒng),SCM系統(tǒng),OA系統(tǒng),郵件系統(tǒng)都可以使用NAS存儲統(tǒng)統(tǒng)搞定。甚至在公有云發(fā)展的早幾年,用戶規(guī)模沒有上來時,云存儲的底層硬件也有用幾套NAS存儲設備就解決的,甚至云主機的鏡像也有放在NAS存儲上的例子。文件存儲的廣泛兼容性和易用性,是這類存儲的突出特點。但是從性能上來看,相對SAN就要低一些。NAS存儲基本上是以太網(wǎng)訪問模式,普通千兆網(wǎng),走NFS/CIFS協(xié)議。
對象存儲概念出現(xiàn)得晚一些,存儲標準化組織SINA早在2004年就給出了定義,但早期多出現(xiàn)在超大規(guī)模系統(tǒng),所以并不為大眾所熟知,相關(guān)產(chǎn)品一直也不溫不火。一直到云計算和大數(shù)據(jù)的概念全民強推,才慢慢進入公眾視野。
前面說到的塊存儲和文件存儲,基本上都還是在專有的局域網(wǎng)絡內(nèi)部使用,而對象存儲的優(yōu)勢場景卻是互聯(lián)網(wǎng)或者公網(wǎng),主要解決海量數(shù)據(jù),海量并發(fā)訪問的需求?;诨ヂ?lián)網(wǎng)的應用才是對象存儲的主要適配(當然這個條件同樣適用于云計算,基于互聯(lián)網(wǎng)的應用最容易遷移到云上,因為沒出現(xiàn)云這個名詞之前,他們已經(jīng)在上面了),基本所有成熟的公有云都提供了對象存儲產(chǎn)品,不管是國內(nèi)還是國外。
對象存儲常見的適配應用如網(wǎng)盤、媒體娛樂,醫(yī)療PACS,氣象,歸檔等數(shù)據(jù)量超大而又相對“冷數(shù)據(jù)”和非在線處理的應用類型。這類應用單個數(shù)據(jù)大,總量也大,適合對象存儲海量和易擴展的特點。網(wǎng)盤類應用也差不多,數(shù)據(jù)總量很大,另外還有并發(fā)訪問量也大,支持10萬級用戶訪問這種需求就值得單列一個項目了(這方面的掃盲可以想想12306)。歸檔類應用只是數(shù)據(jù)量大的冷數(shù)據(jù),并發(fā)訪問的需求倒是不太突出。
另外基于移動端的一些新興應用也是適合的,智能手機和移動互聯(lián)網(wǎng)普及的情況下,所謂UGD(用戶產(chǎn)生的數(shù)據(jù),手機的照片視頻)總量和用戶數(shù)都是很大挑戰(zhàn)。畢竟直接使用HTTP get/put就能直接實現(xiàn)數(shù)據(jù)存取,對移動應用來說還是有一定吸引力的。
對象存儲的訪問通常是在互聯(lián)網(wǎng),走HTTP協(xié)議,性能方面,單獨看一個連接的是不高的(還要解決掉線斷點續(xù)傳之類的可靠性問題),主要強大的地方是支持的并發(fā)數(shù)量,聚合起來的性能帶寬就非??捎^了。
從產(chǎn)品形態(tài)上來看,塊存儲和文件存儲都是成熟產(chǎn)品,各種規(guī)格形態(tài)的硬件已經(jīng)是琳瑯滿目了。但是對象存儲通常你看到都是一堆服務器或者增強型服務器,畢竟這東西現(xiàn)在還是互聯(lián)網(wǎng)行業(yè)用得多點,DIY風格。
關(guān)于性能容量等方面,我做了個圖,對三種存儲做直觀對比。
塊存儲就像超跑,根本不在意能不能多載幾個人,要的就是極限速度和高速下的穩(wěn)定性和可靠性,各大廠商出新產(chǎn)品都要去紐北賽道刷個單圈最快紀錄,千方百計就為提高一兩秒,跑不進7分以內(nèi)都看不到前三名。(塊存儲容量也不大,TB這個數(shù)量級,支持的應用和適用的環(huán)境也比較專業(yè)(FC+Oracle),在乎的都是IOPS的性能值,廠商出新產(chǎn)品也都想去刷個SPC-1,測得好的得意洋洋,測得不好自動忽略。)
文件存儲像集卡,普適各種場合,又能裝數(shù)據(jù)(數(shù)百TB),而且兼容性好,只要你是文件,各種貨物都能往里塞,在不超過性能載荷的前提下,能拉動常見的各種系統(tǒng)。標準POXIS接口,后車門打開就能裝卸。卡車也不挑路,不像塊存儲非要上賽道才能開,普通的千兆公路就能暢通無阻。速度雖然沒有塊存儲超跑那么塊,但跑個80/100碼還是穩(wěn)穩(wěn)當當.
而對象存儲就像海運貨輪,應對的是"真·海量",幾十上百PB的數(shù)據(jù),以集裝箱/container(桶/bucket)為單位碼得整整齊齊,里面裝滿各種對象數(shù)據(jù),十萬客戶發(fā)的貨(數(shù)據(jù)),一條船就都處理得過來,按照鍵值(KeyVaule)記得清清楚楚。海運速度慢是慢點,有時候遇到點網(wǎng)絡風暴還不穩(wěn)定,但支持斷點續(xù)傳,最終還是能安全送達的,對大宗貨物尤其是非結(jié)構(gòu)化數(shù)據(jù),整體上來看是最快捷便利的。
從訪問方式來說,塊存儲通常都是通過光纖網(wǎng)絡連接,服務器/小機上配置FC光纖HBA卡,通過光纖交換機連接存儲(IP SAN可以通過千兆以太網(wǎng),以iSCSI客戶端連接存儲),主機端以邏輯卷(Volume)的方式訪問。連接成功后,應用訪問存儲是按起始地址,偏移量Offset的方法來訪問的。
而NAS文件存儲通常只要是局域網(wǎng)內(nèi),千兆/百兆的以太網(wǎng)環(huán)境皆可。網(wǎng)線連上,服務器端通過操作系統(tǒng)內(nèi)置的NAS客戶端,如NFS/CIFS/FTP客戶端掛載存儲成為一個本地的文件夾后訪問,只要符合POXIS標準,應用就可以用標準的open,seek, write/read,close這些方法對其訪問操作。
對象存儲不在乎網(wǎng)絡,而且它的訪問比較有特色,只能存取刪(put/get/delete),不能打開修改存盤。只能取下來改好后上傳,去覆蓋原對象。(因為中間是不可靠的互聯(lián)網(wǎng)啊,不能保證你在修改時候不掉線啊。所謂你在這頭,對象在那頭,所愛對象隔山海,山海不可平。)
另外再說一點分布式存儲的問題,以上三種存儲都可以和分布式概念結(jié)合,成為分布式文件系統(tǒng),分布式塊存儲,還有天生分布式的對象存儲。
對象存儲的定義就把元數(shù)據(jù)管理和數(shù)據(jù)存儲訪問分開在不同的節(jié)點上,多個節(jié)點應對多并發(fā)的訪問,這自然就是一個分布式的存儲產(chǎn)品。而分布式文件系統(tǒng)就很多了,各種開源閉源的產(chǎn)品數(shù)得出幾十個,在不同的領(lǐng)域各有應用。至于分布式的塊存儲產(chǎn)品就比較少,也很難做好。我個人認為這個產(chǎn)品形態(tài)有點違和,分布式的思想和塊存儲的設計追求其實是沖突的。前面講過,塊存儲主要是圖快,一上分布式肯定嚴重拖后腿,既然都分布開了,節(jié)點之間的通信必然增加額外負擔,再加上CAP,為了保持一致性犧牲響應速度,得到的好處就是擴展性。這就像把超跑弄個鐵索連環(huán),哪里還可能跑出高速?鏈條比車都重了,穿起來當火車開嗎?
而文件存儲原來也就是集裝箱貨車,大家連起來扮火車還是有可行性的。
塊存儲、文件存儲、對象存儲的層次關(guān)系
應用的角度聊過了,我們再看看這三種存儲的一些技術(shù)細節(jié),首先看看在系統(tǒng)層級的分布。
我們從底層往上看,最底層就是硬盤,多個硬盤可以做成RAID組,無論是單個硬盤還是RAID組,都可以做成PV,多個PV物理卷捏在一起構(gòu)成VG卷組,這就做成一塊大蛋糕了。接下來,可以從蛋糕上切下很多塊LV邏輯卷,這就到了存儲用戶最熟悉的卷這層。到這一層為止,數(shù)據(jù)一直都是以Block塊的形式存在的,這時候提供出來的服務就是塊存儲服務。你可以通過FC協(xié)議或者iSCSI協(xié)議對卷訪問,映射到主機端本地,成為一個裸設備。在主機端可以直接在上面安裝數(shù)據(jù)庫,也可以格式化成文件系統(tǒng)后交給應用程序使用,這時候就是一個標準的SAN存儲設備的訪問模式,網(wǎng)絡間傳送的是塊。
如果不急著訪問,也可以在本地做文件系統(tǒng),之后以NFS/CIFS協(xié)議掛載,映射到本地目錄,直接以文件形式訪問,這就成了NAS訪問的模式,在網(wǎng)絡間傳送的是文件。
如果不走NAS,在本地文件系統(tǒng)上面部署OSD服務端,把整個設備做成一個OSD,這樣的節(jié)點多來幾個,再加上必要的MDS節(jié)點,互聯(lián)網(wǎng)另一端的應用程序再通過HTTP協(xié)議直接進行訪問,這就變成了對象存儲的訪問模式。當然對象存儲通常不需要專業(yè)的存儲設備,前面那些LV/VG/PV層也可以統(tǒng)統(tǒng)不要,直接在硬盤上做本地文件系統(tǒng),之后再做成OSD,這種才是對象存儲的標準模式,對象存儲的硬件設備通常就用大盤位的服務器。
從系統(tǒng)層級上來說,這三種存儲是按照塊->文件->對象逐級向上的。文件一定是基于塊上面去做,不管是遠端還是本地。而對象存儲的底層或者說后端存儲通常是基于一個本地文件系統(tǒng)(XFS/Ext4..)。這樣做是比較合理順暢的架構(gòu)。但是大家想法很多,還有各種特異的產(chǎn)品出現(xiàn),我們逐個來看看:
對象存儲除了基于文件,可以直接基于塊,但是做這個實現(xiàn)的很少,畢竟你還是得把文件系統(tǒng)的活給干了,自己實現(xiàn)一套元數(shù)據(jù)管理,也挺麻煩的,目前我只看到Nutanix宣稱支持。另外對象存儲還能基于對象存儲,這就有點尷尬了,就是轉(zhuǎn)一下,何必呢?但是這都不算最奇怪的,最奇怪的是把對象存儲放在最底層,那就是這兩年大紅的Ceph。
Ceph是個開源的分布式存儲,相信類似的架構(gòu)圖大家都見過,我把底層細節(jié)也畫出來,方便分析。
底層是RADOS,這是個標準的對象存儲。以RADOS為基礎,Ceph 能夠提供文件,塊和對象三種存儲服務。其中通過RBD提供出來的塊存儲是比較有價值的地方,畢竟因為市面上開源的分布式塊存儲少見嘛(以前倒是有個sheepdog,但是現(xiàn)在不當紅了)。當然它也通過CephFS模塊和相應的私有Client提供了文件服務,這也是很多人認為Ceph是個文件系統(tǒng)的原因。另外它自己原生的對象存儲可以通過RadosGW存儲網(wǎng)關(guān)模塊向外提供對象存儲服務,并且和對象存儲的事實標準Amazon S3以及Swift兼容。所以能看出來這其實是個大一統(tǒng)解決方案,啥都齊全。
上面講的大家或多或少都有所了解,但底層的RADOS的細節(jié)可能會忽略,RADOS也是個標準對象存儲,里面也有MDS的元數(shù)據(jù)管理和OSD的數(shù)據(jù)存儲,而OSD本身是可以基于一個本地文件系統(tǒng)的,比如XFS/EXT4/Brtfs。在早期版本,你在部署Ceph的時候,是不是要給OSD創(chuàng)建數(shù)據(jù)目錄???這一步其實就已經(jīng)在本地文件系統(tǒng)上做操作了(現(xiàn)在的版本Ceph可以直接使用硬盤)。
現(xiàn)在我們來看數(shù)據(jù)訪問路徑,如果看Ceph的文件接口,自底層向上,經(jīng)過了硬盤(塊)->文件->對象->文件的路徑;如果看RBD的塊存儲服務,則經(jīng)過了硬盤(塊)->文件->對象->塊,也可能是硬盤(塊)->對象->塊的路徑;再看看對象接口(雖然用的不多),則是經(jīng)過了硬盤(塊)->文件->對象或者硬盤(塊)->對象的路徑。
是不是各種組合差不多齊全了?如果你覺得只有Ceph一個這么玩,再給你介紹另一個狠角色,老牌的開源分布式文件系統(tǒng)GlusterFS也宣布要支持對象存儲。它打算使用swift的上層PUT、GET等接口,支持對象存儲。這是文件存儲去兼容對象存儲。對象存儲Swift也沒閑著,有人在研究Swift和hadoop的兼容性,要知道MapReduce標準是用原生的HDFS做存儲的,這相當是對象存儲去兼容文件存儲,看來混搭真是潮流啊。
雖說現(xiàn)在大家都這么隨便結(jié)合,但是這三種存儲本質(zhì)上還是有不同的,我們回到計算機的基礎課程,從數(shù)據(jù)結(jié)構(gòu)來看,這三種存儲有著根本不同。塊存儲的數(shù)據(jù)結(jié)構(gòu)是數(shù)組,而文件存儲是二叉樹(B,B-,B+,B*各種樹),對象存儲基本上都是哈希表。
數(shù)組和二叉樹都是老生常談,沒有太多值得說的,而對象存儲使用的哈希表也就是常聽說的鍵值(KeyVaule型)存儲的核心數(shù)據(jù)結(jié)構(gòu),每個對象找一個UID(所謂的“鍵”KEY),算哈希值(所謂的“值Vaule”)以后和目標對應。找了一個哈希表例子如下:
鍵值對應關(guān)系簡單粗暴,畢竟算個hash值是很快的,這種扁平化組織形式可以做得非常大,避免了二叉樹的深度,對于真·海量的數(shù)據(jù)存儲和大規(guī)模訪問都能給力支持。所以不僅是對象存儲,很多NoSQL的分布式數(shù)據(jù)庫都會使用它,比如Redis,MongoDB,Cassandra 還有Dynamo等等。
順便說一句,這類NoSQL的出現(xiàn)有點打破了數(shù)據(jù)庫和文件存儲的天然屏障,原本關(guān)系數(shù)據(jù)庫里面是不會存放太大的數(shù)據(jù)的,但是現(xiàn)在像MongoDB這種NoSQL都支持直接往里扔大個的“文檔”數(shù)據(jù),所以從應用角度上,有時候會把對象存儲,分布式文件系統(tǒng),分布式數(shù)據(jù)庫放到一個臺面上來比較,這才是混搭。
當然實際上幾個開源對象存儲比如swift和ceph都是用的一致性哈希,進階版,最后變成了一個環(huán),首首尾相接,避免了節(jié)點故障時大量數(shù)據(jù)遷移的尷尬,這個幾年前寫Swift的時候就提過。這里不再深入細節(jié)。