Ceph的工作原理及流程
首先介紹RADOS中最爲核心的、基於計算的對象尋址機制,然後說明對象存取的工作流程,之後介紹RADOS集羣維護的工作過程,最後結合Ceph的結構和原理對其技術優勢加以回顧和剖析。
尋址流程:
File:用戶需要存儲或訪問的文件。對於一個基於Ceph開發的對象存儲應用而言,這個file就是對應於應用中的“對象”,也就是用戶直接操作的對象。
Object:當上層應用向RADOS存入size很大的file時,需要將file切分成統一大小的一系列object進行存儲。
PG(Placement Group) 它可以看成是一致性哈希中的虛擬節點,維護了一部分數據並且是數據遷移和改變的最小單位。PG的用途是對object的存儲進行組織映射。具體而言,一個PG負責組織若干個object,但一個object只能被映射到一個PG中,即PG和object是”一對多”映射關係。同時一個PG會被映射到n個OSD上,而每個OSD上都會承載大量的PG,即PG與OSD是”多對多”映射關係。在生產環境中n至少爲3,。
OSD:即object storage device在實踐中至少應該是數十上百個纔有助於Ceph系統的設計發揮其應有的優勢。
failure domain:故障域
Ceph中的尋址至少要經歷以下三次映射:
(1)File->object映射
這次映射的目的是將用戶要操作的file,映射爲RADOS能夠處理的object。其映射十分簡單,本質上就是按照object的最大size對file進行切分,相當於RAID中的條帶化過程。
這種切分好處有二:
1.讓大小不限的file變成最大size一致、可以被RADOS高效管理的object.
2.讓對單一file實施的串行處理變爲對多個object實施的並行化處理。
每一次切分後產生的object將獲得唯一的oid,即object id .其生產方式也是線性映射,極其簡單
圖中,ino是待操作file的元數據,可以簡單理解爲該file的唯一id。ono則是由該file切分產生的某個object的序號。而oid就是將這個序號簡單連綴在該file id之後得到的。舉例而言,如果一個id爲filename的file被切分成了三個object,則其object序號依次爲0、1和2,而最終得到的oid就依次爲filename0、filename1和filename2。
這裏隱含的問題是:ino的唯一性必須得到保證,否則後續映射無法正常進行。
(2)Object->PG映射
在file被映射爲一個或多個object之後,就需要將每個object獨立地映射到一個PG中去。過程很簡單,計算公式是:
hash(oid) & mask -> pgid
計算由兩步組成。首先是使用Ceph系統指定的一個靜態哈希函數計算oid的哈希值,將oid映射成一個近似均勻分佈的僞隨機數值。然後將這個僞隨機數值與mask按位相與,得到最終的PG序號(pgid)。根據RADOS的設計,給定PG的總數爲m(m爲2的整數冪),則mask的值爲m-1。因此,哈希值計算和按位與操作的整體結果事實上是從所有m個PG中近似均勻地隨機選擇一個。基於這一機制,當有大量object和大量PG時,RADOS能夠保證object和PG之間的近似均勻映射。又因爲object是由file切分而來,大部分object的size相同,因而,這一映射最終保證了,各個PG中存儲的object的總數據量近似均勻。
只有在object和PG的數量較多是,這種僞隨機關係的近似均勻性才能成立,Ceph的數據存儲均勻性才能保證。一方面,object的最大size應該被合理配置,以使得同樣數量的file能夠被切分成更多的object;另一方面,Ceph也推薦PG總數量應該爲OSD總數的數百倍,以保證有足夠數量的PG可夠映射。
(3)PG->OSD映射
第三次映射就是將作爲object的邏輯組織單元的PG映射到數據的實際存儲單元OSD。
RADOS採用一個名爲CRUSH的算法,將PGid帶入其中,然後得到一組工n個OSD。這n個OSD即共同負責存儲和維護一個PG中的所有object (n通常爲3)。具體到每個OSD,則由其上運行的OSD deamon負責執行映射到本地的Object在本地文件系統中的存儲、訪問、元數據維護等操作。
和”Object->PG”映射中採用的哈希算法不同,這個CRUSH算法的結果不是絕對不變的,主要受到兩個因素影響:1.當前系統狀態(宕機) 2.存儲策略配置(一般不變)
之所以在此次映射中使用CRUSH算法,而不是哈希算法,原因之一是CRUSH具有上述可配置特性,可以根據管理員的配置參數決定OSD的物理位置映射策略;另一方面是CRUSH具有特殊的”穩定性”,即當系統中加入新的OSD,導致系統規模增大時,大部分PG與OSD之間的映射關係不會發生改變,只有少部分PG的映射關係會發生變化並引發數據遷移。這種可配置和穩定性Hash算法都不能提供。因此CRUSH算法也是Ceph的核心內容之一。
到此爲止,Ceph通過三次映射,完成從file到object、PG、OSD整個映射過程。整個過程沒有任何的全局查表操作需求。至於唯一的全局性數據結構cluster map,它的維護和操作都是輕量級的,不會對系統的可擴展性、性能等因素造成不良影響。
問:爲什麼要設計三層映射而不是一層?
答:如果將object直接映射到一組OSD上,如果這種算法是固定的哈希算法,則意味着一個object被固定映射在一組OSD上,當其中一個OSD損壞時,object也無法部署到新的OSD上(因爲映射函數不允許)。
如果設計一個動態算法(例如CRUSH算法)來完成這一映射,結果將是各個OSD所處理的本地元數據暴增,由此帶來的計算複雜度和維護工作量也是難以承受的。
綜上所訴,引入PG的好處至少有二:一方面試下呢object和OSD之間的動態映射,從而爲Ceph的可靠性、自動化等特性的實現留下了空間;另一方面也有效簡化了數據的存儲組織,大大降低了系統的維護管理開銷。