1. Ceph Crush进阶
ceph集群中由mon服务器维护的五种运行图:
- Monitor map
- OSD Map
- Pg Map # pg中有多少个osd,那个osd是主的,那个是备的
- Crush Map #可控的,可复制的,可伸缩的一致性hash算法
- MDS Map # cephfs metadata map
crush算法针对目的节点的选择,有5种算法来实现:
- Uniform
- List
- Tree
- Straw
- Straw2
1.1 PG与OSD映射
默认情况下,crush算法自行对创建的pool中的PG分配OSD,但是可以手动基于权重设置crush算法分配数据倾向性,比如1T的磁盘权重是1,2T的是2,推荐使用相同大小的设备
1.1.1 查看当前状态
weight表示设备的容量相对值.weight就是基于磁盘空间分配PG数量,让crush算法尽可能往磁盘空间大的OSD分配PG,往小的OSD分配较少的PG.
Reweight参数目的就是重新平衡ceph的crush算法随机分配的PG,默认的分配时概率上的均衡,即使OSD都是一样的磁盘空间也会产生一些PG分布不均匀的情况.此时可以通过调整reweight参数,让ceph集群立即重新平衡当前磁盘的PG,以达到数据均衡分布的目的.
$ ceph osd df
ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS
10 hdd 0.00099 1.00000 1020 MiB 59 MiB 16 MiB 0 B 43 MiB 961 MiB 5.80 1.13 60 up
11 hdd 0.00099 1.00000 1020 MiB 71 MiB 22 MiB 0 B 49 MiB 949 MiB 6.93 1.35 60 up
12 hdd 0.00099 1.00000 1020 MiB 64 MiB 21 MiB 0 B 43 MiB 956 MiB 6.29 1.23 63 up
13 hdd 0.00099 1.00000 1020 MiB 66 MiB 17 MiB 0 B 49 MiB 954 MiB 6.48 1.26 55 up
2 hdd 0.00099 1.00000 1020 MiB 14 MiB 12 MiB 0 B 37 MiB 1006 MiB 1.35 0.26 54 up
3 hdd 0.00099 1.00000 1020 MiB 67 MiB 22 MiB 0 B 45 MiB 953 MiB 6.53 1.27 64 up
4 hdd 0.00099 1.00000 1020 MiB 65 MiB 15 MiB 0 B 50 MiB 955 MiB 6.37 1.24 59 up
5 hdd 0.00099 1.00000 1020 MiB 79 MiB 23 MiB 0 B 56 MiB 941 MiB 7.70 1.50 59 up
6 hdd 0.00099 1.00000 1020 MiB 52 MiB 27 MiB 2 KiB 25 MiB 968 MiB 5.05 0.99 56 up
7 hdd 0.00099 1.00000 1020 MiB 52 MiB 13 MiB 3 KiB 39 MiB 968 MiB 5.09 0.99 68 up
8 hdd 0.00099 1.00000 1020 MiB 42 MiB 10 MiB 7 KiB 31 MiB 978 MiB 4.08 0.80 50 up
9 hdd 0.00099 1.00000 1020 MiB 32 MiB 11 MiB 4 KiB 22 MiB 988 MiB 3.18 0.62 54 up
14 hdd 0.00099 1.00000 1020 MiB 44 MiB 19 MiB 3 KiB 25 MiB 976 MiB 4.32 0.84 51 up
15 hdd 0.00099 1.00000 1020 MiB 46 MiB 21 MiB 2 KiB 26 MiB 974 MiB 4.53 0.88 57 up
16 hdd 0.00099 1.00000 1020 MiB 40 MiB 10 MiB 3 KiB 30 MiB 980 MiB 3.96 0.77 50 up
17 hdd 0.00099 1.00000 1020 MiB 45 MiB 13 MiB 3 KiB 32 MiB 975 MiB 4.40 0.86 55 up
TOTAL 16 GiB 837 MiB 271 MiB 31 KiB 601 MiB 15 GiB 5.13
1.1.2 修改权重
权重高的服务器,会承载更多的数据,实时生效.
# 权重调高,数据优先写入osd.10
$ ceph osd crush reweight osd.10 0.0015
reweighted item id 10 name 'osd.10' to 0.0015 in crush map
$ ceph osd df
ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS
10 hdd 0.00150 1.00000 1020 MiB 146 MiB 58 MiB 0 B 88 MiB 874 MiB 14.30 2.11 91 up
11 hdd 0.00099 1.00000 1020 MiB 79 MiB 20 MiB 0 B 60 MiB 941 MiB 7.75 1.14 45 up
12 hdd 0.00099 1.00000 1020 MiB 76 MiB 22 MiB 0 B 54 MiB 944 MiB 7.45 1.10 53 up
13 hdd 0.00099 1.00000 1020 MiB 73 MiB 19 MiB 0 B 54 MiB 947 MiB 7.20 1.06 55 up
2 hdd 0.00099 1.00000 1020 MiB 15 MiB 14 MiB 0 B 45 MiB 1005 MiB 1.51 0.22 51 up
3 hdd 0.00099 1.00000 1020 MiB 79 MiB 23 MiB 0 B 55 MiB 941 MiB 7.71 1.14 62 up
4 hdd 0.00099 1.00000 1020 MiB 76 MiB 17 MiB 0 B 60 MiB 944 MiB 7.50 1.11 53 up
5 hdd 0.00099 1.00000 1020 MiB 88 MiB 25 MiB 0 B 63 MiB 932 MiB 8.58 1.27 58 up
6 hdd 0.00099 1.00000 1020 MiB 66 MiB 28 MiB 2 KiB 37 MiB 954 MiB 6.42 0.95 50 up
7 hdd 0.00099 1.00000 1020 MiB 67 MiB 15 MiB 3 KiB 53 MiB 953 MiB 6.59 0.97 66 up
8 hdd 0.00099 1.00000 1020 MiB 51 MiB 12 MiB 7 KiB 38 MiB 969 MiB 4.96 0.73 48 up
9 hdd 0.00099 1.00000 1020 MiB 46 MiB 13 MiB 4 KiB 33 MiB 974 MiB 4.51 0.66 55 up
14 hdd 0.00099 1.00000 1020 MiB 63 MiB 24 MiB 3 KiB 39 MiB 957 MiB 6.19 0.91 52 up
15 hdd 0.00099 1.00000 1020 MiB 61 MiB 22 MiB 2 KiB 39 MiB 959 MiB 5.99 0.88 59 up
16 hdd 0.00099 1.00000 1020 MiB 63 MiB 16 MiB 3 KiB 47 MiB 957 MiB 6.16 0.91 56 up
17 hdd 0.00099 1.00000 1020 MiB 58 MiB 14 MiB 3 KiB 43 MiB 962 MiB 5.64 0.83 60 up
TOTAL 16 GiB 1.1 GiB 341 MiB 31 KiB 808 MiB 15 GiB 6.78
# 权重调低,数据从osd.7迁出
$ ceph osd crush reweight osd.7 0.00095
reweighted item id 7 name 'osd.7' to 0.00095 in crush map
$ ceph osd df
ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS
10 hdd 0.00150 1.00000 1020 MiB 106 MiB 14 MiB 0 B 92 MiB 914 MiB 10.44 1.55 75 up
11 hdd 0.00099 1.00000 1020 MiB 81 MiB 20 MiB 0 B 61 MiB 939 MiB 7.93 1.18 47 up
12 hdd 0.00099 1.00000 1020 MiB 78 MiB 23 MiB 0 B 56 MiB 942 MiB 7.69 1.14 56 up
13 hdd 0.00099 1.00000 1020 MiB 75 MiB 20 MiB 0 B 56 MiB 945 MiB 7.38 1.10 57 up
2 hdd 0.00099 1.00000 1020 MiB 16 MiB 15 MiB 0 B 47 MiB 1004 MiB 1.58 0.23 49 up
3 hdd 0.00099 1.00000 1020 MiB 81 MiB 24 MiB 0 B 57 MiB 939 MiB 7.90 1.17 61 up
4 hdd 0.00099 1.00000 1020 MiB 78 MiB 17 MiB 0 B 61 MiB 942 MiB 7.70 1.14 55 up
5 hdd 0.00099 1.00000 1020 MiB 85 MiB 21 MiB 0 B 64 MiB 935 MiB 8.37 1.24 57 up
6 hdd 0.00099 1.00000 1020 MiB 68 MiB 29 MiB 2 KiB 39 MiB 952 MiB 6.65 0.99 53 up
7 hdd 0.00095 1.00000 1020 MiB 69 MiB 15 MiB 3 KiB 54 MiB 951 MiB 6.79 1.01 66 up
8 hdd 0.00099 1.00000 1020 MiB 53 MiB 13 MiB 7 KiB 40 MiB 967 MiB 5.17 0.77 49 up
9 hdd 0.00099 1.00000 1020 MiB 48 MiB 13 MiB 4 KiB 35 MiB 972 MiB 4.69 0.70 52 up
14 hdd 0.00099 1.00000 1020 MiB 66 MiB 25 MiB 3 KiB 41 MiB 954 MiB 6.43 0.96 56 up
15 hdd 0.00099 1.00000 1020 MiB 64 MiB 23 MiB 2 KiB 41 MiB 956 MiB 6.24 0.93 62 up
16 hdd 0.00099 1.00000 1020 MiB 66 MiB 17 MiB 3 KiB 49 MiB 954 MiB 6.47 0.96 57 up
17 hdd 0.00099 1.00000 1020 MiB 64 MiB 19 MiB 3 KiB 45 MiB 956 MiB 6.29 0.93 63 up
TOTAL 16 GiB 1.1 GiB 308 MiB 31 KiB 835 MiB 15 GiB 6.73
MIN/MAX VAR: 0.23/1.55 STDDEV: 1.86
1.2 crush 运行图管理
1.2.1 导出crush运行图
导出的运行图是二进制格式,无法通过文本编辑器打开,需要使用crushtool工具转换为文本后才能通过vim等工具查看或编辑
# mkdir /ceph/crush -p
# ceph osd getcrushmap -o /ceph/crush/crushmap-202209201501
51
1.2.2 将crush运行图转换成文本
root@ceph-mgr01:~# crushtool -d /ceph/crush/crushmap-202209201501 > /ceph/crush/crushmap-202209201501.txt
root@ceph-mgr01:~# file /ceph/crush/crushmap-202209201501
/ceph/crush/crushmap-202209201501: GLS_BINARY_LSB_FIRST
root@ceph-mgr01:~# file /ceph/crush/crushmap-202209201501.txt
/ceph/crush/crushmap-202209201501.txt: ASCII text
root@ceph-mgr01:~# head /ceph/crush/crushmap-202209201501.txt
# begin crush map
tunable choose_local_tries 0
tunable choose_local_fallback_tries 0
tunable choose_total_tries 50
tunable chooseleaf_descend_once 1
tunable chooseleaf_vary_r 1
tunable chooseleaf_stable 1
tunable straw_calc_version 1
tunable allowed_bucket_algs 54
1.2.3 修改配置
# types # 当前支持的bucket类型
type 0 osd #osd守护进程,对应到一个磁盘设备
type 1 host #一个主机
type 2 chassis#刀片服务器的机箱
type 3 rack#一个机柜
type 4 row#一列
type 5 pdu#一个电源pdu
type 6 pod#一个机房区域
type 7 room#一个房间
type 8 datacenter#一个dc
type 9 zone#一个区域
type 10 region#一个地域
type 11 root#bucket分层最顶部
# buckets
host ceph-node01 { # 类型host名字是ceph-node01
id -3 # do not change unnecessarily 不要修改
id -4 class hdd # do not change unnecessarily 不要修改
# weight 0.004
alg straw2 # crush算法,管理OSD角色
hash 0 # rjenkins1 hash算法 0表示选择rjenkins1算法
item osd.10 weight 0.001 # osd10权重比,crush会自动根据磁盘空间进行计算,不同磁盘的空间不同权重也不同.
item osd.11 weight 0.001
item osd.12 weight 0.001
item osd.13 weight 0.001
}
root default { # 根的配置
id -1 # do not change unnecessarily
id -2 class hdd # do not change unnecessarily
# weight 0.016
alg straw2
hash 0 # rjenkins1
item ceph-node01 weight 0.004
item ceph-node02 weight 0.004
item ceph-node03 weight 0.004
item ceph-node04 weight 0.004
}
# rules
rule replicated_rule { #副本池的默认配置
id 0
type replicated
min_size 1
max_size 10 # 默认最大副本为10 <----将这个值改为20
step take default # 基于default定义的主机分配OSD
step chooseleaf firstn 0 type host # 选择主机,故障域类型为主机
step emit # 弹出配置即返回客户端
}
1.2.4 文本转crush格式
修改文本配置,改完后将文本转回二进制
# crushtool -c /ceph/crush/crushmap-202209201501.txt -o /ceph/crush/crushmap-202209201501-2
1.2.5 导入新的crush
导入运行图会立即覆盖原有的运行图并立即生效
# ceph osd setcrushmap -i /ceph/crush/crushmap-202209201501-2
52
1.2.5 确认修改是否成功
# ceph osd crush rule dump
[
{
"rule_id": 0,
"rule_name": "replicated_rule",
"ruleset": 0,
"type": 1,
"min_size": 1,
"max_size": 20, # <---刚才修改的值
"steps": [
{
"op": "take",
"item": -1,
"item_name": "default"
},
{
"op": "chooseleaf_firstn",
"num": 0,
"type": "host"
},
{
"op": "emit"
}
]
}
]
1.3 crush数据分类管理
ceph crush 算法分配的PG的时候可以将PG分配到不同主机的OSD上,以实现以主机为单位的高可用,这也是默认机制,但是无法保证不同PG位于不同机柜或者机房的主机,如果要事先基于机柜或者是更高级的IDC等方式的数据高可用,而且也不能实现A项目的数据在SSD,B项目的数据在机械盘,如果想要实现此功能需要导出crush运行图,进行手工编辑之后再导入覆盖原有crush运行图.
1.3.1 导出crush运行图并编辑
## 1.导出配置
# ceph osd getcrushmap -o /ceph/crush/crushmap-202209201601
# crushtool -d /ceph/crush/crushmap-202209201601 > /ceph/crush/crushmap-202209201601.txt
## 2.修改配置
## 编辑/ceph/crush/crushmap-202209201601.txt追加以下内容
# vi /ceph/crush/crushmap-202209201601.txt
host ceph-ssdnode01 {
id -103 # do not change unnecessarily
id -104 class hdd # do not change unnecessarily
# weight 0.004
alg straw2
hash 0 # rjenkins1
item osd.10 weight 0.001
}
host ceph-ssdnode02 {
id -105 # do not change unnecessarily
id -106 class hdd # do not change unnecessarily
# weight 0.004
alg straw2
hash 0 # rjenkins1
item osd.2 weight 0.001
}
host ceph-ssdnode03 {
id -107 # do not change unnecessarily
id -108 class hdd # do not change unnecessarily
alg straw2
hash 0 # rjenkins1
item osd.14 weight 0.001
}
root ssd {
id -110 # do not change unnecessarily
id -200 class hdd # do not change unnecessarily
# weight 0.016
alg straw2
hash 0 # rjenkins1
item ceph-ssdnode01 weight 0.004
item ceph-ssdnode02 weight 0.004
item ceph-ssdnode03 weight 0.004
}
rule ssd_rule {
id 100
type replicated
min_size 1
max_size 10
step take ssd ## 这个类型调用ssd中的主机创建PG
step chooseleaf firstn 0 type host
step emit
}
## 3. 导入配置
## 转成2进制
# crushtool -c /ceph/crush/crushmap-202209201601.txt -o /ceph/crush/crushmap-202209201601-2
## 导入2进制
# ceph osd setcrushmap -i /ceph/crush/crushmap-202209201601-2
53
1.3.2 查看规则是否生成
# ceph osd crush rule dump
[
{
"rule_id": 0,
"rule_name": "replicated_rule",
"ruleset": 0,
"type": 1,
"min_size": 1,
"max_size": 20,
"steps": [
{
"op": "take",
"item": -1,
"item_name": "default"
},
{
"op": "chooseleaf_firstn",
"num": 0,
"type": "host"
},
{
"op": "emit"
}
]
},
{
"rule_id": 100,
"rule_name": "ssd_rule",
"ruleset": 100,
"type": 1,
"min_size": 1,
"max_size": 10,
"steps": [
{
"op": "take",
"item": -110,
"item_name": "ssd"
},
{
"op": "chooseleaf_firstn",
"num": 0,
"type": "host"
},
{
"op": "emit"
}
]
}
]
1.3.3 使用ssd规则创建pool
固态盘分别是osd.10,osd.2,osd.14 可以看到下面创建的pg中的osd范围只在这3个盘之上.
# ceph osd pool create sap-ssd-pool 32 32 ssd_rule
pool 'sap-ssd-pool' created
# ceph pg ls-by-pool sap-ssd-pool|awk '{print $1,$2,$15}'
PG OBJECTS ACTING
15.0 0 [14,2,10]p14
15.1 0 [14,10,2]p14
15.2 0 [10,2,14]p10
15.3 0 [14,10,2]p14
15.4 0 [2,14,10]p2
15.5 0 [10,2,14]p10
15.6 0 [2,14,10]p2
15.7 0 [14,10,2]p14
15.8 0 [14,2,10]p14
15.9 0 [10,14,2]p10
15.a 0 [14,2,10]p14
15.b 0 [10,14,2]p10
15.c 0 [10,14,2]p10
15.d 0 [14,10,2]p14
15.e 0 [14,2,10]p14
15.f 0 [14,10,2]p14
15.10 0 [10,2,14]p10
15.11 0 [14,2,10]p14
15.12 0 [10,2,14]p10
15.13 0 [10,14,2]p10
15.14 0 [2,14,10]p2
15.15 0 [14,2,10]p14
15.16 0 [10,2,14]p10
15.17 0 [2,14,10]p2
15.18 0 [10,14,2]p10
15.19 0 [2,14,10]p2
15.1a 0 [14,2,10]p14
15.1b 0 [2,14,10]p2
15.1c 0 [14,2,10]p14
15.1d 0 [14,10,2]p14
15.1e 0 [14,10,2]p14
15.1f 0 [14,10,2]p14