理解塊存儲、文件存儲和對象存儲的應用場景和選擇
應用場景(王豪邁(麥子邁|wheats))
分布式存儲的應用場景相對於其存儲接口,現在流行分為三種:
-
對象存儲: 也就是通常意義的鍵值存儲,其接口就是簡單的 GET、PUT、DEL 和其他擴展,如七牛、又拍、Swift、S3
-
塊存儲: 這種接口通常以 QEMU Driver 或者 Kernel Module 的方式存在,這種接口需要實現 Linux 的 Block Device 的接口或者 QEMU 提供的 Block Driver 接口,如 Sheepdog,AWS 的 EBS,青雲的雲硬盤和阿里雲的盤古系統,還有 Ceph 的 RBD(RBD 是 Ceph 面向塊存儲的接口)
-
文件存儲: 通常意義是支持 POSIX 接口,它跟傳統的文件系統如 Ext4 是一個類型的,但區別在於分布式存儲提供了並行化的能力,如 Ceph 的 CephFS(CephFS 是 Ceph 面向文件存儲的接口),但是有時候又會把 GFS,HDFS 這種非 POSIX 接口的類文件存儲接口歸入此類。
按照這三種接口和其應用場景,很容易了解這三種類型的 IO 特點,括號里代表了它在非分布式情況下的對應:
-
對象存儲(鍵值數據庫):接口簡單,一個對象我們可以看成一個文件,只能全寫全讀,通常以大文件為主,要求足夠的 IO 帶寬。
-
塊存儲(硬盤):它的 IO 特點與傳統的硬盤是一致的,一個硬盤應該是能面向通用需求的,即能應付大文件讀寫,也能處理好小文件讀寫。但是硬盤的特點是容量大,熱點明顯。因此塊存儲主要可以應付熱點問題。另外,塊存儲要求的延遲是最低的。
-
文件存儲(文件系統):支持文件存儲的接口的系統設計跟傳統本地文件系統如 Ext4 這種的特點和難點是一致的,它比塊存儲具有更豐富的接口,需要考慮目錄、文件屬性等支持,實現一個支持並行化的文件存儲應該是最困難的。但像 HDFS、GFS 這種自己定義標准的系統,可以通過根據實現來定義接口,會容易一點。
因此,這三種接口分別以非分布式情況下的鍵值數據庫、硬盤和文件系統的 IO 特點來對應即可。至於冷熱、快慢、大小文件而言更接近於業務。但是因為存儲系統是通用化實現,通常來說,需要盡量滿足各種需求,而接口定義已經一定意義上就砍去了一些需求,如對象存儲會以冷存儲、大文件為主。
如何選擇(王旭)
首先對象存儲和文件存儲的區別是不大的,存儲的都是一樣的東西,只是拋棄了統一的命名空間和目錄樹的結構,使得擴展起來桎梏少一些。
獨立的互聯網存儲服務一般都是做對象存儲的,因為塊存儲是給計算機用的,對象存儲是給瀏覽器等 HTTP 客戶端用的。獨立服務所提供的存儲系統,訪問都來自互聯網,自然是做對象存儲;與之相對應,大部分類 AWS 的主機服務商都會提供一個塊存儲服務搭配主機服務。
同一個服務商同時提供兩個服務是有好處的,除了提供的服務比較全這個優點以外,對象存儲還可以支撐塊存儲的快照、主機的系統鏡像存儲等應用,可以相互結合的。
權衡的因素有很多——可靠性要求、可用性要求、時延要求、一致性要求、使用模式相關要求(包括請求大小、QPS/IOPS、吞吐)等。
比如:
- 對於塊存儲,要求的訪問時延是 10ms 級的,因為給虛擬機用的,傳統硬盤也是 10ms 級的時延,請求尺寸都很小,但 qps(iops)可能會很高,那么在這種情況下:
- 異地多中心是不現實的,存儲要和主機盡量接近,相應地可靠性必然會有所打折
- 強一致副本不會過多,強一致要求對時延有影響
- 對於對象存儲,要求的訪問時延是 100ms - 1s 級的,請求一般是中到大尺寸,低 qps 的,在這種情況下
- 可以用更多的分散副本數來換取更高的可靠性,但過多副本增加維持一致性的難度,需要折衷
另外 SSD 隨着成本降低,在塊存儲里逐漸成為主流了,以便提供更好的 IOPS,AWS 這個月開始,創建的 EBS 卷缺省就是 SSD 的了。
對於評價一個實現,首先是看適合不適合這個用途,然后看這個方案有沒有顯著的缺點,是否有嚴重的影響,然后成本之類的也是一個因素,做軟件的人總覺的用便宜硬件實現高大上的服務才值得吹牛,呵呵。
下文鏈接:https://www.zhihu.com/question/21536660/answer/33279921
塊存儲
典型設備:磁盤陣列,硬盤
塊存儲主要是將裸磁盤空間整個映射給主機使用的,就是說例如磁盤陣列里面有5塊硬盤(為方便說明,假設每個硬盤1G),然后可以通過划邏輯盤、做Raid、或者LVM(邏輯卷)等種種方式邏輯划分出N個邏輯的硬盤。(假設划分完的邏輯盤也是5個,每個也是1G,但是這5個1G的邏輯盤已經於原來的5個物理硬盤意義完全不同了。例如第一個邏輯硬盤A里面,可能第一個200M是來自物理硬盤1,第二個200M是來自物理硬盤2,所以邏輯硬盤A是由多個物理硬盤邏輯虛構出來的硬盤。)
接着塊存儲會采用映射的方式將這幾個邏輯盤映射給主機,主機上面的操作系統會識別到有5塊硬盤,但是操作系統是區分不出到底是邏輯還是物理的,它一概就認為只是5塊裸的物理硬盤而已,跟直接拿一塊物理硬盤掛載到操作系統沒有區別的,至少操作系統感知上沒有區別。
此種方式下,操作系統還需要對掛載的裸硬盤進行分區、格式化后,才能使用,與平常主機內置硬盤的方式完全無異。
優點:
- 這種方式的好處當然是因為通過了Raid與LVM等手段,對數據提供了保護。
- 另外也可以將多塊廉價的硬盤組合起來,成為一個大容量的邏輯盤對外提供服務,提高了容量。
- 寫入數據的時候,由於是多塊磁盤組合出來的邏輯盤,所以幾塊磁盤可以並行寫入的,提升了讀寫效率。
- 很多時候塊存儲采用SAN架構組網,傳輸速率以及封裝協議的原因,使得傳輸速度與讀寫速率得到提升。
缺點:
- 采用SAN架構組網時,需要額外為主機購買光纖通道卡,還要買光纖交換機,造價成本高。
- 主機之間的數據無法共享,在服務器不做集群的情況下,塊存儲裸盤映射給主機,再格式化使用后,對於主機來說相當於本地盤,那么主機A的本地盤根本不能給主機B去使用,無法共享數據。
- 不利於不同操作系統主機間的數據共享:另外一個原因是因為操作系統使用不同的文件系統,格式化完之后,不同文件系統間的數據是共享不了的。例如一台裝了WIN7/XP,文件系統是FAT32/NTFS,而Linux是EXT4,EXT4是無法識別NTFS的文件系統的。就像一只NTFS格式的U盤,插進Linux的筆記本,根本無法識別出來。所以不利於文件共享。
文件存儲
典型設備:FTP、NFS服務器
為了克服上述文件無法共享的問題,所以有了文件存儲。
文件存儲也有軟硬一體化的設備,但是其實普通拿一台服務器/筆記本,只要裝上合適的操作系統與軟件,就可以架設FTP與NFS服務了,架上該類服務之后的服務器,就是文件存儲的一種了。
主機A可以直接對文件存儲進行文件的上傳下載,與塊存儲不同,主機A是不需要再對文件存儲進行格式化的,因為文件管理功能已經由文件存儲自己搞定了。
優點:
- 造價交低:隨便一台機器就可以了,另外普通以太網就可以,根本不需要專用的SAN網絡,所以造價低。
- 方便文件共享:例如主機A(WIN7,NTFS文件系統),主機B(Linux,EXT4文件系統),想互拷一部電影,本來不行。加了個主機C(NFS服務器),然后可以先A拷到C,再C拷到B就OK了。(例子比較膚淺,請見諒……)
缺點:
- 讀寫速率低,傳輸速率慢:以太網,上傳下載速度較慢,另外所有讀寫都要1台服務器里面的硬盤來承擔,相比起磁盤陣列動不動就幾十上百塊硬盤同時讀寫,速率慢了許多。
對象存儲
典型設備:內置大容量硬盤的分布式服務器
- 對象存儲最常用的方案,就是多台服務器內置大容量硬盤,再裝上對象存儲軟件,然后再額外搞幾台服務作為管理節點,安裝上對象存儲管理軟件。管理節點可以管理其他服務器對外提供讀寫訪問功能。
- 之所以出現了對象存儲這種東西,是為了克服塊存儲與文件存儲各自的缺點,發揚它倆各自的優點。簡單來說塊存儲讀寫快,不利於共享,文件存儲讀寫慢,利於共享。能否弄一個讀寫快,利 於共享的出來呢。於是就有了對象存儲。
首先,一個文件包含了了屬性(術語叫metadata,元數據,例如該文件的大小、修改時間、存儲路徑等)以及內容(以下簡稱數據)。
以往像FAT32這種文件系統,是直接將一份文件的數據與metadata一起存儲的,存儲過程先將文件按照文件系統的最小塊大小來打散(如4M的文件,假設文件系統要求一個塊4K,那么就將文件打散成為1000個小塊),再寫進硬盤里面,過程中沒有區分數據/metadata的。而每個塊最后會告知你下一個要讀取的塊的地址,然后一直這樣順序地按圖索驥,最后完成整份文件的所有塊的讀取。
這種情況下讀寫速率很慢,因為就算你有100個機械手臂在讀寫,但是由於你只有讀取到第一個塊,才能知道下一個塊在哪里,其實相當於只能有1個機械手臂在實際工作。
而對象存儲則將元數據獨立了出來,控制節點叫元數據服務器(服務器+對象存儲管理軟件),里面主要負責存儲對象的屬性(主要是對象的數據被打散存放到了那幾台分布式服務器中的信息),而其他負責存儲數據的分布式服務器叫做OSD,主要負責存儲文件的數據部分。當用戶訪問對象,會先訪問元數據服務器,元數據服務器只負責反饋對象存儲在哪些OSD,假設反饋文件A存儲在B、C、D三台OSD,那么用戶就會再次直接訪問3台OSD服務器去讀取數據。
這時候由於是3台OSD同時對外傳輸數據,所以傳輸的速度就加快了。當OSD服務器數量越多,這種讀寫速度的提升就越大,通過此種方式,實現了讀寫快的目的。
另一方面,對象存儲軟件是有專門的文件系統的,所以OSD對外又相當於文件服務器,那么就不存在文件共享方面的困難了,也解決了文件共享方面的問題。
所以對象存儲的出現,很好地結合了塊存儲與文件存儲的優點。
最后為什么對象存儲兼具塊存儲與文件存儲的好處,還要使用塊存儲或文件存儲呢?
- 有一類應用是需要存儲直接裸盤映射的,例如數據庫。因為數據庫需要存儲裸盤映射給自己后,再根據自己的數據庫文件系統來對裸盤進行格式化的,所以是不能夠采用其他已經被格式化為某種文件系統的存儲的。此類應用更適合使用塊存儲。
- 對象存儲的成本比起普通的文件存儲還是較高,需要購買專門的對象存儲軟件以及大容量硬盤。如果對數據量要求不是海量,只是為了做文件共享的時候,直接用文件存儲的形式好了,性價比高。