物理塊與文件系統之間的關系圖:
映射關系:扇區→物理塊→邏輯塊→文件系統
dfisk:物理塊 lsblk:邏輯塊 df:文件系統
分布式存儲的應用場景根據其存儲接口,即提供的訪問接口,現在流行分為三種:
tip:所謂數據存儲的接口,就是數據傳到哪里你就得接走去存,接走后,剩下的工作就是你做,由你落盤,至於從誰手里接,得看你打交道的對象的支撐。
對象存儲: 也就是通常意義的鍵值存儲,其接口就是簡單的GET、PUT、DEL和其他擴展,如七牛、又拍、Swift、S3。我認為是從應用層把數據接走,數據來的時候就是二進制數據。
塊存儲:這種接口通常以QEMU Driver或者Kernel Module的方式存在,這種接口需要實現Linux的Block Device的接口或者QEMU提供的Block Driver接口(yz補充:eg:iscsi就是一種block drive),塊存儲軟件如Sheepdog,如j金山雲的ebs,AWS的EBS,青雲的雲硬盤和阿里雲的盤古系統,還有Ceph的RBD(RBD是Ceph面向塊存儲的接口)。我認為是從qemu-driver或者kernel-module的手里把數據接走,這些數據來的形式是盤符和二進制數據和偏移。
三種分布式存儲的存儲設備:即數據最終落到哪里
【塊存儲】典型設備:磁盤陣列,硬盤,虛擬硬盤
【文件存儲】典型設備:FTP、NFS服務器,SamBa
【對象存儲】典型設備:內置大容量硬盤的分布式服務器
本質是一樣的,底層都是塊存儲,只是在對外接口上表現不一致,分別應用於不同的業務場景。
首先,我說下塊存儲。塊存儲可以看作為是裸盤,最明顯的特征是不能被操作系統直接訪問。可以通過划分邏輯卷、做RAID、LVM(邏輯卷)等方式將它格式化,可以格式化為你所指定的文件系統(Ext3,Ext4,NTFS,FAT32等),然后才可以被操作系統訪問。常見的DAS、FC-SAN、IP-SAN都是塊存儲。
優點:讀寫速度快(帶寬和IOPS);缺點:太過於底層,不利於擴展,不能被共享;
其次,與塊存儲對應的是文件存儲。文件存儲可以分為本地文件存儲和網絡文件存儲。
- 本地文件存儲:ext3,ext4,NTFS,FAT32
- 網絡文件存儲(NAS存儲):CIFS,NFS
文件存儲最明顯的特征是支持POSIX的文件訪問接口:open、read、write、seek、close等;
優點:便於擴展&共享;缺點:讀寫速度慢;
對象存儲,相對來說是比較新的一種存儲。有一種說法是這樣的,對象存儲一定是分布式存儲,因為分布式文件存儲可能是分布式存儲,而未必是對象存儲。常見的對象存儲的開源實現有Ceph的RADOS、Openstack的swift、AWS s3等;常見分布式文件系統有lustre、glusterfs、HDFS等;
表面區別:對象存儲支持的訪問接口基本是restful接口,而分布式文件存儲提供的是POSIX兼容的文件操作接口;
本質區別:分布式文件存儲文件組織方式為目錄樹,對象存儲采用的是扁平的組織方式;對象存儲不支持隨機讀取和寫入,put和get都是針對整個文件。
【塊存儲】
典型設備:磁盤陣列,硬盤
塊存儲主要是將裸磁盤空間整個映射給主機使用的,就是說例如磁盤陣列里面有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、不利於不同操作系統主機間的數據共享:另外一個原因是因為操作系統使用不同的文件系統,格式化完之后,不同文件系統間的數據是共享不了的。例如一台裝了WIN7/XP,文件系統是FAT32/NTFS,而Linux是EXT4,EXT4是無法識別NTFS的文件系統的。就像一只NTFS格式的U盤,插進Linux的筆記本,根本無法識別出來。所以不利於文件共享。
【對象存儲】
典型設備:內置大容量硬盤的分布式服務器
對象存儲最常用的方案,就是多台服務器內置大容量硬盤,再裝上對象存儲軟件,然后再額外搞幾台服務作為管理節點,安裝上對象存儲管理軟件。管理節點可以管理其他服務器對外提供讀寫訪問功能。
之所以出現了對象存儲這種東西,是為了克服塊存儲與文件存儲各自的缺點,發揚它倆各自的優點。簡單來說塊存儲讀寫快,不利於共享,文件存儲讀寫慢,利於共享。能否弄一個讀寫快,利 於共享的出來呢。於是就有了對象存儲。
首先,一個文件包含了了屬性(術語叫metadata,元數據,例如該文件的大小、修改時間、存儲路徑等)以及內容(以下簡稱數據)。
以往像FAT32這種文件系統,是直接將一份文件的數據與metadata一起存儲的,存儲過程先將文件按照文件系統的最小塊大小來打散(如4M的文件,假設文件系統要求一個塊4K,那么就將文件打散成為1000個小塊),再寫進硬盤里面,過程中沒有區分數據/metadata的。而每個塊最后會告知你下一個要讀取的塊的地址,然后一直這樣順序地按圖索驥,最后完成整份文件的所有塊的讀取。
這種情況下讀寫速率很慢,因為就算你有100個機械手臂在讀寫,但是由於你只有讀取到第一個塊,才能知道下一個塊在哪里,其實相當於只能有1個機械手臂在實際工作。
而對象存儲則將元數據獨立了出來,控制節點叫元數據服務器(服務器+對象存儲管理軟件),里面主要負責存儲對象的屬性(主要是對象的數據被打散存放到了那幾台分布式服務器中的信息),而其他負責存儲數據的分布式服務器叫做OSD,主要負責存儲文件的數據部分。當用戶訪問對象,會先訪問元數據服務器,元數據服務器只負責反饋對象存儲在哪些OSD,假設反饋文件A存儲在B、C、D三台OSD,那么用戶就會再次直接訪問3台OSD服務器去讀取數據。
這時候由於是3台OSD同時對外傳輸數據,所以傳輸的速度就加快了。當OSD服務器數量越多,這種讀寫速度的提升就越大,通過此種方式,實現了讀寫快的目的。
另一方面,對象存儲軟件是有專門的文件系統的,所以OSD對外又相當於文件服務器,那么就不存在文件共享方面的困難了,也解決了文件共享方面的問題。
所以對象存儲的出現,很好地結合了塊存儲與文件存儲的優點。
最后為什么對象存儲兼具塊存儲與文件存儲的好處,還要使用塊存儲或文件存儲呢?
1、有一類應用是需要存儲直接裸盤映射的,例如數據庫。因為數據庫需要存儲裸盤映射給自己后,再根據自己的數據庫文件系統來對裸盤進行格式化的,所以是不能夠采用其他已經被格式化為某種文件系統的存儲的。此類應用更適合使用塊存儲。
2、對象存儲的成本比起普通的文件存儲還是較高,需要購買專門的對象存儲軟件以及大容量硬盤。如果對數據量要求不是海量,只是為了做文件共享的時候,直接用文件存儲的形式好了,性價比高。