Ceph的三種存儲接口(塊設備、文件系統、對象存儲)


轉載於: https://blog.csdn.net/wangmingshuaiguo/article/details/92628036

       “Ceph是一個開源的、統一的、分布式的存儲系統”,這是我們宣傳Ceph時常說的一句話,其中“統一”是說Ceph可以一套存儲系統同時提供塊設備存儲、文件系統存儲和對象存儲三種存儲功能。一聽這句話,具有一定存儲基礎的用戶應該已經大致了解了Ceph的存儲接口,而沒有存儲基礎的小白用戶則 一臉懵逼。本文旨在讓小白用戶理解Ceph的塊存儲、文件系統存儲和對象存儲接口。

 

                        

一. Ceph的塊設備存儲接口

首先,什么是塊設備?

塊設備是i/o設備中的一類,是將信息存儲在固定大小的塊中,每個塊都有自己的地址,還可以在設備的任意位置讀取一定長度的數據。看不懂?那就暫且認為塊設備就是硬盤或虛擬硬盤吧。

查看下Linux環境中的設備:

root@nb:~$ ls /dev/
/dev/sda/ dev/sda1 /dev/sda2 /dev/sdb /dev/sdb1 /dev/hda 
/dev/rbd1 /dev/rbd2 …

上面的/dev/sda、/dev/sdb和/dev/hda都是塊設備文件,這些文件是怎么出現的呢?

當給計算機連接塊設備(硬盤)后,系統檢測的有新的塊設備,該類型塊設備的驅動程序就在/dev/下創建個對應的塊設備設備文件,用戶就可以通過設備文件使用該塊設備了。

它們怎么有的叫 sda?有的叫 sdb?有的叫 hda?

以sd開頭的塊設備文件對應的是SATA接口的硬盤,而以hd開頭的塊設備文件對應的是IDE接口的硬盤。那SATA接口的硬盤跟IDE接口的硬盤有啥區別?你只需要知道,IDE接口硬盤已經很少見到了,逐漸被淘汰中,而SATA接口的硬盤是目前的主流。而sda和sdb的區別呢?當系統檢測到多個SATA硬盤時,會根據檢測到的順序對硬盤設備進行字母順序的命名。PS:系統按檢測順序命名硬盤會導致了盤符漂移的問題。

怎么還有的叫 rbd1 和 rbd2 呢?

被你發現了,rbd就是我們壓軸主角了。rbd就是由Ceph集群提供出來的塊設備。可以這樣理解,sda和hda都是通過數據線連接到了真實的硬盤,而rbd是通過網絡連接到了Ceph集群中的一塊存儲區域,往rbd設備文件寫入數據,最終會被存儲到Ceph集群的這塊區域中。

那么塊設備怎么用呢?這里舉個例子:

打個比方,一個塊設備是一個糧倉,數據就是糧食。農民伯伯可以存糧食(寫數據)了,需要存100斤玉米,糧倉(塊設備)這么大放哪里呢,就挨着放(順序寫)吧。又需要存1000斤花生,還是挨着放吧。又需要存……

后來,農民伯伯來提糧食(讀數據)了,他當時存了1000斤小麥,哎呀媽呀,糧倉這么大,小麥在哪里啊?倉庫管理員找啊找,然后哭暈在了廁所……

新管理員到任后,想了個法子來解決這個問題,用油漆把倉庫划分成了方格狀,並且編了號,在倉庫門口的方格那掛了個黑板,當農民伯伯來存糧食時,管理員在黑板記錄,張三存了1000斤小麥在xx方格處。后來,農民伯伯張三來取糧食時,倉庫管理員根據小黑板的記錄很快提取了糧食。

故事到此為止了,沒有方格和黑板的倉庫(塊設備)稱為裸設備。由上例可見,裸設備對於用戶使用是很不友好的,直接導致了舊倉庫管理員的狗帶。例子中划分方格和掛黑板的過程其實是在塊設備上構建文件系統的過程,文件系統可以幫助塊設備對存儲空間進行條理的組織和管理,於是新管理員通過文件系統(格子和黑板)迅速找到了用戶(農民伯伯張三)存儲的數據(1000斤小麥)。針對多種多樣的使用場景,衍生出了很多的文件系統。有的文件系統能夠提供更好的讀性能,有的文件系統能提供更好的寫性能。我們平時常用的文件系統如xfs、ext4是讀寫性能等各方面比較均衡的通用文件系統。

能否直接使用不含有文件系統塊設備呢?

可以的,xfs和ext4等通用的文件系統旨在滿足大多數用戶的存儲需求,所以在數據存儲的各方面的性能比較均衡。然而,很多應用往往並不需要這種均衡,而需要突出某一方面的性能,如小文件的存儲性能。此時,xfs、ext4等通用文件系統如果不能滿足應用的需求,應用往往會在裸設備上實現自己的數據組織和管理方式。簡單的說,就是應用為了強化某種存儲特性而實現自己定制的數據組織和管理方式,而不使用通用的文件系統。

Ceph塊設備接口怎么使用?

在Ceph集群中創建塊設備:

// 保證/etc/ceph目錄下有Ceph集群的配置文件ceph.conf和ceph.client.admin.keyring 
rbd create -s 1G myrbd
在用戶機上掛載該Ceph塊設備,可以理解為往用戶機上插入硬盤:
rbdmap myrbd
// 輸出: 
/dev/rbd1

將Ceph塊設備格式化成文件系統並掛載:

mkfs.xfs /dev/rbd1
mkdir -p /mnt/ceph_rbd
mount /dev/rbd1 /mnt/ceph_rbd

通過/mnt/ceph_rbd讀寫數據,都是在讀寫Ceph集群中該塊設備對應的存儲區域

總結一下,塊設備可理解成一塊硬盤,用戶可以直接使用不含文件系統的塊設備,也可以將其格式化成特定的文件系統,由文件系統來組織管理存儲空間,從而為用戶提供豐富而友好的數據操作支持。

二. Ceph的文件系統存儲接口

什么是Ceph的文件系統接口?

還記得上面說的塊設備上的文件系統嗎,用戶可以在塊設備上創建xfs文件系統,也可以創建ext4等其他文件系統。如圖1,Ceph集群實現了自己的文件系統來組織管理集群的存儲空間,用戶可以直接將Ceph集群的文件系統掛載到用戶機上使用。

                               
                                 
                                                                      圖1 Ceph的塊設備接口和文件系統接口對比

 

 Ceph有了塊設備接口,在塊設備上完全可以構建一個文件系統,那么Ceph為什么還需要文件系統接口呢?

主要是因為應用場景的不同,Ceph的塊設備具有優異的讀寫性能,但不能多處掛載同時讀寫,目前主要用在OpenStack上作為虛擬磁盤,而Ceph的文件系統接口讀寫性能較塊設備接口差,但具有優異的共享性。PS:想了解更多?快去查查SAN和NAS。

為什么Ceph的塊設備接口不具有共享性,而Ceph的文件系統接口具有呢?

       對於Ceph的塊設備接口,如圖2,文件系統的結構狀態是維護在各用戶機內存中的,假設Ceph塊設備同時掛載到了用戶機1和用戶機2,當在用戶機1上的文件系統中寫入數據后,更新了用戶機1的內存中文件系統狀態,最終數據存儲到了Ceph集群中,但是此時用戶機2內存中的文件系統並不能得知底層Ceph集群數據已經變化而維持數據結構不變,因此用戶無法從用戶機2上讀取用戶機1上新寫入的數據。

        對於Ceph的文件系統接口,如圖3,文件系統的結構狀態是維護在遠端Ceph集群中的,Ceph文件系統同時掛載到了用戶機1和用戶機2,當往用戶機1的掛載點寫入數據后,遠端Ceph集群中的文件系統狀態結構隨之更新,當從用戶機2的掛載點訪問數據時會去遠端Ceph集群取數據,由於遠端Ceph集群已更新,所有用戶機2能夠獲取最新的數據。

 

                                  
                                                                                    圖2 Ceph塊設備接口共享性

 

                                 
 
 
                                   
                                                                                           圖3 Ceph文件系統接口共享性

 

Ceph的文件系統接口使用方式?

將Ceph的文件系統掛載到用戶機目錄

/* 保證/etc/ceph目錄下有Ceph集群的配置文件ceph.conf和ceph.client.admin.keyring */
mkdir -p /mnt/ceph_fuse 
ceph-fuse /mnt/ceph_fuse

大功告成,在/mnt/ceph_fuse下讀寫數據,都是讀寫遠程Ceph集群

總結一下,Ceph的文件系統接口彌補了Ceph的塊設備接口在共享性方面的不足,Ceph的文件系統接口符合POSIX標准,用戶可以像使用本地存儲目錄一樣使用Ceph的文件系統的掛載目錄。還是不懂?這樣理解吧,無需修改你的程序,就可以將程序的底層存儲換成空間無限並可多處共享讀寫的Ceph集群文件系統。

三. Ceph的對象存儲接口

首先,通過圖4來看下對象存儲接口是怎么用的?

簡單了說,使用方式就是通過http協議上傳下載刪除對象(文件即對象)。

 

                                   
                                                                   圖4 對象存儲接口的使用方式

 

老問題來了,有了塊設備接口存儲和文件系統接口存儲,為什么還整個對象存儲呢?

往簡單了說,Ceph的塊設備存儲具有優異的存儲性能但不具有共享性,而Ceph的文件系統具有共享性然而性能較塊設備存儲差,為什么不權衡一下存儲性能和共享性,整個具有共享性而存儲性能好於文件系統存儲的存儲呢,對象存儲就這樣出現了。

對象存儲為什么性能會比文件系統好?

原因是多方面的,主要原因是對象存儲組織數據的方式相對簡單,只有bucket和對象兩個層次(對象存儲在bucket中),對對象的操作也相對簡單。而文件系統存儲具有復雜的數據組織方式,目錄和文件層次可具有無限深度,對目錄和文件的操作也復雜的多,因此文件系統存儲在維護文件系統的結構數據時會更加繁雜,從而導致文件系統的存儲性能偏低。

Ceph的對象存儲接口怎么用呢?

Ceph的對象接口符合亞馬遜S3接口標准和OpenStack的Swift接口標准,可以自行學習這兩種接口。

總結一下,文件系統存儲具有復雜的數據組織結構,能夠提供給用戶更加豐富的數據操作接口,而對象存儲精簡了數據組織結構,提供給用戶有限的數據操作接口,以換取更好的存儲性能。對象接口提供了REST API,非常適用於作為web應用的存儲。

參考文檔:  http://docs.ceph.org.cn/radosgw/s3/

四. 總結

         概括一下,塊設備速度快,對存儲的數據沒有進行組織管理,但在大多數場景下,用戶數據讀寫不方便(以塊設備位置offset + 數據的length來記錄數據位置,讀寫數據)。而在塊設備上構建了文件系統后,文件系統幫助塊設備組織管理數據,數據存儲對用戶更加友好(以文件名來讀寫數據)。Ceph文件系統接口解決了“Ceph塊設備+本地文件系統”不支持多客戶端共享讀寫的問題,但由於文件系統結構的復雜性導致了存儲性能較Ceph塊設備差。對象存儲接口是一種折中,保證一定的存儲性能,同時支持多客戶端共享讀寫。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM