1. 程式人生 > >Ceph企業分布式存儲——概述篇

Ceph企業分布式存儲——概述篇

onf 默認 無法 讀數 狀態 兩種 硬盤 擁有 強一致性

一、概述
             Ceph是可靠的、可擴展的、統一的、開源分布式的存儲系統。可以同時提供對象存RADOSGW(Reliable、Autonomic、Distributed、Object Storage Gateway)、塊存儲RBD(Rados Block Device)、文件系統存儲Ceph FS(Ceph Filesystem)3種功能。  

  Ceph是一個開源的分布式文件系統。因為它還支持塊存儲、對象存儲,所以很自然的被用做雲計算框架openstack或cloudstack整個存儲後端。當然也可以單獨作為存儲,例如部署一套集群作為對象存儲、SAN存儲、NAS存儲等。

         ceph官方文檔 http://docs.ceph.org.cn/

  ceph中文開源社區 http://ceph.org.cn/

linux中硬盤的分類

查看下Linux環境中的設備:

            [[email protected] ~] 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*就是由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

Ceph的文件系統存儲接口

            **什麽是Ceph的文件系統接口?**
            用戶可以在塊設備上創建xfs文件系統,也可以創建ext4等其他文件系統。如圖,Ceph集群實現了自己的文件系統來組織管理集群的存儲空間,用戶可以直接將Ceph集群的文件系統掛載到用戶機上使用。

            ![](https://s1.51cto.com/images/blog/201905/13/6aa30eef6c5f48993ef76d6605906a74.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

        **  Ceph有了塊設備接口,在塊設備上完全可以構建一個文件系統,那麽Ceph為什麽還需要文件系統接口呢?**
            主要是因為應用場景的不同,Ceph的塊設備具有優異的讀寫性能,但不能多處掛載同時讀寫,目前主要用在OpenStack上作為虛擬磁盤,而Ceph的文件系統接口讀寫性能較塊設備接口差,但具有優異的共享性。

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

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

            ![](https://s1.51cto.com/images/blog/201905/13/59c9230ac02a194f62cbd334f0268270.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

            ![](https://s1.51cto.com/images/blog/201905/13/1af8462ebf7c4e3adfae5c6b9fc8cefa.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

            **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協議上傳下載刪除對象(文件即對象)

            ![](https://s1.51cto.com/images/blog/201905/13/e19b64f2d7d067dcaa4fb2723d28f6ab.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

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

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

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

            存儲空間(Bucket)所謂的桶

存儲空間是您用於存儲對象(Object)的容器,所有的對象都必須隸屬於某個存儲空間。您可以設置和修改存儲空間屬性用來控制地域、訪問權限、生命周期等,這些屬性設置直接作用於該存儲空間內所有對象,因此您可以通過靈活創建不同的存儲空間來完成不同的管理功能。

同一個存儲空間的內部是扁平的,沒有文件系統的目錄等概念,所有的對象都直接隸屬於其對應的存儲空間。
每個用戶可以擁有多個存儲空間
存儲空間的名稱在 OSS 範圍內必須是全局唯一的,一旦創建之後無法修改名稱。
存儲空間內部的對象數目沒有限制。

存儲空間的命名規範如下:
只能包括小寫字母、數字和短橫線(-)。
必須以小寫字母或者數字開頭和結尾。
長度必須在3-63字節之間

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

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

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

Ceph 優點

            1、統一存儲

    雖然ceph底層是一個分布式文件系統,但由於在上層開發了支持對象和塊的接口。所以在開源存儲軟件中,能夠一統江湖。至於能不能千秋萬代,就不知了。

  2、高擴展性
    擴容方便、容量大。能夠管理上千臺服務器、EB級的容量。

  3、可靠性強
    支持多份強一致性副本,EC。副本能夠垮主機、機架、機房、數據中心存放。所以安全可靠。存儲節點可以自管理、自動修復。無單點故障,容錯性強。

  4、高性能
    因為是多個副本,因此在讀寫操作時候能夠做到高度並行化。理論上,節點越多,整個集群的IOPS和吞吐量越高。另外一點ceph客戶端讀寫數據直接與存儲設備(osd) 交互。

Ceph應用場景

            Ceph可以提供對象存儲、塊設備存儲和文件系統服務,其對象存儲可以對接網盤(owncloud)應用業務等;其塊設備存儲可以對接(IaaS),當前主流的IaaS運平臺軟件,如:OpenStack、CloudStack、Zstack、Eucalyptus等以及kvm等。

ceph功能組件

            ![](https://s1.51cto.com/images/blog/201905/13/e2972edc0d22c73a2aa97562860f3c4a.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

Ceph各組件介紹

            OSD(Object Storage Device):** Ceph OSD 守護進程( Ceph OSD )的功能是存儲數據,處理數據的復制、恢復、回填、再均衡,並通過檢查其他OSD 守護進程的心跳來向 Ceph Monitors 提供一些監控信息。當 Ceph 存儲集群設定為有2個副本時,至少需要2個 OSD 守護進程,集群才能達到 active+clean 狀態( Ceph 默認有3個副本,但你可以調整副本數)。

Monitor: Ceph Monitor維護著展示集群狀態的各種圖表,包括監視器圖、 OSD 圖、歸置組( PG )圖、和 CRUSH 圖。 Ceph 保存著發生在Monitors 、 OSD 和 PG上的每一次狀態變更的歷史信息(稱為 epoch )。
MDS(Metadata Server):Ceph 元數據服務器( MDS )為 Ceph 文件系統存儲元數據(也就是說,Ceph 塊設備和 Ceph 對象存儲不使用MDS )。元數據服務器使得 POSIX 文件系統的用戶們,可以在不對 Ceph 存儲集群造成負擔的前提下,執行諸如 ls、find 等基本命令。

Ceph架構

            ![](https://s1.51cto.com/images/blog/201905/13/c53e41c7a4cec5de8b84d67229aad36d.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

            1)基礎存儲系統 RADOS

RADOS:可靠自主分布式對象存儲。它是ceph存儲的基礎,保證一切都以對象形式存儲。
2) 基礎庫LIBRADOS
LIBADOS:功能是對RADOS進行抽象和封裝,並向上層提供API,以便直接基於RADOS進行應用開發。

Ceph企業分布式存儲——概述篇