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
posted @ 2020-10-30 14:00  Varden  阅读(600)  评论(0编辑  收藏  举报