初識(shí)crushmap
CRUSH Map 包含 OSD 列表、“桶”類型醋粟、把設(shè)備匯聚為物理位置的“桶”列表靡菇、和指示 CRUSH 如何復(fù)制存儲(chǔ)池里的數(shù)據(jù)的規(guī)則列表。
Crushmap devices
搭建好集群后(本文所有操作基于ceph版本luminous)米愿,在沒有添加osd進(jìn)集群時(shí)厦凤,此時(shí)通過'ceph osd crush dump'查看crushmap的設(shè)備,你會(huì)發(fā)現(xiàn)此時(shí)的devices為空。形如:
那么育苟,什么操作會(huì)導(dǎo)致crushmap的devices寫入信息呢较鼓?答:將osd加入到集群時(shí)。我們來實(shí)踐一下违柏。
本文使用的部署集群osd命令如下:
///////準(zhǔn)備格式化LVM設(shè)備并將其與OSD關(guān)聯(lián):
ceph-volume lvm prepare --bluestore --data {device-path}
//////列出與Ceph相關(guān)的邏輯卷和設(shè)備;可用于查看{osd id} {osd fsid}
ceph-volume lvm list
//////激活發(fā)現(xiàn)并安裝與OSD ID關(guān)聯(lián)的LVM設(shè)備并啟動(dòng)Ceph OSD
ceph-volume lvm activate {osd-id} {osd-fsid}
/////當(dāng)需要激活的osd較多時(shí)博烂,可以一次性激活所有
ceph-volume lvm activate --all
部署集群osd后,觀察crushmap devices如下:
Crushmap types
Crushmap中的types定義了所有bucket的類型漱竖,集群搭建好后禽篱,這些類型就可以查看到。通過ceph osd crush dump查看如下:
在定義bucket分級(jí)拓?fù)浣Y(jié)構(gòu)中馍惹,root類型的桶為改分級(jí)結(jié)構(gòu)的根節(jié)點(diǎn)躺率。
Crushmap buckets
Ceph在存儲(chǔ)數(shù)據(jù)的過程中,其CRUSH算法會(huì)根據(jù)各設(shè)備的權(quán)重(weight值反映)万矾、大致統(tǒng)一的將數(shù)據(jù)對(duì)象分布到存儲(chǔ)設(shè)備上悼吱。crushmap中的buckets是一系列分級(jí)桶實(shí)例的集合,其表達(dá)的是一種邏輯上的分級(jí)拓?fù)浣Y(jié)構(gòu) (樹型結(jié)構(gòu))勤众。創(chuàng)建桶分級(jí)拓?fù)浣涌诘哪康氖荂RUSH在存儲(chǔ)數(shù)據(jù)時(shí)按故障域隔離葉子節(jié)點(diǎn)(osd舆绎、host、rock....)们颜,數(shù)據(jù)冗余吕朵,達(dá)到數(shù)據(jù)安全。
在ceph的集群中有一個(gè)特殊的名為"default"的桶分級(jí)拓?fù)浣Y(jié)構(gòu)窥突,它從集群搭建好就存在努溃。如下:
default桶分級(jí)結(jié)構(gòu)包含root、host阻问、osd三種桶類型梧税,其應(yīng)該如實(shí)的反映集群存儲(chǔ)設(shè)備的關(guān)系(集群幾個(gè)主機(jī)、每個(gè)主機(jī)下有哪些osd).當(dāng)osd出問題時(shí)称近,可根據(jù)該拓?fù)湔业綄?duì)應(yīng)的物理硬件第队。
操作crushmap bucket相關(guān)命令詳述:
1.添加一個(gè)bucket實(shí)例:
ceph osd crush add-bucket {bucket-name} {bucket-type}
上述命令執(zhí)行后,集群crushmap會(huì)多一條形如:
{
"id": -9, //唯一id標(biāo)識(shí)
"name": "data", //bucket_name刨秆,該bucket_name不能重復(fù)
"type_id": 1, //buckt_type id ,對(duì)應(yīng)于crushmap的types中的一項(xiàng)
"type_name": "host",//bucket 實(shí)例類型
"weight": 0,//該bucket的權(quán)重
"alg": "straw2",
"hash": "rjenkins1",
"items": []// 該bucket的子bucket信息(樹形理解)
}
2.移動(dòng)bucket層級(jí)
ceph osd crush move {bucket-name} {args...}
執(zhí)行上述命令后凳谦,可以將{buckt-name}移動(dòng)到{args}指定的層級(jí)下, 作為{args}的孩子節(jié)點(diǎn),其中args形如{bucket_type}={name}衡未。
3.添加osd到一個(gè)分級(jí)結(jié)構(gòu)
ceph osd crush add/set osd.{osd-id} {weight} {args}
上述命令中的{weight}值表明該osd的存儲(chǔ)能力(容量)尸执,一般1T的盤家凯,weight設(shè)為1,{args}知道該osd位置如失。
- 刪除層級(jí)結(jié)構(gòu)
將子bucket從父bucket下刪除:
ceph osd crush rm {bucket_name} {parent_bucket_name}
只有當(dāng)一個(gè)bucket下沒有子bucket時(shí)绊诲,它才能被刪除,否則會(huì)報(bào)錯(cuò)褪贵。
將root bucket刪除:
ceph osd crush rm {bucket_name}
- 調(diào)整dafault層級(jí)結(jié)構(gòu)真實(shí)反映物理設(shè)備情況
如果不調(diào)整default的層級(jí)掂之,只是將osd加入集群中,此時(shí)是沒有分級(jí)結(jié)構(gòu)的脆丁,如下:
本文實(shí)踐的集群環(huán)境:3個(gè)主機(jī)板惑、每個(gè)主機(jī)下2個(gè)osd,其拓?fù)浣Y(jié)構(gòu)如下:
調(diào)整過程命令如下:
#添加3個(gè)主機(jī)
1082 ceph osd crush add-bucket node81 host
1083 ceph osd crush add-bucket node82 host
1084 ceph osd crush add-bucket node85 host
1085 ceph osd tree
#將3個(gè)主機(jī)移動(dòng)到default下
1086 ceph osd crush move node81 root=default
1087 ceph osd tree
1088 ceph osd crush move node82 root=default
1089 ceph osd crush move node85 root=default
1090 ceph osd tree
#添加osd.0/osd.1到node81下
1091 ceph osd crush add osd.0 0.00977 root=default host=node81
1092 ceph osd tree
1093 ceph osd crush add osd.1 0.00977 root=default host=node81
#添加osd.0/osd.1到node82下
1094 ceph osd crush add osd.2 0.00977 root=default host=node82
1095 ceph osd crush add osd.3 0.00977 root=default host=node82
#添加osd.0/osd.1到node85下
1096 ceph osd crush add osd.4 0.00977 root=default host=node85
1097 ceph osd crush add osd.5 0.00977 root=default host=node85
1098 ceph osd tree
1099 history
創(chuàng)建完成后偎快,集群的default拓?fù)鋱D如下:
- 完整創(chuàng)建一個(gè)自定義分級(jí)拓?fù)洌?/li>
#創(chuàng)建root bucket
1105 ceph osd crush add-bucket data root
#創(chuàng)建各層級(jí)
1106 ceph osd crush add-bucket data_node81 host
1107 ceph osd crush add-bucket data_node82 host
1108 ceph osd crush add-bucket data_node85 host
#調(diào)整各層級(jí)
1109 ceph osd crush move data_node81 root=data
1110 ceph osd crush move data_node82 root=data
1111 ceph osd crush move data_node85 root=data
#添加osd
1112 ceph osd crush add osd.1 0.00977 root=data host=data_node81
1113 ceph osd crush add osd.0 0.00977 root=data host=data_node81
1114 ceph osd crush add osd.2 0.00977 root=data host=data_node82
1115 ceph osd crush add osd.3 0.00977 root=data host=data_node82
1116 ceph osd crush add osd.4 0.00977 root=data host=data_node85
1117 ceph osd crush add osd.5 0.00977 root=data host=data_node85
1118 ceph osd tree
1119 history
完成后如下:
- 刪除一個(gè)完整的層級(jí)結(jié)構(gòu)實(shí)踐
#將osd.0冯乘、osd.1從node81刪除(刪除葉子節(jié)點(diǎn))
1129 ceph osd crush rm osd.0 data_node81
1130 ceph osd crush rm osd.1 data_node81
1131 ceph osd tree
#將主機(jī)data_node81從data下刪除
1132 ceph osd crush rm data_node81 data
#將osd.2、osd.3從node82刪除
1133 ceph osd crush rm osd.2 data_node82
1134 ceph osd crush rm osd.3 data_node82
1135 ceph osd crush rm data_node82 data
#將osd.4晒夹、osd.5從node85刪除
1136 ceph osd crush rm osd.4 data_node85
1137 ceph osd crush rm osd.5 data_node85
1138 ceph osd crush rm data_node85 data
1139 ceph osd tree
刪除root bucket(data)
1140 ceph osd crush rm data
1141 history
Crushmap rules
crushmap中的rules是一系列存儲(chǔ)池規(guī)則的集合裆馒。存儲(chǔ)池規(guī)則(rule)確定一個(gè)存儲(chǔ)池的數(shù)據(jù)如何歸置:數(shù)據(jù)的冗余份數(shù)、數(shù)據(jù)隔離級(jí)別等丐怯。下面簡(jiǎn)單的查看說明一下:
//查看當(dāng)前集群所有的的crush rule name
[root@node81 ~]# ceph osd crush rule list
replicated_rule
//查看當(dāng)前集群所有的的crush rule詳情
[root@node81 ~]# ceph osd crush rule dump
[
{
"rule_id": 0, #rule id(唯一表示)
"rule_name": "replicated_rule",#rule name
"ruleset": 0,#區(qū)分一條規(guī)則屬于某個(gè)規(guī)則集的手段
"type": 1,#rule 類型(糾刪碼或副本)
"min_size": 1,#可以選擇此規(guī)則的存儲(chǔ)池最小副本數(shù)
"max_size": 10,#可以選擇此規(guī)則的存儲(chǔ)池最大副本數(shù)
"steps": [
{
"op": "take",
"item": -1,
"item_name": "default" #root bucket(根節(jié)點(diǎn))
},
{
"op": "chooseleaf_firstn",
"num": 0,
"type": "host" #隔離數(shù)據(jù)粒度(故障域級(jí)別)
},
{
"op": "emit"
}
]
}
]
[root@node81 ~]#
編輯crushmap
1.獲取集群crushmap
ceph osd getcrushmap -o {file1}
{file1}為自定義的文件名喷好,該文件為二進(jìn)制文件,不可編輯读跷。要想編輯此文件梗搅,需要用工具將其反編譯解析,如crushtool工具效览。
2反編譯crushmap
crushtool -d {file1} -o {file2}
反編譯二進(jìn)制文件{file1}得到可編輯文件{file2}
3.編輯crushmap
按自我需求修改可編輯文件{file2}
4.編譯crushmap
要想編輯后的文件機(jī)器能夠識(shí)別无切,必須用工具編譯它生成二進(jìn)制文件。
crushtool -c {file2} -o {file3}
5.注入crushmap
要想新的crushmap在集群中生效丐枉,必須將其注入要集群哆键。
ceph osd setcrushmap -i {file3}
參考資料:
1.ceph 官方文檔
更多詳情,詳見官網(wǎng):
http://docs.ceph.org.cn/rados/operations/crush-map/