1. Ceph IO流程及數(shù)據(jù)分布
1.1 正常IO流程圖
步驟:
- client 創(chuàng)建cluster handler。
- client 讀取配置文件执虹。
- client 連接上monitor羡滑,獲取集群map信息菇爪。
- client 讀寫(xiě)io 根據(jù)crshmap 算法請(qǐng)求對(duì)應(yīng)的主osd數(shù)據(jù)節(jié)點(diǎn)。
- 主osd數(shù)據(jù)節(jié)點(diǎn)同時(shí)寫(xiě)入另外兩個(gè)副本節(jié)點(diǎn)數(shù)據(jù)柒昏。
- 等待主節(jié)點(diǎn)以及另外兩個(gè)副本節(jié)點(diǎn)寫(xiě)完數(shù)據(jù)狀態(tài)凳宙。
- 主節(jié)點(diǎn)及副本節(jié)點(diǎn)寫(xiě)入狀態(tài)都成功后,返回給client职祷,io寫(xiě)入完成氏涩。
1.2 新主IO流程圖
說(shuō)明:
如果新加入的OSD1取代了原有的 OSD4成為 Primary OSD, 由于 OSD1 上未創(chuàng)建 PG , 不存在數(shù)據(jù),那么 PG 上的 I/O 無(wú)法進(jìn)行有梆,怎樣工作的呢是尖?
步驟:
- client連接monitor獲取集群map信息。
- 同時(shí)新主osd1由于沒(méi)有pg數(shù)據(jù)會(huì)主動(dòng)上報(bào)monitor告知讓osd2臨時(shí)接替為主淳梦。
- 臨時(shí)主osd2會(huì)把數(shù)據(jù)全量同步給新主osd1析砸。
- client IO讀寫(xiě)直接連接臨時(shí)主osd2進(jìn)行讀寫(xiě)。
- osd2收到讀寫(xiě)io爆袍,同時(shí)寫(xiě)入另外兩副本節(jié)點(diǎn)首繁。
- 等待osd2以及另外兩副本寫(xiě)入成功。
- osd2三份數(shù)據(jù)都寫(xiě)入成功返回給client, 此時(shí)client io讀寫(xiě)完畢陨囊。
- 如果osd1數(shù)據(jù)同步完畢弦疮,臨時(shí)主osd2會(huì)交出主角色。
- osd1成為主節(jié)點(diǎn)蜘醋,osd2變成副本胁塞。
1.3 Ceph IO算法流程
File用戶需要讀寫(xiě)的文件。File->Object映射:
a. ino (File的元數(shù)據(jù)压语,F(xiàn)ile的唯一id)啸罢。
b. ono(File切分產(chǎn)生的某個(gè)object的序號(hào),默認(rèn)以4M切分一個(gè)塊大小)胎食。
c. oid(object id: ino + ono)扰才。Object是RADOS需要的對(duì)象。Ceph指定一個(gè)靜態(tài)hash函數(shù)計(jì)算oid的值厕怜,將oid映射成一個(gè)近似均勻分布的偽隨機(jī)值衩匣,然后和mask按位相與蕾总,得到pgid。Object->PG映射:
a. hash(oid) & mask-> pgid 琅捏。
b. mask = PG總數(shù)m(m為2的整數(shù)冪)-1 生百。PG(Placement Group),用途是對(duì)object的存儲(chǔ)進(jìn)行組織和位置映射, (類似于redis cluster里面的slot的概念) 一個(gè)PG里面會(huì)有很多object。采用CRUSH算法柄延,將pgid代入其中蚀浆,然后得到一組OSD。PG->OSD映射:
a. CRUSH(pgid)->(osd1,osd2,osd3) 搜吧。
1.4 Ceph IO偽代碼流程
locator = object_name
obj_hash = hash(locator)
pg = obj_hash % num_pg
osds_for_pg = crush(pg) # returns a list of osds
primary = osds_for_pg[0]
replicas = osds_for_pg[1:]
1.5 Ceph RBD IO流程
步驟:
- 客戶端創(chuàng)建一個(gè)pool蜡坊,需要為這個(gè)pool指定pg的數(shù)量。
- 創(chuàng)建pool/image rbd設(shè)備進(jìn)行掛載赎败。
- 用戶寫(xiě)入的數(shù)據(jù)進(jìn)行切塊秕衙,每個(gè)塊的大小默認(rèn)為4M,并且每個(gè)塊都有一個(gè)名字僵刮,名字就是object+序號(hào)据忘。
- 將每個(gè)object通過(guò)pg進(jìn)行副本位置的分配。
- pg根據(jù)cursh算法會(huì)尋找3個(gè)osd搞糕,把這個(gè)object分別保存在這三個(gè)osd上勇吊。
- osd上實(shí)際是把底層的disk進(jìn)行了格式化操作,一般部署工具會(huì)將它格式化為xfs文件系統(tǒng)窍仰。
- object的存儲(chǔ)就變成了存儲(chǔ)一個(gè)文rbd0.object1.file汉规。
1.6 Ceph RBD IO框架圖
客戶端寫(xiě)數(shù)據(jù)osd過(guò)程:
- 采用的是librbd的形式,使用librbd創(chuàng)建一個(gè)塊設(shè)備驹吮,向這個(gè)塊設(shè)備中寫(xiě)入數(shù)據(jù)针史。
- 在客戶端本地同過(guò)調(diào)用librados接口,然后經(jīng)過(guò)pool碟狞,rbd啄枕,object、pg進(jìn)行層層映射,在PG這一層中族沃,可以知道數(shù)據(jù)保存在哪3個(gè)OSD上频祝,這3個(gè)OSD分為主從的關(guān)系。
- 客戶端與primay OSD建立SOCKET 通信脆淹,將要寫(xiě)入的數(shù)據(jù)傳給primary OSD常空,由primary OSD再將數(shù)據(jù)發(fā)送給其他replica OSD數(shù)據(jù)節(jié)點(diǎn)。
1.7 Ceph Pool和PG分布情況
說(shuō)明:
- pool是ceph存儲(chǔ)數(shù)據(jù)時(shí)的邏輯分區(qū)盖溺,它起到namespace的作用漓糙。
- 每個(gè)pool包含一定數(shù)量(可配置)的PG。
- PG里的對(duì)象被映射到不同的Object上咐柜。
- pool是分布到整個(gè)集群的兼蜈。
- pool可以做故障隔離域,根據(jù)不同的用戶場(chǎng)景不一進(jìn)行隔離拙友。
1.8 Ceph 數(shù)據(jù)擴(kuò)容PG分布
場(chǎng)景數(shù)據(jù)遷移流程:
- 現(xiàn)狀3個(gè)OSD, 4個(gè)PG
- 擴(kuò)容到4個(gè)OSD, 4個(gè)PG
現(xiàn)狀:
擴(kuò)容后:
說(shuō)明
每個(gè)OSD上分布很多PG, 并且每個(gè)PG會(huì)自動(dòng)散落在不同的OSD上为狸。如果擴(kuò)容那么相應(yīng)的PG會(huì)進(jìn)行遷移到新的OSD上,保證PG數(shù)量的均衡遗契。