ceph筆記(一)


一、ceph概述
本質上是rados:可靠的、自動的、分布式對象存儲
特性:高效性(大型的網絡raid,性能無限接近raid)、統一性(支持文件存儲、塊存儲、對象存儲)、可擴展性
數據庫的一個弱點:查表
ceph中沒有數據庫,集群狀態全靠cluster map展示
三種存儲類型與rados的關系


補充
雲主機創建:nova-->libvirtd:虛擬機控制程序-->qemu(其他硬件的虛擬化)-kvm(cpu、內存的虛擬化)驅動-->雲主機
塊存儲創建:cinder-->backend驅動--->ceph
掛載:qemu調用librbd(實質是librados庫),再訪問rados,是通過網絡的形式


二、ceph邏輯架構
osd daemon去管理底層的硬盤,主osd負責讀寫,其余osd負責復制
pg:幾個osd daemon的屬組,它是一個邏輯概念,並沒有size的說法。比如一個班上有虛擬化組、存儲組、網絡組
# librbd是在虛擬機上的,負責把文件切分成4M一個obj,不足4M也按4M切。每個obj都帶有一個id
ceph存儲小文件的效率不高,因為存個16M的文件還要切片、哈希就會慢。從理論上來講,底層磁盤越多,ceph效率越高

ceph中的對應關系
每個obj對應一個PG
一個PG可以對應很多個obj
osd與pg之間是多對多的關系,比如,一個組起碼得有兩個人,某些人可能也從屬於兩個組
pg與osd之間的映射是基於crush算法


四、pool存儲池提供
1.pg數目
2.對象副本數
3.crush規則(pg--->osd:acting set)
4.用戶及權限

功能:為客戶端提供塊設備
pool相當於lvm里面的vg,osd相當於pv。在lvm里面,vg建好之后,就可以在vg基礎上划分一些空間(lv)供使用,而ceph的image就類比這個空間,映射到虛擬機使用的/dev/vd?。所以,image是給虛擬機分配存儲空間,但是要注意,這只是一個配額,就是說你最多只能使用這么大的空間,而且你每一次存儲的時候,對應的pg都不一定是上一次的pg,因為客戶端每次都會從mon那里獲取最新的map,librbd會作出最優選擇,這樣ceph集群的數據才會更均勻。

你可以把pool想象成一個垃圾場,你訂購的體積是100立方米。你可以把你每天的生活垃圾倒進去,對於倒垃圾的位置沒有限制,(這里就類比了虛擬機每次都不一定使用上一次的pg),每次倒的垃圾大小沒有限制,只要你累計的體積不超過100立方(image)即可。但有些人覺得垃圾場里面好臟,不願意進去,只倒在垃圾場門口,久而久之,門口堆滿了垃圾,里面有大把空間,但是又沒人想進去,造成空間的浪費和低效。針對這種情況,ceph做了優化,每次都讓客戶端獲取最新的map以選擇最適合的pg,使得集群整體的數據更均勻。

虛擬機中obj如何找到自己對應的pg?
客戶端輸入pool_id和obj_id
crush獲得obj_id並對其做哈希,然后計算OSD個數,Hash取模得到一個值,比如0x58;再把pool_id(假設是4)與前者的值,綜合一塊,得出的值就是pg_id(4.0x58)。
這中間做了很多復雜的運算,目的是為了讓數據更平衡些,因為ceph的數據平衡是偽平衡,只能用哈希讓它更平衡一些

pg又是怎么樣找到osd的?
pg向mon節點取crush map,就知道自己負責哪幾個osd了
 
上面的整個流程是這樣的:
第一步,獲取pg和osd的對應關系
虛擬機在對數據分塊之前,會調用librbd,librbd再調用librados,librados連上ceph的mon集群,獲取整個集群的最新狀態(包括各種map,主要是想知道pg和osd的對應關系)。

第二步,獲取obj與pg的關系
obj-id做哈希,整體的osd數哈希取模,結合pool_id--->pg-id---crush map--->osd--->disk

五、pool的類型
1.復制類型
2.糾錯碼類型(速度慢、不支持ceph所有的操作(比如垃圾清理時它會禁止寫操作,整個集群就不可寫了,此時pg的狀態為scrubling))

客戶端寫入數據流程分析
pool類似於vg的概念,不是真實分區,本質就是一堆pg的集合。可以建好幾個pool,用做不同的用途:存數據、存鏡像
一個pg不能處於多個pool

file-->obj-->某一個pg--crush算法-->osd daemon

mon節點上有個pg_monitor函數,它會監控有沒有新的pool創建,如果有的話,檢測是否需要創建新的pg,如果需要,ceph就進入creating狀態,下一步是通過crush算法找到pg里面包含的osd,發給主osd,然后成員之間peering,最終生成pg

寫數據怎么寫?
librdb的作用:幫客戶端拿到最新的map並做分析;把對象進行切片

剛建好的ceph集群時,沒有pool和pg,只有mon和一堆osd,主osd負責讀寫,從的負責復制
osd節點對於cpu和內存的要求也非常高,因為它要維持PG的這個邏輯單位,1G內存對應1T磁盤

六、PG
epoach:單調遞增的版本號
acting set:列表,第一個為primary osd,其余為replicated osd
up set:acting set過去的版本
pg tmp:臨時pg組,這種會在主osd成員壞掉、新osd加入的時候出現。比如一個部門,項目經理離職了,新找來了一個項目經理,這個新來的項目經理要向其他的成員學習業務,在這個過程,部門中肯定要暫時選個領頭人,直到新來的項目經理學習完畢。

pg的狀態
ceph -s(在某個mon上執行)
狀態的變遷:creating--->peering(組員互相認識的過程)--->active(能干活,但是數據還沒同步完)--->clean(已復制完數據,可以寫入新的數據)
stable:你這個組里有人沒在2秒內給mon匯報狀態。如果300秒之內沒回應,mon就會把osd從pg提出
backfilling:有新的OSD進來了(全量)
recovery:原來的成員在300秒內活了,要求更新數據(增量)

如果一個集群中你設置了一個osd對應多個pg,那么當一個osd壞掉之后,有些數據的副本數就少了一份,由於pg是邏輯單位,所以,在這種情況下要恢復數據,壓力是很大的。如果再有一個osd壞掉,有些數據的副本可能就剩下一份了,pg的壓力就更大了,很容易造成連鎖反映

在pool里面設置的副本數為3,意味着你一個pg對應3個osd

osd daemon的狀態,默認每2秒匯報自己的狀態給mon,同時監控組內成員的狀態
up:可以提供IO
down:不能提供IO
in:osd有數據
out:osd沒數據

osd的功能:存儲以及后端數據復制,監控自己以及組內成員的狀態

七、ceph網絡架構
三類集群:disk集群、osd daemon集群(幾十個到幾萬個)、monitor daemon集群
最好的方案:一塊osd daemon對應一塊硬盤是最好的方案
monitor:一台服務器安裝一個monitor軟件,數量無上限、最好為奇數
monitor集群負責維護cluster map
cluster map包含:mon map、osd map、pg map、crush map
monitor集群使用的算法是paxos(功能之一就是選舉),統治者是leader,其余為provider,版本落后的叫rqueester。rqueester向leader發起獲取集群最新信息的請求,leader不會給,它會讓rqueester找provider要。

集群網絡也叫北向網絡:用於與客戶端通信,必須萬兆網絡,因為對集群健康狀態的要求非常高
    功能:mon集群通信;osd匯報狀態給mon,客戶端訪問osd存儲,更新維護cluster map

存儲網絡也就東西網絡:PG組里面的某個OSD壞掉了(300秒還沒恢復過來就會被踢出集群),數據在平衡的過程中,流量是非常巨大的,所以也必須萬兆網絡。

八、緩存機制
一台mon節點只能起一個monitor daemon
一台osd節點可以有多個osd daemon

緩存分兩種:
首先大概了解一下
libvirt ---> qemu(vm) --->librbd --->rados(服務端緩存--->機械硬盤)
                             |
                          客戶端緩存

1.客戶端rbd緩存
write back:異步寫,客戶端先存到rbd緩存,然后再由rbd緩存發送到rados
    優點:速度快
    缺點:數據不安全,數據不一致
    適用場景:對數據安全性要求不高,讀寫混合型的系統

write through:同步寫,一邊往rbd緩存寫,同時也往rados寫
    優點:讀快、安全
    缺點:寫慢
    適用場景:讀多寫少

ceph支持在線修改配置文件

2.ceph服務端緩存
cache tiering,專門找一堆固態硬盤做一存儲池,與你的機械硬盤做一個映射關系
客戶端來數據先寫ssd,就返回寫成功了,然后再寫到機械硬盤
    優點:可以提升ceph的存儲性能
    缺點:成本高,性能提升並不明顯

服務端緩存與客戶端緩存對比
1.一個是內存級別的,另外一個是基於ssd
2.服務端緩存不存在數據不一致問題

##################部署#####################
如果文件系統是日志文件系統的話,寫數據是有兩次返回的
第一次客戶端數據來了,記錄在主osd的日志上,從osd從主osd的日志讀取,也寫入自己的日子中,然后返回結果給主osd,主osd再返回給客戶端。等到所有主從osd的數據都寫到硬盤后,又返回一個信息給客戶端,數據已經真實的存在我的磁盤上了,你可以把緩存清理掉了。如果這一步沒有完成,那ceph會支持你再發送一次請求。

有沒有優化可言?固態盤作為日志盤,最好一塊機械盤對應一塊osd,實在沒錢把固態就分區吧

固態盤的空間越小,越慢,一般至少要保留30%的空間,固態盤不推薦分區
如何計算日志盤大小=(網絡帶寬和硬盤帶寬大小其中一個*臟數據最大同步時間(5-15s))*2

如何把ceph crush視圖導出來


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM