Ceph分佈式存儲

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

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


Ceph主要有三個基本進程

  • Osd

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

  • MDS(可選)

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

  • Monitor

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


  1. 架構總攬

數據庫

  1.1支持接口
後端


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

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.七、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讀寫性能。

相關文章
相關標籤/搜索