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