一、塊存儲、文件存儲、對象存儲,三者的本質差別是什麼?
1、塊存儲
典型設備:磁碟陣列,硬碟
塊存儲主要是將裸磁碟空間整個映射給主機使用的,就是說例如磁碟陣列裡面有5塊硬碟(為方便說明,假設每個硬碟1G),然後可以通過劃邏輯盤、做Raid、或者LVM(邏輯卷)等種種方式邏輯劃分出N個邏輯的硬碟。(假設劃分完的邏輯盤也是5個,每個也是1G,但是這5個1G的邏輯盤已經與原來的5個物理硬碟意義完全不同了。例如第一個邏輯硬碟A裡面,可能第一個200M是來自物理硬碟1,第二個200M是來自物理硬碟2,所以邏輯硬碟A是由多個物理硬碟邏輯虛構出來的硬碟。)
接著塊存儲會採用映射的方式將這幾個邏輯盤映射給主機,主機上面的作業系統會識別到有5塊硬碟,但是作業系統是區分不出到底是邏輯還是物理的,它一概就認為只是5塊裸的物理硬碟而已,跟直接拿一塊物理硬碟掛載到作業系統沒有區別的,至少作業系統感知上沒有區別。
此種方式下,作業系統還需要對掛載的裸硬碟進行分區、格式化後,才能使用,與平常主機內置硬碟的方式完全無異。
優點:
1、 這種方式的好處當然是因為通過了Raid與LVM等手段,對數據提供了保護。
2、 另外也可以將多塊廉價的硬碟組合起來,成為一個大容量的邏輯盤對外提供服務,提高了容量。
3、 寫入數據的時候,由於是多塊磁碟組合出來的邏輯盤,所以幾塊磁碟可以並行寫入的,提升了讀寫效率。
4、 很多時候塊存儲採用SAN架構組網,傳輸速率以及封裝協議的原因,使得傳輸速度與讀寫速率得到提升。
缺點:
1、採用SAN架構組網時,需要額外為主機購買光纖通道卡,還要買光纖交換機,造價成本高。
2、主機之間的數據無法共享,在伺服器不做集群的情況下,塊存儲裸盤映射給主機,再格式化使用後,對於主機來說相當於本地盤,那麼主機A的本地盤根本不能給主機B去使用,無法共享數據。
3、不利於不同作業系統主機間的數據共享:另外一個原因是因為作業系統使用不同的文件系統,格式化完之後,不同文件系統間的數據是共享不了的。例如一台裝了WIN,文件系統是FAT32/NTFS,而Linux是EXT4,EXT4是無法識別NTFS的文件系統的。就像一隻NTFS格式的U盤,插進Linux的筆記本,根本無法識別出來。所以不利於文件共享。
2、文件存儲
典型設備:FTP、NFS伺服器
為了克服上述文件無法共享的問題,所以有了文件存儲。
文件存儲也有軟硬一體化的設備,但是其實普通拿一台伺服器/筆記本,只要裝上合適的作業系統與軟體,就可以架設FTP與NFS服務了,架上該類服務之後的伺服器,就是文件存儲的一種了。
主機A可以直接對文件存儲進行文件的上傳下載,與塊存儲不同,主機A是不需要再對文件存儲進行格式化的,因為文件管理功能已經由文件存儲自己搞定了。
優點:
1、造價較低:隨便一台機器就可以了,另外普通乙太網就可以,根本不需要專用的SAN網絡,所以造價低。
2、方便文件共享:例如主機A(WIN,NTFS文件系統),主機B(Linux,EXT4文件系統),想互拷一部電影,本來不行。加了個主機C(NFS伺服器),然後可以先A拷到C,再C拷到B就OK了。(例子比較膚淺,請見諒……)
缺點:
讀寫速率低,傳輸速率慢:乙太網,上傳下載速度較慢,另外所有讀寫都要1台伺服器裡面的硬碟來承擔,相比起磁碟陣列動不動就幾十上百塊硬碟同時讀寫,速率慢了許多。
3、對象存儲
典型設備:內置大容量硬碟的分布式伺服器
對象存儲最常用的方案,就是多台伺服器內置大容量硬碟,再裝上對象存儲軟體,然後再額外搞幾台服務作為管理節點,安裝上對象存儲管理軟體。管理節點可以管理其他伺服器對外提供讀寫訪問功能。
之所以出現了對象存儲這種東西,是為了克服塊存儲與文件存儲各自的缺點,發揚它倆各自的優點。簡單來說塊存儲讀寫快,不利於共享,文件存儲讀寫慢,利於共享。能否弄一個讀寫快,利 於共享的出來呢。於是就有了對象存儲。
首先,一個文件包含了了屬性(術語叫metadata,元數據,例如該文件的大小、修改時間、存儲路徑等)以及內容(以下簡稱數據)。
以往像FAT32這種文件系統,是直接將一份文件的數據與metadata一起存儲的,存儲過程先將文件按照文件系統的最小塊大小來打散(如4M的文件,假設文件系統要求一個塊4K,那麼就將文件打散成為1000個小塊),再寫進硬碟裡面,過程中沒有區分數據/metadata的。而每個塊最後會告知你下一個要讀取的塊的地址,然後一直這樣順序地按圖索驥,最後完成整份文件的所有塊的讀取。
這種情況下讀寫速率很慢,因為就算你有100個機械手臂在讀寫,但是由於你只有讀取到第一個塊,才能知道下一個塊在哪裡,其實相當於只能有1個機械手臂在實際工作。
而對象存儲則將元數據獨立了出來,控制節點叫元數據伺服器(伺服器+對象存儲管理軟體),裡面主要負責存儲對象的屬性(主要是對象的數據被打散存放到了那幾台分布式伺服器中的信息),而其他負責存儲數據的分布式伺服器叫做OSD,主要負責存儲文件的數據部分。當用戶訪問對象,會先訪問元數據伺服器,元數據伺服器只負責反饋對象存儲在哪些OSD,假設反饋文件A存儲在B、C、D三台OSD,那麼用戶就會再次直接訪問3台OSD伺服器去讀取數據。
這時候由於是3台OSD同時對外傳輸數據,所以傳輸的速度就加快了。當OSD伺服器數量越多,這種讀寫速度的提升就越大,通過此種方式,實現了讀寫快的目的。
另一方面,對象存儲軟體是有專門的文件系統的,所以OSD對外又相當於文件伺服器,那麼就不存在文件共享方面的困難了,也解決了文件共享方面的問題。
所以對象存儲的出現,很好地結合了塊存儲與文件存儲的優點。
最後,為什麼對象存儲兼具塊存儲與文件存儲的好處,還要使用塊存儲或文件存儲呢?
1、有一類應用是需要存儲直接裸盤映射的,例如資料庫。因為資料庫需要存儲裸盤映射給自己後,再根據自己的資料庫文件系統來對裸盤進行格式化的,所以是不能夠採用其他已經被格式化為某種文件系統的存儲的。此類應用更適合使用塊存儲。
2、對象存儲的成本比起普通的文件存儲還是較高,需要購買專門的對象存儲軟體以及大容量硬碟。如果對數據量要求不是海量,只是為了做文件共享的時候,直接用文件存儲的形式好了,性價比高。
二、從應用角度比較塊存儲、文件存儲、對象存儲
產品和市場需求有各種相互影響的關係,但不管是哪一種,最終呈現都是產品和應用需求需要對應匹配。應用需求越多樣化,市場也就劃分得更加細,產品種類也就更加豐富。在存儲行業,我們也可以從「應用適配」這個角度來聊聊各類存儲。
傳統認知上來說,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..)。這樣做是比較合理順暢的架構。但是大家想法很多,還有各種特異的產品出現,我們逐個來看看:
對象存儲除了基於文件,可以直接基於塊,但是做這個實現的很少,畢竟你還是得把文件系統的活給乾了,自己實現一套元數據管理,也挺麻煩的。另外對象存儲還能基於對象存儲,這就有點尷尬了,就是轉一下,何必呢?但是這都不算最奇怪的,最奇怪的是把對象存儲放在最底層,那就是這兩年大紅的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的塊存儲服務,則經過了硬碟(塊)->文件->對象->塊,也可能是硬碟(塊)->對象->塊的路徑;再看看對象接口(雖然用的不多),則是經過了硬碟(塊)->文件->對象或者硬碟(塊)->對象的路徑。
雖說現在大家都這麼隨便結合,但是這三種存儲本質上還是有不同的,我們回到計算機的基礎課程,從數據結構來看,這三種存儲有著根本不同。塊存儲的數據結構是數組,而文件存儲是二叉樹(B,B-,B+,B*各種樹),對象存儲基本上都是哈希表。
數組和二叉樹都是老生常談,沒有太多值得說的,而對象存儲使用的哈希表也就是常聽說的鍵值(KeyVaule型)存儲的核心數據結構,每個對象找一個UID(所謂的「鍵」KEY),算哈希值(所謂的「值Vaule」)以後和目標對應。找了一個哈希表例子如下:
鍵值對應關係簡單粗暴,畢竟算個hash值是很快的,這種扁平化組織形式可以做得非常大,避免了二叉樹的深度,對於真·海量的數據存儲和大規模訪問都能給力支持。所以不僅是對象存儲,很多NoSQL的分布式資料庫都會使用它。
順便說一句,這類NoSQL的出現有點打破了資料庫和文件存儲的天然屏障,原本關係數據庫裡面是不會存放太大的數據的,但是現在像MongoDB這種NoSQL都支持直接往裡扔大個的「文檔」數據,所以從應用角度上,有時候會把對象存儲,分布式文件系統,分布式資料庫放到一個檯面上來比較,這才是混搭。
當然實際上幾個開源對象存儲比如swift和ceph都是用的一致性哈希,進階版,最後變成了一個環,首首尾相接,避免了節點故障時大量數據遷移的尷尬。
四、分布式存儲在塊存儲、文件存儲、對象存儲的應用成效
軟體定義分布式塊存儲還在發展階段,當前其在產品成熟度、高性能、高可靠、功能方面還是與傳統塊存儲有較大差距,國內軟體定義塊存儲廠商也在做這方面的完善和追趕。
文件存儲也有其契合的應用場景,其使用簡單快捷,易於多主機共享,在要求帶寬,要IOPS和延遲不敏感,但是又需要經常進行數據改(在存儲上即時更改文件數據)的應用場景比較適合使用文件存儲。
對象存儲因為架構設計的限制其適合應用數據場景應該是:只進行全讀和全寫的應用場景海量數據場景。但需要經常進行數據改(在存儲上即時更改數據)的應用場景使用對象存儲就非常的太合適了。
對象存儲可以用來替代NAS存儲的一些使用場景。現在還有一種流行的做法就是用對象存儲來做數據歸檔和備份。像優酷、愛奇藝上的視頻(電影視頻發布後一次寫入對象存儲後續不會有數據改操作的。)或是微信上的圖片(圖片只有上傳寫入和刪除功能,你見騰訊啥時間讓你在線編輯照片了。)這類應用就是對象存儲的最愛。
總體是我個人認為分布式對象存儲時最為成熟的軟體定義分布式存儲類型,現在多家對象存儲廠商都支持多副本和EC校驗碼數據保護方式,通過EC校驗碼可以大幅提升有效可用容量做的類型傳統RAID存儲的容量使用率,大幅降低成本。
文章來源: https://twgreatdaily.com/zh-mo/spr5WHABjYh_GJGVyX7L.html