Ceph集群运行图配置详解
集群运行图介绍
Ceph 依赖于 Ceph 客户端和 OSD ,因为它们知道集群的拓扑,这个拓扑由 5 张图共同描述,统称为“集群运行图”:
- Montior Map: 包含集群的 fsid 、位置、名字、地址和端口,也包括当前版本、创建时间、最近修改时间。要查看监视器图,用 ceph mon dump 命令。
- OSD Map: 包含集群 fsid 、创建时间、最近修改时间、存储池列表、副本数量、归置组数量、 OSD 列表及其状态(如 up 、 in )。要查看OSD运行图,用 ceph osd dump 命令。
- PG Map: 包含归置组版本、其时间戳、最新的 OSD 运行图版本、占满率、以及各归置组详情,像归置组 ID 、 up set 、 acting set 、 PG 状态(如 active+clean ),和各存储池的数据使用情况统计。
- CRUSH Map: 包含存储设备列表、故障域树状结构(如设备、主机、机架、行、房间、等等)、和存储数据时如何利用此树状结构的规则。要查看 CRUSH 规则,执行 ceph osd getcrushmap -o {filename} 命令;然后用 crushtool -d {comp-crushmap-filename} -o {decomp-crushmap-filename} 反编译;然后就可以用 cat 或编辑器查看了。
- MDS Map: 包含当前 MDS 图的版本、创建时间、最近修改时间,还包含了存储元数据的存储池、元数据服务器列表、还有哪些元数据服务器是 up 且 in 的。要查看 MDS 图,执行 ceph mds dump 。
各运行图维护着各自运营状态的变更, Ceph 监视器维护着一份集群运行图的主拷贝,包括集群成员、状态、变更、以及 Ceph 存储集群的整体健康状况。
命令汇总:
ceph mon dump
ceph osd dump
ceph pg dump
ceph osd getcrushmap -o {filename}
crushtool -d {comp-crushmap-filename} -o {decomp-crushmap-filename}
ceph mds dump
自定义CRUSH-快慢存储搭配方案
方案介绍
存储节点上既有SATA盘也有SSD盘或者是PCIE,就是把每台服务器上的SSD,PCIE和SATA分别整合成独立的存储池,以提供不同性能的存储。把对实时数据IO要求高的放入SSD存储池中。而对于备份,快照等数据,对IO性能要求较低的可以放入SATA盘。
硬件环境
存储节点 osd编号 对应设备 存储类型
ceph-osd1 0 sdb ssd
ceph-osd1 1 sdc sata
ceph-osd2 2 sdb ssd
ceph-osd2 3 sdc sata
与正常ceph安装没有区别,只是后期会修改CRUSH。
部署环境
假设你已经部署好ceph了,ceph默认的CRUSH故障域是host级别。
查看当前CRUSH
[root@ceph-osd1 ~]# ceph osd tree
ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY
-2 0.49988 root host
-4 0.1006 host ceph-osd1
0 0.04999 osd.0 up 1.00000 1.00000
1 0.04999 osd.1 up 1.00000 1.00000
-5 0.1006 host ceph-osd2
3 0.04999 osd.2 up 1.00000 1.00000
4 0.04999 osd.3 up 1.00000 1.00000
获取当前Crush Map
[root@ceph-osd1 ~]# ceph osd getcrushmap -o /tmp/cephcrushmap
反编译Crush Map
因为/tmp/cephcrushmap是一个二进制文件,需要通过crushtool反编译为文本文件。
[root@ceph-osd1 ~]# crushtool -d /tmp/cephcrushmap -o /tmp/cephcrushmap.txt
编辑Crush Map文件
- 设置SSD pool的Buchet入口
新建一个root层级,命名为ssd,并且把SSD设备的OSD移到里面(保留OSD所属的HOST层级)
编辑/tmp/cephcrushmap.txt文件,添加以下内容:
host ceph-ssd-osd1 {
id -4 # do not change unnecessarily
# weight 0.150 # 权重可以忽略,ceph会根据OSD自动计算权重
alg straw
hash 0 # rjenkins1
item osd.0 weight 0.050 # SSD的OSD
}
host ceph-ssd-osd2 {
id -5 # do not change unnecessarily
# weight 0.150
alg straw
hash 0 # rjenkins1
item osd.2 weight 0.050 # SSD的OSD
}
root ssd { # 新建一个名为ssd的root bucket,最后SSD pool入口
id -2 # do not change unnecessarily
# weight 0.500
alg straw
hash 0 # rjenkins1
item ceph-ssd-osd1 weight 0.100
item ceph-ssd-osd2 weight 0.100
}
- 再把默认的root bucket 重命名为sata,并把SATA的OSD移到sata里面
编辑/tmp/cephcrushmap.txt文件,添加以下内容:
host ceph-sata-osd1 {
id -4 # do not change unnecessarily
# weight 0.150 # 权重可以忽略,ceph会根据OSD自动计算权重
alg straw
hash 0 # rjenkins1
item osd.1 weight 0.050 # SATA的OSD
}
host ceph-sata-osd2 {
id -5 # do not change unnecessarily
# weight 0.150
alg straw
hash 0 # rjenkins1
item osd.3 weight 0.050 # SATA的OSD
}
root sata { # 新建一个名为sata的root bucket,最后SATA pool入口
id -2 # do not change unnecessarily
# weight 0.500
alg straw
hash 0 # rjenkins1
item ceph-sata-osd1 weight 0.100
item ceph-sata-osd2 weight 0.100
}
设置rule规则
- 为SSD pool添加rule
# rules
rule ssd {
ruleset 0
type replicated
min_size 1
max_size 10
step take ssd # 此处选择SSD root
step chooseleaf firstn 0 type host # CRUSH故障域是host级别
step emit
}
- 为SATA pool添加rule
# rules
rule sata {
ruleset 1
type replicated
min_size 1
max_size 10
step take sata #此处选择SATA root
step chooseleaf firstn 0 type host
step emit
}
编译Crush Map文本文件为二进制文件
[root@ceph-osd1 ~]# crushtool -c /tmp/cephcrushmap.txt -o /tmp/cephcrushmap.new
把新的Crush Map应用于集群并生效
[root@ceph-osd1 ~]# ceph osd setcrushmap -i /tmp/cephcrushmap.new
查看CRUSH结构,确认新的Crush Map已经生效
[root@ceph-osd1 ~]# ceph osd tree
ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY
-2 0.49997 root ssd
-4 0.10009 host ceph-ssd-osd1
0 0.04999 osd.0 up 1.00000 1.00000
-4 0.10009 host ceph-ssd-osd2
1 0.04999 osd.2 up 1.00000 1.00000
-2 0.49997 root sata
-4 0.10009 host ceph-sata-osd1
3 0.04999 osd.1 up 1.00000 1.00000
-4 0.10009 host ceph-sata-osd2
4 0.04999 osd.3 up 1.00000 1.00000
创建SSD和SATA存储池
[root@ceph-osd1 ~]# ceph osd pool create SSD 128 128
[root@ceph-osd1 ~]# ceph osd pool create SATA 128 128
为存储池指定合适的rule
[root@ceph-osd1 ~]# ceph osd pool set SSD crush_ruleset 0 # 这里ruleset 0为rule ssd
[root@ceph-osd1 ~]# ceph osd pool set SATA crush_ruleset 1 # 这里ruleset 1为rule sata
查看rule是否生效
[root@ceph-osd1 ~]# ceph osd dump|grep -Ei "ssd|sata"
pool 24 'SSD' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 128 pgp_num 128 last_change 768 flags hashpspool stripe_width 0 # SSD pool的rule id是0
pool 25 'SATA' replicated size 3 min_size 2 crush_ruleset 1 object_hash rjenkins pg_num 128 pgp_num 128 last_change 770 flags hashpspool stripe_width 0 # SATA pool的rule id是1
CRUSH图之桶层次示例
host node1 {
id -1
alg straw
hash 0
item osd.0 weight 1.00
item osd.1 weight 1.00
}
host node2 {
id -2
alg straw
hash 0
item osd.2 weight 1.00
item osd.3 weight 1.00
}
rack rack1 {
id -3
alg straw
hash 0
item node1 weight 2.00
item node2 weight 2.00
}
注意事项
- 在调整之前做好crushmap的备份,以防crush设置不当时能够及时复原。
- crush的设计应该在业务系统上线之前已经敲定,在线调整将面临极大的风险,必须慎之又慎。
- 有时候 reblance 未能达到完全收敛,可能需要设置下 tunable 值为 optimal .即使用 ceph osd crush tunable optimal 命令进行调整。
- 在[global]中设置 osd crush update on start 为 false ,防止osd重启更新crushmap。
命令行修改集群运行图示例
# 添加或移动OSD
$ ceph osd crush set osd.0 1.0 root=default host=ceph1
$ ceph osd crush set osd.1 1.0 root=default host=ceph1
$ ceph osd crush set osd.2 1.0 root=default host=ceph2
$ ceph osd crush set osd.3 1.0 root=default host=ceph2
$ ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 4.00000 root default
-3 2.00000 host ceph1
0 hdd 1.00000 osd.0 up 1.00000 1.00000
1 hdd 1.00000 osd.1 up 1.00000 1.00000
-5 2.00000 host ceph2
2 hdd 1.00000 osd.2 up 1.00000 1.00000
3 hdd 1.00000 osd.3 up 1.00000 1.00000
# 添加root bucket
$ ceph osd crush add-bucket root-ssd root
$ ceph osd crush add-bucket root-sas root
$ ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-8 0 root root-sas
-7 0 root root-ssd
-1 4.00000 root default
-3 2.00000 host ceph1
0 hdd 1.00000 osd.0 up 1.00000 1.00000
1 hdd 1.00000 osd.1 up 1.00000 1.00000
-5 2.00000 host ceph2
2 hdd 1.00000 osd.2 up 1.00000 1.00000
3 hdd 1.00000 osd.3 up 1.00000 1.00000
# 添加host bucket
ceph osd crush add-bucket ceph1-ssd host
ceph osd crush add-bucket ceph1-sas host
# 移除host bucket
ceph osd crush remove ceph1-ssd
ceph osd crush remove ceph1-sas