分散式存儲系統之Ceph基礎

  Ceph基礎概述

  Ceph是一個對象式存儲系統,所謂對象式存儲是指它把每一個待管理的數據流(比如一個文件)切分成一到多個固定大小的對象數據,並以其為原子單元完成數據的存取;對象數據的底層存儲服務由多個主機組成的存儲集群;該集群被稱之為RADOS(Reliable Automatic Distributed Object Store)集群;翻譯成中文就是可靠的、自動化分散式對象存儲系統;

  Ceph架構

  提示:librados是RADOS存儲集群的API,它支援C、C++、java、python和php等變成語言;RADOSGW、RBD、CEPHFS都是RADOS存儲服務的客戶介面;它們分別把rados存儲服務介面librados從不同角度做了進一步的抽象,因而各自適用於不同的應用場景;RADOSGW是將底層rados存儲服務抽象為以RESTful風格介面提供對象存儲服務,適用於存取對象數據的介面,比如web服務;RBD是將底層RADOS存儲服務抽象為塊設備的存儲設備;主要用於虛擬化,比如給虛擬機提供硬碟;CEPHFS是將底層RADOS抽象為一個文件系統介面,供其他主機使用;

  提示:RADOS集群主要由Monitors、Managers、Ceph OSDs、Ceph MDSs這幾個組件組成;其中Monitor主要作用是監控整個集群的狀態,健康與否等;它擁有整個集群的運行圖(monitor map、manager map、OSD map、和CRUSH map);除此之外,它還負責維護集群各組件之間以及客戶端接入RADOS集群存取數據時的認證資訊和實行認證;簡單講mon組件就是管理和維護其他組件狀態以及接入RADOS集群的認證資訊並實行認證,一旦mon組件所在主機宕機,那麼整個集群將不可用;有點類似k8s里的etcd;所以為實現冗餘和高可用性,通常在集群我們部署大於1的奇數個mon(因為它使用Paxos協議,為防止網路分區等原因,保證服務的正常可用);manager組件主要負責跟蹤運行時指標和Ceph集群的當前狀態,包括存儲利用率,當前性能指標和系統負載等,Ceph集群資訊,包括基於web的Ceph管理器儀錶板和REST API。高可用性通常需要至少兩個mgr組件。OSD組件是存儲數據,處理數據複製、恢復、再平衡,並提供一些監視資訊的組件;Ceph通過檢查其他Ceph OSD進程來監控和管理心跳;通常為了高可用和冗餘,至少需要3個ceph osd(即3塊硬碟,ceph為了每一個osd能夠被單獨使用和管理,每一個osd都會有一個單獨的守護進程ceph-osd來管理,即伺服器上有多少個osd,就會有多少個ceph-osd進程,一個ceph-osd進程就對應一個osd,一個osd就對應一塊磁碟設備);MDS是ceph元數據服務組件,主要實現分散式文件系統的控制層面,數據和元數據的存取依然由RADOS負責,即用戶使用cephfs文件系統存取數據,用戶存儲的文件的元數據該怎麼存放、怎麼管理等都由MDS組件負責;當然如果我們沒有使用cephfs文件系統的必要,對應mds組件也可以不用部署;所以mds組件不是必須組件;

  Ceph數據抽象介面(客戶端中間層)

  Ceph存儲集群提供了基礎的對象數據存儲服務,客戶端可基於RADOS協議和librados API直接與存儲系統交互進行對象數據存取; librados提供了訪問RADOS存儲集群支援非同步通訊的API介面,支援對集群中對象數據的直接並行訪問,用戶可通過支援的程式語言開發自定義客戶端程式通過RADOS協議與存儲系統進行交互;客戶端應用程式必須與librados綁定方可連接到RADOS存儲集群,因此,用戶必須事先安裝librados及其依賴後才能編寫使用librados的應用程式; librados API本身是用C ++編寫的,它額外支援C、Python、Java和PHP等開發介面;當然,並非所有用戶都有能力自定義開發介面以接入RADOS存儲集群的需要,為此,Ceph也原生提供了幾個較高級別的客戶端介面,它們分別是RADOS GateWay(RGW)、ReliableBlock Device(RBD)和MDS(MetaData Server),分別為用戶提供RESTful、塊和POSIX文件系統介面;

  Ceph文件系統

  不同於傳統文件系統的地方是,CephFS MDS在設計的初衷之一即高度可擴展的能力,其實現機制中,數據由客戶端以分散式方式通過多路OSD直接存儲於RADOS系統,而元數據則由MDS組織管理後仍然存儲於RADOS系統之上; MDS僅是實現了分散式文件系統的控制平面,數據和元數據的存取依然由RADOS負責;CephFS依賴於獨立運行的守護進程ceph-mds向客戶端提供服務;

  Ceph塊設備

  存儲領域中,「塊(block)」是進行數據存取的主要形式,塊設備也於是成為了主流的設備形式,因此,RBD虛擬塊設備也就成了Ceph之上廣為人知及非常受歡迎的訪問介面;RBD的服務介面無須依賴於特定的守護進程,只要客戶端主機有對應內核模組librbd,就可以通過ceph RBD 介面使用;

  Ceph對象網關

  Ceph對象網關是一個建立在librados之上的對象存儲介面為應用程式提供的Ceph存儲集群的RESTful網關。Ceph對象存儲支援兩個介面s3和Swift;Ceph對象存儲使用Ceph對象網關守護進程(radosgw),它是一個HTTP伺服器,用於與Ceph存儲集群交互;RGW依賴於在RADOS集群基礎上獨立運行的守護進程(ceph-radosgw)基於http或https協議提供相關的API服務,不過,通常僅在需要以REST對象形式存取數據時才部署RGW;

  管理節點(admin host)

  Ceph的常用管理介面是一組命令行工具程式,例如rados、ceph、rbd等命令,管理員可以從某個特定的MON節點執行管理操作,但也有人更傾向於使用專用的管理節點;事實上,專用的管理節點有助於在Ceph相關的程式升級或硬體維護期間為管理員提供一個完整的、獨立的並隔離於存儲集群之外的操作環境,從而避免因重啟或意外中斷而導致維護操作異常中斷;

  存儲池、PG(Placement Group)和OSD(Object Store Device)之間的關係

  提示:存儲在Ceph存儲系統之上的數據,都會先由Ceph將對應數據切分等額大小的對象數據,然後將這些數據存儲到對應的存儲池中;存儲池主要作用是向外界展示集群的邏輯分區;對於每個存儲池,我們可以定義一組規則,比如每個對象數據需要有多少個副本存在;PG是Placement Group的縮寫,歸置組;它是一個虛擬的概念,主要作用是用於將對象數據映射到osd上而存在的,對象數據具體通過那個pg存放在那個osd上,這個是根據ceph的crush演算法動態映射的;我們可以理解為根據存儲池中PG的數量,結合一致性hash將對象數據動態映射至PG上,然後PG根據osd數量結合一致性hash動態映射到不同的磁碟上;我們在創建存儲池的時候就必須指定一定數量的PG;如上圖所示,我們將數據存儲到存儲池B中,那麼對應數據就會根據存儲池B中的規則進行存儲,即3個副本;在存儲池B中只有2個歸置組,兩個歸置組分別對應了不同的OSD;如果將數據存儲到PG3上,那麼對應數據就會在osd2\6\7分別存儲一份以做備份;如果將數據存儲到PG4上,這對應數據就會被分發到osd3\4\9上進行存儲;

  File Store  和 Blue Store

  什麼是file store呢?file store是傳統ceph存儲對象的方法,它依賴於xfs文件系統(ext4有bug和缺陷,會導致數據丟失,所以ceph只支援xfs上使用file store);通過上述的描述,我們知道ceph不管是什麼客戶端提交的對象數據,最終都會存儲到osd所在主機的硬碟上;那麼問題來了,osd所在主機的磁碟是怎麼被osd管理的呢?傳統ceph是將對應磁碟格式化分區掛載在osd所在主機的文件系統,被osd所在主機以一個目錄的形式表示;即用戶存儲的對象數據,最後會被存放為一個文件的形式存放在osd所在主機的磁碟上;這也意味著我們需要存放文件本身的元數據和數據;除此之外對象本身也有數據和元數據,那麼對象本身的數據和元數據是怎麼存放的呢?file store是是將對象的元數據存放在leveldb(早期ceph版本)中,數據存放在文件系統的數據區;簡單講file store就是將對象的元數據存放在leveldb中,數據存放在osd所在主機的文件系統的數據區中,中間有文件系統做轉換的過程;而blue store將osd所在主機的磁碟不格式化分區,而是直接用裸設備硬碟被osd識別和管理;在osd所在主機對應osd進程會將自己管理的磁碟中一小部分格式化為bluefs文件系統,用於安裝使用rocksdb;即客戶端提交的對象數據,對象本身的元數據會被存放在rocksdb中,數據會被直接存放在磁碟上(由osd進程直接管理數據格式等,不會存放為文件);rocksdb為了管理它自己本身的數據持久化,它也會維護一個日誌文件,類似redis的aof;這樣一來blue store的方式存儲對象數據,在磁碟上就會存在三種數據,第一種是對象本身的數據,第二種是對象的元數據,第三種就是rocksdb的日誌文件;ceph為了使存儲的數據更高效,它支援將blue store方式的三種數據分別存放不同的磁碟,如下圖

 

  提示:如果是單塊硬碟,那沒得說三種數據直接存入到一塊磁碟上;如果是兩塊磁碟,我們可以將blue store的日誌數據和對象元數據存放在一個高性能的磁碟上,如nvme,ssd上,將對象數據存放在一個大的機械硬碟上;當然也可以將blue store的日誌文件存放在高性能磁碟上,對象的元數據和數據存放在機械硬碟上;如果有三塊硬碟,我們可以將blue store的日誌數據存放在高性能磁碟上,比如512M的nvme的磁碟;使用1G或2G的ssd來存儲對象的元數據;用機械硬碟來存儲對象數據;