您好,登錄后才能下訂單哦!
Ceph 存儲由幾個不同的守護進程組成,這些守護進程彼此之間是相互獨立的,每一個組件提供特定的功能。
RADOS(Reliable Autonomic Distributed Object Store 可靠、自動,分布式對象存儲) 是ceph存儲組件的基礎。ceph 將一切都以對象的方式存儲,RADOS就負責存儲這些對象,而不考慮他們的數據類型。RADOS層組件確保數據的一致性,和可靠性。包括數據的復制,故障檢測和恢復,數據在節點之間的遷移和再平衡。RADOS由大量的存儲設備和節點集群組成。RADOS采用C++開發。
RDB(Reliable Block Device) 提供了一個標準的塊設備接口,對外提供塊存儲,它可以被映射,格式化,像其他磁盤一樣掛載到服務器。常用于虛擬化場景下創建volume,云硬盤等。目前red Hat已經將RBD的驅動集成到KVM/QEMU中。
RADOS是ceph 存儲系統的核心,也稱為ceph存儲集群。ceph的所有優秀的特性都是由RADOS提供的,包括分布式對象存儲,高可用性,自我修復和自我管理等。
RADOS 組件架構圖:
RADOS 包含兩個核心組件:Ceph Monitor 和Ceph OSD。
Ceph Monitor 是負責監視整個集群的運行狀態的, 為了實現高可用性,通常配置為一個小型的集群(一般是3個節點,集群通常是有一個leader和兩個slave,當leader故障后集群通過選舉產生新的leader,來保障系統的高可用性。)。
Monitor中的信息都是集群成員中的守護程序來提供的,包含了各個節點之間的狀態,集群的配置信息。主要用于管理Cluster Map,Cluster Map是整個RADOS系統的關鍵數據結構,類似元數據信息。Mon中的Cluster Map 包含 Mon Map、OSD Map、PG Map、MDS Map和CRUSH等。
ceph mon dump
ceph osd dump
ceph pg dump
ceph osd crush dump
Ceph Monitor集群維護著各類Map數據,它本身并不提供客戶端數據的存儲服務,客戶端和其他集群節點會定期的檢查并更新Monintor維護的Map,在客戶端進行讀寫數據時,都會請求Monitor提供Map數據,之后直接與OSD進行數據操作。
Ceph Monitor是一個輕量級的守護進程,通常情況下不需要消耗大量資源,通常會需要幾個GB的磁盤空間來存放日志。
OSD是Ceph 存儲的重要組件。OSD將數據以對象的方式存儲到集群中各個節點的磁盤上,完成數據存儲的絕大部分工作是由OSD 守護進程來實現的。
Ceph 集群中通常包含有多個OSD,對于任何讀寫操作,客戶端從Ceph Monitor獲取Cluster Map之后,客戶端將直接與OSD進行I/O操作,而不再需要Monitor干預。這使得數據讀寫過程更加迅速,不需要其他額外層級的數據處理來增加開銷。
OSD通常有多個相同的副本,每個數據對象都有一個主副本和若干個從副本,這些副本默認情況下分布在不同的節點上,當主副本出現故障時(磁盤故障或者節點故障),Ceph OSD Deamon 會選取一個從副本提升為主副本,同時,會產生以一個新的副本,這樣就保證了數據的可靠性。
Ceph OSD 操作必須 在一個有效的Linux 分區上,文件系統可以是BTRFS,XFS或EXT4,推薦選擇XFS。
journal 緩沖區
Ceph 在寫入數據時,會先將數據寫入一個單獨的換成存儲區域,再寫到備用存儲。該緩沖區域被稱為journal,這個緩沖區可以在相同或單獨磁盤作為OSD,或者不同的SSD磁盤上。默認情況下每隔5秒日志會向備用存儲刷新數據,常見的日志大小是10G,但是分區越大越好。
當為journal提供一個高速緩存的SSD磁盤時,會顯著提高CEPH 寫入數據的性能。每個SSD磁盤最多給4個到5個OSD做日志,一旦超過這個限制將會出現性能瓶頸。
CRUSH算法是Ceph 讀寫文件的核心,下圖展示了使用CRUSH算法實現的數據讀寫和再平衡的流程:
Pool是一個邏輯分區,包含了多個PG,同時,每一個Pool都是交叉分布在多個主機節點上的。
存儲池(POOL)是管理PG的邏輯分區,pool可以通過創建需要的副本數來保障數據的高可用性,在新的版本中,默認的副本數是3.
除此之外,我們可以還可以同使用SSD硬盤來創建faster池,使用pool來進行快照功能,還可以為訪問pool的用戶分配權限。
ceph osd pool create {pool-name} {pg-number} {pgp-number} [replicated] [crush-ruleset-name] [expected-num-objects]
ceph osd pool create test-pool 9 # 創建一個名為test-pool的池,包含的gp數量為9
ceph osd lspools
rados lspools
ceph osd dump | grep -i pool # 查看副本以及詳細信息
ceph osd pool set test-pool size 3 # 設置副本數目為3
ceph osd dump | grep -i pool # 查看副本數目詳情
ceph osd pool rename test-pool pool-1 # 當前名稱 目標名稱
ceph osd lspools # 查看命名已經修改
rados -p pool-1 put obj-1 /etc/hosts # 像池中添加對象obj-1和 文件 /etc/hosts
rados -p pool-1 ls # 查看池中的對象
# 給pool-1 池創建快照,命名為snapshot01
rados mksnap snapshot01 -p pool-1
# 插卡快照信息
rados lssnap -p pool-1
# 刪除pool-1存儲池中obj-test對象
rados -p pool-1 rm obj-test
# 查看對象的快照信息
# rados -p pool-1 listsnaps obj-test
obj-test:
cloneid snaps size overlap
1 1 5 []
# 恢復快照,指定存儲池,對象名稱,快照名
rados rollback -p pool-1 obj-test snapshot01
ceph osd pool get pool-1 size
ceph osd pool get pool-1 {value}
ceph osd pool set pool-1 size 3
ceph osd pool delete pool-1 pool-1 --yes-i-really-really-mean-it
這里通過示例,展示ceph 管理數據的方式。
創建一個存儲池pool-1:
ceph osd pool create pool-1 8 8 # 創建存儲池 pool-1,指定pg 和pgp的數量為 8
查看pool的ID:
[root@local-node-1 ~]# ceph osd lspools
1 .rgw.root
2 default.rgw.control
3 default.rgw.meta
4 default.rgw.log
8 pool-1
查看pg分配所屬的OSD:
[root@local-node-1 ~]# ceph pg dump|grep ^8|awk '{print $1 "\t" $17}'
dumped all
8.7 [0,2,1]
8.6 [2,1,0]
8.5 [2,1,0]
8.4 [1,2,0]
8.3 [2,0,1]
8.2 [2,0,1]
8.1 [0,2,1]
8.0 [0,1,2]
表明 0-7的pg都存為了3副本,分到不同的副本中。
我們將hosts文件加入存儲(這里已經添加pool):
[root@local-node-1 ~]# rados -p pool-1 put obj1 /etc/hosts
[root@local-node-1 ~]# rados -p pool-1 ls
obj1
查看對象obj1和OSD的映射關系:
[root@local-node-1 ~]# ceph osd map pool-1 obj1
osdmap e72 pool 'pool-1' (8) object 'obj1' -> pg 8.6cf8deff (8.7) -> up ([0,2,1], p0) acting ([0,2,1], p0)
上述輸出的含義:
默認情況下,存放相同PG的副本會分布在不同的物理節點上。
默認設置下,當集群中有節點出現故障時,Ceph 會將故障節點的OSD標記為down,如果在300s內未恢復,集群就開始進行恢復狀態。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。