ceph笔记(一)
一、ceph概述
本質(zhì)上是rados:可靠的、自動的、分布式對象存儲
特性:高效性(大型的網(wǎng)絡(luò)raid,性能無限接近raid)、統(tǒng)一性(支持文件存儲、塊存儲、對象存儲)、可擴展性
數(shù)據(jù)庫的一個弱點:查表
ceph中沒有數(shù)據(jù)庫,集群狀態(tài)全靠cluster map展示
三種存儲類型與rados的關(guān)系
補充
云主機創(chuàng)建:nova-->libvirtd:虛擬機控制程序-->qemu(其他硬件的虛擬化)-kvm(cpu、內(nèi)存的虛擬化)驅(qū)動-->云主機
塊存儲創(chuàng)建:cinder-->backend驅(qū)動--->ceph
掛載:qemu調(diào)用librbd(實質(zhì)是librados庫),再訪問rados,是通過網(wǎng)絡(luò)的形式
二、ceph邏輯架構(gòu)
osd daemon去管理底層的硬盤,主osd負責讀寫,其余osd負責復(fù)制
pg:幾個osd daemon的屬組,它是一個邏輯概念,并沒有size的說法。比如一個班上有虛擬化組、存儲組、網(wǎng)絡(luò)組
# librbd是在虛擬機上的,負責把文件切分成4M一個obj,不足4M也按4M切。每個obj都帶有一個id
ceph存儲小文件的效率不高,因為存?zhèn)€16M的文件還要切片、哈希就會慢。從理論上來講,底層磁盤越多,ceph效率越高
ceph中的對應(yīng)關(guān)系
每個obj對應(yīng)一個PG
一個PG可以對應(yīng)很多個obj
osd與pg之間是多對多的關(guān)系,比如,一個組起碼得有兩個人,某些人可能也從屬于兩個組
pg與osd之間的映射是基于crush算法
四、pool存儲池提供
1.pg數(shù)目
2.對象副本數(shù)
3.crush規(guī)則(pg--->osd:acting set)
4.用戶及權(quán)限
功能:為客戶端提供塊設(shè)備
pool相當于lvm里面的vg,osd相當于pv。在lvm里面,vg建好之后,就可以在vg基礎(chǔ)上劃分一些空間(lv)供使用,而ceph的image就類比這個空間,映射到虛擬機使用的/dev/vd?。所以,image是給虛擬機分配存儲空間,但是要注意,這只是一個配額,就是說你最多只能使用這么大的空間,而且你每一次存儲的時候,對應(yīng)的pg都不一定是上一次的pg,因為客戶端每次都會從mon那里獲取最新的map,librbd會作出最優(yōu)選擇,這樣ceph集群的數(shù)據(jù)才會更均勻。
你可以把pool想象成一個垃圾場,你訂購的體積是100立方米。你可以把你每天的生活垃圾倒進去,對于倒垃圾的位置沒有限制,(這里就類比了虛擬機每次都不一定使用上一次的pg),每次倒的垃圾大小沒有限制,只要你累計的體積不超過100立方(image)即可。但有些人覺得垃圾場里面好臟,不愿意進去,只倒在垃圾場門口,久而久之,門口堆滿了垃圾,里面有大把空間,但是又沒人想進去,造成空間的浪費和低效。針對這種情況,ceph做了優(yōu)化,每次都讓客戶端獲取最新的map以選擇最適合的pg,使得集群整體的數(shù)據(jù)更均勻。
虛擬機中obj如何找到自己對應(yīng)的pg?
客戶端輸入pool_id和obj_id
crush獲得obj_id并對其做哈希,然后計算OSD個數(shù),Hash取模得到一個值,比如0x58;再把pool_id(假設(shè)是4)與前者的值,綜合一塊,得出的值就是pg_id(4.0x58)。
這中間做了很多復(fù)雜的運算,目的是為了讓數(shù)據(jù)更平衡些,因為ceph的數(shù)據(jù)平衡是偽平衡,只能用哈希讓它更平衡一些
pg又是怎么樣找到osd的?
pg向mon節(jié)點取crush map,就知道自己負責哪幾個osd了
上面的整個流程是這樣的:
第一步,獲取pg和osd的對應(yīng)關(guān)系
虛擬機在對數(shù)據(jù)分塊之前,會調(diào)用librbd,librbd再調(diào)用librados,librados連上ceph的mon集群,獲取整個集群的最新狀態(tài)(包括各種map,主要是想知道pg和osd的對應(yīng)關(guān)系)。
第二步,獲取obj與pg的關(guān)系
obj-id做哈希,整體的osd數(shù)哈希取模,結(jié)合pool_id--->pg-id---crush map--->osd--->disk
五、pool的類型
1.復(fù)制類型
2.糾錯碼類型(速度慢、不支持ceph所有的操作(比如垃圾清理時它會禁止寫操作,整個集群就不可寫了,此時pg的狀態(tài)為scrubling))
客戶端寫入數(shù)據(jù)流程分析
pool類似于vg的概念,不是真實分區(qū),本質(zhì)就是一堆pg的集合。可以建好幾個pool,用做不同的用途:存數(shù)據(jù)、存鏡像
一個pg不能處于多個pool
file-->obj-->某一個pg--crush算法-->osd daemon
mon節(jié)點上有個pg_monitor函數(shù),它會監(jiān)控有沒有新的pool創(chuàng)建,如果有的話,檢測是否需要創(chuàng)建新的pg,如果需要,ceph就進入creating狀態(tài),下一步是通過crush算法找到pg里面包含的osd,發(fā)給主osd,然后成員之間peering,最終生成pg
寫數(shù)據(jù)怎么寫?
librdb的作用:幫客戶端拿到最新的map并做分析;把對象進行切片
剛建好的ceph集群時,沒有pool和pg,只有mon和一堆osd,主osd負責讀寫,從的負責復(fù)制
osd節(jié)點對于cpu和內(nèi)存的要求也非常高,因為它要維持PG的這個邏輯單位,1G內(nèi)存對應(yīng)1T磁盤
六、PG
epoach:單調(diào)遞增的版本號
acting set:列表,第一個為primary osd,其余為replicated osd
up set:acting set過去的版本
pg tmp:臨時pg組,這種會在主osd成員壞掉、新osd加入的時候出現(xiàn)。比如一個部門,項目經(jīng)理離職了,新找來了一個項目經(jīng)理,這個新來的項目經(jīng)理要向其他的成員學(xué)習(xí)業(yè)務(wù),在這個過程,部門中肯定要暫時選個領(lǐng)頭人,直到新來的項目經(jīng)理學(xué)習(xí)完畢。
pg的狀態(tài)
ceph -s(在某個mon上執(zhí)行)
狀態(tài)的變遷:creating--->peering(組員互相認識的過程)--->active(能干活,但是數(shù)據(jù)還沒同步完)--->clean(已復(fù)制完數(shù)據(jù),可以寫入新的數(shù)據(jù))
stable:你這個組里有人沒在2秒內(nèi)給mon匯報狀態(tài)。如果300秒之內(nèi)沒回應(yīng),mon就會把osd從pg提出
backfilling:有新的OSD進來了(全量)
recovery:原來的成員在300秒內(nèi)活了,要求更新數(shù)據(jù)(增量)
如果一個集群中你設(shè)置了一個osd對應(yīng)多個pg,那么當一個osd壞掉之后,有些數(shù)據(jù)的副本數(shù)就少了一份,由于pg是邏輯單位,所以,在這種情況下要恢復(fù)數(shù)據(jù),壓力是很大的。如果再有一個osd壞掉,有些數(shù)據(jù)的副本可能就剩下一份了,pg的壓力就更大了,很容易造成連鎖反映
在pool里面設(shè)置的副本數(shù)為3,意味著你一個pg對應(yīng)3個osd
osd daemon的狀態(tài),默認每2秒?yún)R報自己的狀態(tài)給mon,同時監(jiān)控組內(nèi)成員的狀態(tài)
up:可以提供IO
down:不能提供IO
in:osd有數(shù)據(jù)
out:osd沒數(shù)據(jù)
osd的功能:存儲以及后端數(shù)據(jù)復(fù)制,監(jiān)控自己以及組內(nèi)成員的狀態(tài)
七、ceph網(wǎng)絡(luò)架構(gòu)
三類集群:disk集群、osd daemon集群(幾十個到幾萬個)、monitor daemon集群
最好的方案:一塊osd daemon對應(yīng)一塊硬盤是最好的方案
monitor:一臺服務(wù)器安裝一個monitor軟件,數(shù)量無上限、最好為奇數(shù)
monitor集群負責維護cluster map
cluster map包含:mon map、osd map、pg map、crush map
monitor集群使用的算法是paxos(功能之一就是選舉),統(tǒng)治者是leader,其余為provider,版本落后的叫rqueester。rqueester向leader發(fā)起獲取集群最新信息的請求,leader不會給,它會讓rqueester找provider要。
集群網(wǎng)絡(luò)也叫北向網(wǎng)絡(luò):用于與客戶端通信,必須萬兆網(wǎng)絡(luò),因為對集群健康狀態(tài)的要求非常高
功能:mon集群通信;osd匯報狀態(tài)給mon,客戶端訪問osd存儲,更新維護cluster map
存儲網(wǎng)絡(luò)也就東西網(wǎng)絡(luò):PG組里面的某個OSD壞掉了(300秒還沒恢復(fù)過來就會被踢出集群),數(shù)據(jù)在平衡的過程中,流量是非常巨大的,所以也必須萬兆網(wǎng)絡(luò)。
八、緩存機制
一臺mon節(jié)點只能起一個monitor daemon
一臺osd節(jié)點可以有多個osd daemon
緩存分兩種:
首先大概了解一下
libvirt ---> qemu(vm) --->librbd --->rados(服務(wù)端緩存--->機械硬盤)
|
客戶端緩存
1.客戶端rbd緩存
write back:異步寫,客戶端先存到rbd緩存,然后再由rbd緩存發(fā)送到rados
優(yōu)點:速度快
缺點:數(shù)據(jù)不安全,數(shù)據(jù)不一致
適用場景:對數(shù)據(jù)安全性要求不高,讀寫混合型的系統(tǒng)
write through:同步寫,一邊往rbd緩存寫,同時也往rados寫
優(yōu)點:讀快、安全
缺點:寫慢
適用場景:讀多寫少
ceph支持在線修改配置文件
2.ceph服務(wù)端緩存
cache tiering,專門找一堆固態(tài)硬盤做一存儲池,與你的機械硬盤做一個映射關(guān)系
客戶端來數(shù)據(jù)先寫ssd,就返回寫成功了,然后再寫到機械硬盤
優(yōu)點:可以提升ceph的存儲性能
缺點:成本高,性能提升并不明顯
服務(wù)端緩存與客戶端緩存對比
1.一個是內(nèi)存級別的,另外一個是基于ssd
2.服務(wù)端緩存不存在數(shù)據(jù)不一致問題
##################部署#####################
如果文件系統(tǒng)是日志文件系統(tǒng)的話,寫數(shù)據(jù)是有兩次返回的
第一次客戶端數(shù)據(jù)來了,記錄在主osd的日志上,從osd從主osd的日志讀取,也寫入自己的日子中,然后返回結(jié)果給主osd,主osd再返回給客戶端。等到所有主從osd的數(shù)據(jù)都寫到硬盤后,又返回一個信息給客戶端,數(shù)據(jù)已經(jīng)真實的存在我的磁盤上了,你可以把緩存清理掉了。如果這一步?jīng)]有完成,那ceph會支持你再發(fā)送一次請求。
有沒有優(yōu)化可言?固態(tài)盤作為日志盤,最好一塊機械盤對應(yīng)一塊osd,實在沒錢把固態(tài)就分區(qū)吧
固態(tài)盤的空間越小,越慢,一般至少要保留30%的空間,固態(tài)盤不推薦分區(qū)
如何計算日志盤大小=(網(wǎng)絡(luò)帶寬和硬盤帶寬大小其中一個*臟數(shù)據(jù)最大同步時間(5-15s))*2
如何把ceph crush視圖導(dǎo)出來
總結(jié)
- 上一篇: 求大神作对联 上联桃字开头下联梅字开头结
- 下一篇: 【python】class之类的定义