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































