Ceph分佈式存儲

        目前, 磁盤具備容量優勢, 固態硬盤具備速度優勢。 但能否讓容量和性能不侷限在一個存儲器單元呢? 我們很快聯想到磁盤陣列技術(Redundant Array of Independent Disk, RAID, 不限於HDD) 。 磁盤陣列技術是一種把多塊獨立的硬盤按不同的方式組合起來形成一個硬盤組(DiskGroup, 又稱Virtual Disk) , 從而提供比單個硬盤更高的存儲性能與數據備份能力的技術。 磁盤陣列技術既可提供多塊硬盤讀寫的聚合能力, 又能提供硬盤故障的容錯能力。鏡像技(Mirroring) 又稱爲複製技術(Replication) , 可提供數據冗餘性和高可用性; 條帶(Striping) , 可提供並行的數據吞吐能力; 糾刪碼(Erasure Code) , 把數據切片並增加冗餘編碼而提供高可用性和高速讀寫能力。 鏡像、 條帶和糾刪碼是磁盤陣列技術經典的數據分發方式, 這3種經典的磁盤技術可通過組合方式提供更加豐富的數據讀寫性能。
        傳統的磁盤陣列技術的關注點在於數據在磁盤上的分發方式, 隨着通用磁盤、 通用服務器, 以及高速網絡的成本降低, 使數據在磁盤上的分發擴展到在服務器節點上的分發成爲可能。 鏡像技術、 條帶技術和糾刪碼技術基於服務器節點的粒度實現後, 這些技術的特點不再侷限於單個設備的性能, 而是具備“橫向擴展”能力。 我們暫且認爲這是分佈式存儲本質的體現。分佈式存儲解決了數據體量問題, 對應用程序提供標準統一的訪問接入, 既能提升數據安全性和可靠性, 又能提高存儲整體容量和性能。 可以預見, 分佈式存儲是大規模存儲的一個實現方向。 分佈式存儲廣泛地應用於航天、 航空、 石油、 科研、 政務、 醫療、 視頻等高性能計算、 雲計算和大數據處理領域。 目前行業應用對分佈式存儲技術需求旺盛, 其處於快速發展階段

Ceph是一個開源的分佈式存儲系統。因爲它還支持塊存儲、對象存儲,所以很自然的被用做雲計算框架openstack或cloudstack整個存儲後端。當然也可以單獨作爲存儲,例如部署一套集羣作爲對象存儲、SAN存儲、NAS存儲等。國內外很多公司實踐證明,ceph塊存儲和對象存儲是完成可靠的。


Ceph主要有三個基本進程

  • Osd

    用於集羣中所有數據與對象的存儲。處理集羣數據的複製、恢復、回填、再均衡。並向其他osd守護進程發送心跳,然後向Mon提供一些監控信息。
    當Ceph存儲集羣設定數據有兩個副本時(一共存兩份),則至少需要兩個OSD守護進程即兩個OSD節點,集羣才能達到active+clean狀態。

  • MDS(可選)

    爲Ceph文件系統提供元數據計算、緩存與同步。在ceph中,元數據也是存儲在osd節點中的,mds類似於元數據的代理緩存服務器。MDS進程並不是必須的進程,只有需要使用CEPHFS時,才需要配置MDS節點。

  • Monitor

    監控整個集羣的狀態,維護集羣的cluster MAP二進制表,保證集羣數據的一致性。ClusterMAP描述了對象塊存儲的物理位置,以及一個將設備聚合到物理位置的桶列表。(官網要求集羣中至少爲三個且爲奇數)


  1. 架構總攬

  1.1支持接口


        RADOS本身也是分佈式存儲系統,CEPH所有的存儲功能都是基於RADOS實現。RADOS採用C++開發,所提供的原生Librados API包括C和C++兩種。Ceph的上層應用調用本機上的librados API,再由後者通過socket與RADOS集羣中的其他節點通信並完成各種操作。首先看一下ceph存儲過程:

image.png

       對象存儲:即radosgw,兼容S3接口。通過rest api上傳、下載文件。

  文件系統:posix接口。可以將ceph集羣看做一個共享文件系統掛載到本地。

  塊存儲:即rbd。有kernel rbd和librbd兩種使用方式。支持快照、克隆。相當於一塊硬盤掛到本地,用法和用途和硬盤一樣。

       無論使用哪種存儲方式(對象、塊、掛載),存儲的數據都會被切分成對象(Objects)。Objects size大小可以由管理員調整,通常爲2M或4M。每個對象都會有一個唯一的OID,由ino與ono生成,雖然這些名詞看上去很複雜,其實相當簡單。ino即是文件的File ID,用於在全局唯一標示每一個文件,而ono則是分片的編號。比如:一個文件FileID爲A,它被切成了兩個對象,一個對象編號0,另一個編號1,那麼這兩個文件的oid則爲A0與A1。Oid的好處是可以唯一標示每個不同的對象,並且存儲了對象與文件的從屬關係。由於ceph的所有數據都虛擬成了整齊劃一的對象,所以在讀寫時效率都會比較高。

  但是對象並不會直接存儲進OSD中,因爲對象的size很小,在一個大規模的集羣中可能有幾百到幾千萬個對象。這麼多對象光是遍歷尋址,速度都是很緩慢的;並且如果將對象直接通過某種固定映射的哈希算法映射到osd上,當這個osd損壞時,對象無法自動遷移至其他osd上面(因爲映射函數不允許)。爲了解決這些問題,ceph引入了歸置組的概念,即PG。

  PG是一個邏輯概念,我們linux系統中可以直接看到對象,但是無法直接看到PG。它在數據尋址時類似於數據庫中的索引:每個對象都會固定映射進一個PG中,所以當我們要尋找一個對象時,只需要先找到對象所屬的PG,然後遍歷這個PG就可以了,無需遍歷所有對象。而且在數據遷移時,也是以PG作爲基本單位進行遷移,ceph不會直接操作對象。

  對象時如何映射進PG的?還記得OID麼?首先使用靜態hash函數對OID做hash取出特徵碼,用特徵碼與PG的數量去模,得到的序號則是PGID。由於這種設計方式,PG的數量多寡直接決定了數據分佈的均勻性,所以合理設置的PG數量可以很好的提升CEPH集羣的性能並使數據均勻分佈。

  最後PG會根據管理員設置的副本數量進行復制,然後通過crush算法存儲到不同的OSD節點上(其實是把PG中的所有對象存儲到節點上),第一個osd節點即爲主節點,其餘均爲從節點。


  1.2 優點
  分佈式文件系統很多,ceph相比其他的優點:
  1.2.1 統一存儲
  雖然ceph底層是一個分佈式文件系統,但由於在上層開發了支持對象和塊的接口。所以在開源存儲軟件中,能夠一統江湖。至於能不能千秋萬代,就不知了。
  1.2.2 高擴展性
  說人話就是擴容方便、容量大。能夠管理上千臺服務器、EB級的容量。
  1.2.3 可靠性強
  支持多份強一致性副本,EC。副本能夠垮主機、機架、機房、數據中心存放。所以安全可靠。存儲節點可以自管理、自動修復。無單點故障,容錯性強。

  1.2.4 高性能
  因爲是多個副本,因此在讀寫操作時候能夠做到高度並行化。理論上,節點越多,整個集羣的IOPS和吞吐量越高。另外一點ceph客戶端讀寫數據直接與存儲設備(osd) 交互。在塊存儲和對象存儲中無需元數據服務器。
  注:上面的都是ceph呈現的設計理念優勢,由於ceph各個版本都存在bug,具體應用得經過大規模測試驗證。推薦版本:0.67.0、0.80.7、0、94.2

  1.3 Rados集羣
  Rados集羣是ceph的存儲核心。下面先簡單介紹各個組件的作用。後續會講解各個組件之間如何協作。


  如圖,rados集羣中分爲以下角色:mdss、osds、mons. Osd 對象存儲設備,可以理解爲一塊硬盤+osd 管理進程,負責接受客戶端的讀寫、osd間數據檢驗(srub)、數據恢復(recovery)、心跳檢測等。Mons 主要解決分佈式系統的狀態一致性問題,維護集羣內節點關係圖(mon-map osd-map mds-map pg-map)的一致性,包括osd的添加、刪除的狀態更新。Mds元數據服務器,在文件存儲時是必須配置。需要注意的是,mds服務器並不存放數據,僅僅只是管理元數據的進程。Ceph文件系統的inode等元數據真正存在rados集羣(默認在metadata pool)。以下信息,呈現的是ceph集羣中狀態信息。

  # ceph -s

  cluster 72d3c6b5-ea26-4af5-9a6f-7811befc6522

  health HEALTH_WARN

  clock skew detected on mon.mon1, mon.mon3

  monmap e3: 3 mons at {mon1=10.25.25.236:6789/0,mon2=10.25.25.235:6789/0,mon3=10.25.25.238:6789/0}

  election epoch 16, quorum 0,1,2 mon2,mon1,mon3

  osdmap e330: 44 osds: 44 up, 44 in

  pgmap v124351: 1024 pgs, 1 pools, 2432 GB data, 611 kobjects

  6543 GB used, 153 TB / 160 TB avail

  1024 active+clean

  2. 什麼是對象存儲

  我的理解從幾方面來闡述:
  一是:從存儲數據類型來講,指非結構化數據,如圖片、音視頻、文檔等。
  二是:從應用場景來說,即一次寫人多次讀取。
  三是:從使用方式,與文件posix不同,對象存儲一般使用bucket(桶)概念,給你一個桶,你變可以向桶裏存儲數據(通過對象id)。


  3. 什麼是塊存儲

  塊存儲的典型設備是磁盤或磁盤陣列。以塊形式的方式存取數據的。單盤的iops和吞吐很低,所以自然想到用raid來並行的讀寫。Ceph的塊存儲當然也是解決此類問題,不過利用分佈式提供更高的性能,可靠和擴展性。只不過ceph是一種網絡塊設備,如同SAN。下圖就是ceph 將分佈在不同主機磁盤“虛擬”後,提供給VM做磁盤。


  4. Ceph 組件交互

  亂扯淡:其實在IT領域,一直是分分合合的狀態。分久必合,合久必分。例如,單臺計算機由cpu,內存,輸入輸出設備,總線等組件協同工作。當單機計算,存儲能力不足時候,就開始分化成分佈式架構。網絡就相當於總線,網絡設備就是路由中心、數據中轉站,對外提供更強計算、存儲能力的計算機。物理(邏輯)分開的主機協同工作,則需要主要解決下列的問題:

  連:如何將獨立的單元連起來。

  找:連起來的目的當然不是爲了繁殖,而是通信。首先得找到它。

  發:找到主機後,得發數據交互才能產生價值,繁衍數據吧。

  接下來看ceph如何解決這些問題的。

  4.1 rados -連連看

  前面介紹了rados集羣中各個角色的分工。通過一張邏輯部署圖將各個組件聯繫起來。


  4.2 crush-我要找到你

  Client 讀寫數據,則需要找到數據應該存放的節點位置。一般做法將這種映射關係記錄(hdfs)或者靠算法計算(一致性hash)。Ceph採用的是更聰明的crush算法,解決文件到osd的映射。先看看ceph中管理數據(對象)的關係。首先ceph中的對象被池(pool)化,pool中有若干個pg,pg是管理一堆對象的邏輯單位。一個pg分佈在不同的osd上。如圖client端的文件會被拆分個object,這些對象以pg的單位分佈。


  Crush算法的輸入爲(pool obj),即ceph的命名空間

  計算pg號,通過obj mod 當前pool中的pg總數

  Crush(pg,crushmap) 計算出多個osd。crush算法是一個多輸入的僞隨機算法, Crushmap主要是整個集羣osd的層次結果、權重信息、副本策略信息。

  後面我會介紹crush算法內部實現細節。

  4.3 ceph rw-數據交互

  Rados集羣中節點相互的通信。主要包括下面幾個方面:

  客戶端讀寫

  主要接收客戶端上傳、下載、更新、刪除操作。爲了保持數據強一致性,寫操作必須幾個副本寫成功後纔算一次寫操作完成。(客戶端只會向primary寫)


  集羣內部讀寫

  包括osd間數據同步,數據校驗、心跳檢查。Mon與osd間心跳檢查,mon間狀態同步等。

       Journal的作用類似於mysql innodb引擎中的事物日誌系統。當有突發的大量寫入操作時,ceph可以先把一些零散的,隨機的IO請求保存到緩存中進行合併,然後再統一向內核發起IO請求。這樣做效率會比較高,但是一旦osd節點崩潰,緩存中的數據就會丟失,所以數據在還未寫進硬盤中時,都會記錄到journal中,當osd崩潰後重新啓動時,會自動嘗試從journal恢復因崩潰丟失的緩存數據。因此journal的io是非常密集的,而且由於一個數據要io兩次,很大程度上也損耗了硬件的io性能,所以通常在生產環境中,使用ssd來單獨存儲journal文件以提高ceph讀寫性能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章