天天看點

《Ceph源碼分析》——第1章,第5節RADOS

本節書摘來自華章出版社《ceph源碼分析》一書中的第1章,第1.5節rados,作者常濤,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視

1.5 rados

rados是ceph存儲系統的基石,是一個可擴充的、穩定的、自我管理的、自我修複的對象存儲系統,是ceph存儲系統的核心。它完成了一個存儲系統的核心功能,包括:monitor子產品為整個存儲叢集提供全局的配置和系統資訊;通過crush算法實作對象的尋址過程;完成對象的讀寫以及其他資料功能;提供了資料均衡功能;通過peering過程完成一個pg記憶體達成資料一緻性的過程;提供資料自動恢複的功能;提供克隆和快照功能;實作了對象分層存儲的功能;實作了資料一緻性檢查工具scrub。下面分别對上述基本功能做簡要的介紹。

1.5.1 monitor

monitor是一個獨立部署的daemon程序。通過組成monitor叢集來保證自己的高可用。monitor叢集通過paxos算法實作了自己資料的一緻性。它提供了整個存儲系統的節點資訊等全局的配置資訊。

cluster map儲存了系統的全局資訊,主要包括:

monitor map

包括叢集的fsid

所有monitor的位址和端口

current epoch

osd map:所有osd的清單,和osd的狀态等。

mds map:所有的mds的清單和狀态。

1.5.2 對象存儲

這裡所說的對象是指rados對象,要和radosgw的s3或者swift接口的對象存儲區分開來。對象是資料存儲的基本單元,一般預設4mb大小。圖1-5就是一個對象的示意圖。

圖1-5 對象示意圖

《Ceph源碼分析》——第1章,第5節RADOS

一個對象由三個部分組成:

對象标志(id),唯一辨別一個對象。

對象的資料,其在本地檔案系統中對應一個檔案,對象的資料就儲存在檔案中。

對象的中繼資料,以key-value(鍵值對)的形式,可以儲存在檔案對應的擴充屬性中。由于本地檔案系統的擴充屬性能儲存的資料量有限制,rados增加了另一種方式:以leveldb等的本地kv存儲系統來儲存對象的中繼資料。

1.5.3 pool和pg的概念

pool是一個抽象的存儲池。它規定了資料備援的類型以及對應的副本分布政策。目前實作了兩種pool類型:replicated類型和erasure code類型。一個pool由多個pg構成。

pg(placement group)從名字可了解為一個放置政策組,它是對象的集合,該集合裡的所有對象都具有相同的放置政策:對象的副本都分布在相同的osd清單上。一個對象隻能屬于一個pg,一個pg對應于放置在其上的osd清單。一個osd上可以分布多個pg。

圖1-6 pg的概念示意圖

《Ceph源碼分析》——第1章,第5節RADOS

pg的概念如圖1-6所示,其中:

pg1和pg2都屬于同一個pool,是以都是副本類型,并且都是兩副本。

pg1和pg2裡都包含許多對象,pg1上的所有對象,主從副本分布在osd1和osd2上,pg2上的所有對象的主從副本分布在osd2和osd3上。

一個對象隻能屬于一個pg,一個pg包含多個對象。

一個pg的副本分布在對應的osd清單中。在一個osd上可以分布多個pg。示例中pg1和pg2的從副本都分布在osd2上。

1.5.4 對象尋址過程

對象尋址過程指的是查找對象在叢集中分布的位置資訊,過程分為兩步:

1)對象到pg的映射。這個過程是靜态hash映射(加入pg split後實際變成了動态hash映射方式),通過對object_id,計算出hash值,用該pool的pg的總數量pg_num對hash值取模,就可以獲得該對象所在的pg的id号:

pg_id = hash( object_id ) % pg_num

2)pg到osd清單映射。這是指pg上對象的副本如何分布在osd上。它使用ceph自己創新的crush算法來實作,本質上是一個僞随機分布算法。

圖1-7 對象尋址過程

《Ceph源碼分析》——第1章,第5節RADOS

如圖1-7所示的對象尋址過程:

1)通過hash取模後計算,前三個對象分布在pg1上,後兩個對象分布在pg2上。

2)pg1通過crush算法,計算出pg1分布在osd1、osd3上;pg2通過crush算法分布在osd2和osd4上。

1.5.5 資料讀寫過程

ceph的資料寫操作如圖1-8所示,其過程如下:

圖1-8 讀寫過程

《Ceph源碼分析》——第1章,第5節RADOS

1)client向該pg所在的主osd發送寫請求。

2)主osd接收到寫請求後,同時向兩個從osd發送寫副本的請求,并同時寫入主osd的本地存儲中。

3)主osd接收到兩個從osd發送寫成功的ack應答,同時确認自己寫成功,就向用戶端傳回寫成功的ack應答。

在寫操作的過程中,主osd必須等待所有的從osd傳回正确應答,才能向用戶端傳回寫操作成功的應答。由于讀操作比較簡單,這裡就不介紹了。

1.5.6 資料均衡

當在叢集中新添加一個osd儲存設備時,整個叢集會發生資料的遷移,使得資料分布達到均衡。ceph資料遷移的基本機關是pg,即資料遷移是将pg中的所有對象作為一個整體來遷移。

遷移觸發的流程為:當新加入一個osd時,會改變系統的crush map,進而引起對象尋址過程中的第二步,pg到osd清單的映射發生了變化,進而引發資料的遷移。

舉例來說明資料遷移過程,表1-1是資料遷移前的pg分布,表1-2是資料遷移後的pg分布。

表1-1 資料遷移前的pg分布

` osd1 osd2 osd3

pga pga1 pga2 pga3

pgb pgb3 pgb1 pgb2

pgc pgc2 pgc3 pgc1

pgd pgd1 pgd2 pgd3

`

表1-2 資料遷移後的pg分布

` osd1 osd2 osd3 osd4

pga pga1 pga2 pga3 pga1

pgb pgb3 pgb1 pgb2 pgb2

pgc pgc2 pgc3 pgc1 pgc3

目前系統有3個osd,分布為osd1、osd2、osd3;系統有4個pg,分布為pga、pgb、pgc、pgd;pg設定為三副本:pga1、pga2、pga3分别為pga的三個副本。pg的所有分布如表1-1所示,每一行代表pg分布的osd清單。

當添加一個新的osd4時,crush map變化導緻通過crush算法來計算pg到osd的分布發生了變化。如表1-2所示:pga的映射到了清單[osd4,osd2,osd3]上,導緻pga1從osd1上遷移到了osd4上。同理,pgb2從osd3上遷移到osd4,pgc3從osd2上遷移到osd4上,最終資料達到了基本平衡。

1.5.7 peering

當osd啟動,或者某個osd失效時,該osd上的主pg會發起一個peering的過程。ceph的peering過程是指一個pg内的所有副本通過pg日志來達成資料一緻的過程。當peering完成之後,該pg就可以對外提供讀寫服務了。此時pg的某些對象可能處于資料不一緻的狀态,其被标記出來,需要恢複。在寫操作的過程中,遇到處于不一緻的資料對象需要恢複的話,則需要等待,系統優先恢複該對象後,才能繼續完成寫操作。

1.5.8 recovery和backfill

ceph的recovery過程是根據在peering的過程中産生的、依據pg日志推算出的不一緻對象清單來修複其他副本上的資料。

recovery過程的依據是根據pg日志來推測出不一緻的對象加以修複。當某個osd長時間失效後重新加入叢集,它已經無法根據pg日志來修複,就需要執行backfill(回填)過程。backfill過程是通過逐一對比兩個pg的對象清單來修複。當新加入一個osd産生了資料遷移,也需要通過backfill過程來完成。

1.5.9 糾删碼

糾删碼(erasure code)的概念早在20世紀60年代就提出來了,最近幾年被廣泛應用在存儲領域。它的原理比較簡單:将寫入的資料分成n份原始資料塊,通過這n份原始資料塊計算出m份效驗資料塊,n+m份資料塊可以分别儲存在不同的裝置或者節點中。可以允許最多m個資料塊失效,通過n+m份中的任意n份資料,就還原出其他資料塊。

目前ceph對糾删碼(ec)的支援還比較有限。rbd目前不能直接支援糾删碼(ec)模式。其或者應用在對象存儲radosgw中,或者作為cache tier的二層存儲。其中的原因和具體實作都将在後面的章節詳細介紹。

1.5.10 快照和克隆

快照(snapshot)就是一個儲存設備在某一時刻的全部隻讀鏡像。克隆(clone)是在某一時刻的全部可寫鏡像。快照和克隆的差別在于快照隻能讀,而克隆可寫。

rados對象存儲系統本身支援copy-on-write方式的快照機制。基于這個機制,ceph可以實作兩種類型的快照,一種是pool級别的快照,給整個pool中的所有對象統一做快照操作。另一種就是使用者自己定義的快照實作,這需要用戶端配合實作一些快照機制。rbd的快照實作就屬于後者。

rbd的克隆實作是在基于rbd的快照基礎上,在用戶端librbd上實作了copy-on-write(cow)克隆機制。

1.5.11 cache tier

rados實作了以pool為基礎的自動分層存儲機制。它在第一層可以設定cache pool,其為高速儲存設備(例如ssd裝置)。第二層為data pool,使用大容量低速儲存設備(如hdd裝置)可以使用ec模式來降低存儲空間。通過cache tier,可以提高關鍵資料或者熱點資料的性能,同時降低存儲開銷。

cache tier的結構如圖1-9所示,說明如下:

ceph client對于cache層是透明的。

類objecter負責請求是發給cache tier層,還是發給storage tier層。

cache tier層為高速i/o層,儲存熱點資料,或稱為活躍的資料。

storage tier層為慢速層,儲存非活躍的資料。

在cache tier層和storage tier層之間,資料根據活躍度自動地遷移。

圖1-9 cache tier結構圖

《Ceph源碼分析》——第1章,第5節RADOS

1.5.12 scrub

scrub機制用于系統檢查資料的一緻性。它通過在背景定期(預設每天一次)掃描,比較一個pg内的對象分别在其他osd上的各個副本的中繼資料和資料來檢查是否一緻。根據掃描的内容分為兩種,第一種是隻比較對象各個副本的中繼資料,它代價比較小,掃描比較高效,對系統影響比較小。另一種掃描稱為deep scrub,它需要進一步比較副本的資料内容檢查資料是否一緻。

繼續閱讀