HMK's blog

保持思考|00后|等待


  • Home
  • Archive
  • Tags
  •   

© 2026 Hekang

Theme Typography by Makito

Proudly published with Hexo

Ceph数据冷热分离

Posted at 2026-08-07 Storage 

1.ceph crush

ceph 集群中由 mon 服务器维护的的五种运行图:

Monitor map # 监视器运行图

OSD map # OSD运行图

PG map # PG 运行图

Crush map # (Controllers replication under scalable hashing)可控的、可复制的、可伸缩的一致性hash算法

MDS map # cephfs metadata 运行图

crush 运行图,当新建存储池时,会基于OSD map创建出新的PG组合列表用于存储数据

crush算法针对目标节点的选择

目前有 5 种算法来实现节点的选择,包括 Uniform、List、Tree、Straw、Straw2,早期版本使用的是 ceph 项目的发起者发明的算法 straw,目前已经发展社区优化的straw2 版本。

straw(抽签算法):

抽签是指挑取一个最长的签,而这个签值就是 OSD 的权重,当创建存储池的时候会向PG分配 OSD,straw 算法会遍历当前可用的 OSD 并优先使用中签的 OSD,以让权重高的OSD被分配较多的 PG 以存储更多的数据。

1.1 PG与OSD 映射调整

修改WEIGHT

OSD的REWEIGHT

  • 默认值为 1,取值范围 0~1,值越低,承载的 PG(数据)越少。
  • 修改后会触发数据重新平衡。
  • 适用于降低某个 OSD 的 PG 数量,缓解空间压力的场景

ceph osd crush reweight 调整的是 OSD 的“基础权重”,决定了它应该承载多少数据;而 ceph osd reweight 则是一个“修正系数”,在基础权重之上进行微调,决定它实际承载多少数据。

特性 ceph osd reweight ceph osd crush reweight
修改对象 OSD 的覆盖权重 (override weight),可以看作是 CRUSH 权重之上的一个修正因子。 CRUSH map 中的基础权重 (CRUSH weight)。
取值范围 0 ~ 1 之间的小数。 理论上无限制,实践中通常设置为磁盘容量(以 TB 为单位),例如 4TB 的磁盘设为 4.0。
持久性 非永久生效。当 OSD 被标记为 out 时权重自动归零,重新标记为 in 时恢复为 1。 永久生效,除非手动修改,否则该权重不会改变。
影响范围 只影响该 OSD 自身的数据分布,不会改变它所在 CRUSH bucket(如主机、机架)的总权重。 修改该 OSD 权重后,其所在的 bucket 总权重也会相应变化,影响可能更广。
主要用途 作为临时纠正措施,用于快速调整因概率分布不均导致个别 OSD 空间过满的问题。 通常作为长期配置,在 OSD 创建或替换硬盘时,根据其实际容量设
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
root@ceph-node1:~# ceph osd df
ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS
3 hdd 0.01949 1.00000 20 GiB 63 MiB 2.0 MiB 37 KiB 61 MiB 20 GiB 0.31 1.53 38 up
0 ssd 0.01949 1.00000 20 GiB 30 MiB 3.6 MiB 56 KiB 26 MiB 20 GiB 0.15 0.72 27 up
4 hdd 0.01949 1.00000 20 GiB 67 MiB 4.1 MiB 8 KiB 63 MiB 20 GiB 0.33 1.61 34 up
1 ssd 0.01949 1.00000 20 GiB 29 MiB 1.6 MiB 9 KiB 27 MiB 20 GiB 0.14 0.70 31 up
5 hdd 0.01949 1.00000 20 GiB 32 MiB 4.5 MiB 17 KiB 27 MiB 20 GiB 0.15 0.76 29 up
2 ssd 0.01949 1.00000 20 GiB 28 MiB 1.1 MiB 14 KiB 27 MiB 20 GiB 0.14 0.68 36 up
TOTAL 120 GiB 249 MiB 17 MiB 144 KiB 232 MiB 120 GiB 0.20
MIN/MAX VAR: 0.68/1.61 STDDEV: 0.08


root@ceph-node1:~# ceph osd crush reweight osd.2 0.0099
reweighted item id 2 name 'osd.2' to 0.0099 in crush map

root@ceph-node1:~# ceph osd df
ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS
3 hdd 0.01949 1.00000 20 GiB 64 MiB 2.1 MiB 37 KiB 61 MiB 20 GiB 0.31 1.53 37 up
0 ssd 0.01949 1.00000 20 GiB 30 MiB 3.7 MiB 60 KiB 26 MiB 20 GiB 0.15 0.72 28 up
4 hdd 0.01949 1.00000 20 GiB 67 MiB 4.1 MiB 11 KiB 63 MiB 20 GiB 0.33 1.61 35 up
1 ssd 0.01949 1.00000 20 GiB 29 MiB 1.6 MiB 12 KiB 27 MiB 20 GiB 0.14 0.70 30 up
5 hdd 0.01949 1.00000 20 GiB 32 MiB 4.7 MiB 20 KiB 27 MiB 20 GiB 0.16 0.77 40 up
2 ssd 0.00989 1.00000 20 GiB 28 MiB 1.0 MiB 17 KiB 27 MiB 20 GiB 0.14 0.68 25 up
TOTAL 120 GiB 249 MiB 17 MiB 160 KiB 232 MiB 120 GiB 0.20
MIN/MAX VAR: 0.68/1.61 STDDEV: 0.08

1.2 crush运行图管理

通过工具将 ceph 的 crush 运行图导出并进行编辑,然后导入

1.2.1 导出 crush 运行图

**注:**导出的 crush 运行图为二进制格式,无法通过文本编辑器直接打开,需要使用crushtool 工具转换为文本格式后才能通过 vim 等文本编辑宫工具打开和编辑。

1
2
3
4
5
6
root@ceph-node1:~# mkdir -p /data/ceph
root@ceph-node1:~# ceph osd getcrushmap -o /data/ceph/crushmap-v1
36
root@ceph-node1:/data/ceph# ls
crushmap-v1
root@ceph-node1:/data/ceph# cp crushmap-v1 crushmap-v1.bak

1.2.2 将运行图转换为文本

导出的运行图不能直接编辑,需要转换为文本格式再进行查看与编辑

https://docs.redhat.com/zh-cn/documentation/red_hat_ceph_storage/1.2.3/html/storage_strategies/crush_tunables#doc-wrapper

1
2
3
4
5
6
# 系统是ubuntu 24.04.3  系统算是新的 目前清华没有相关的源
root@ceph-node1:/data/ceph# cat /etc/apt/sources.list.d/ceph.list
#deb https://mirrors.tuna.tsinghua.edu.cn/ceph/debian-tentacle/ noble main
deb https://mirrors.ustc.edu.cn/ceph/debian-tentacle noble main

root@ceph-node1:/data/ceph# apt install ceph-base -y
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
root@ceph-node1:/data/ceph# crushtool -d /data/ceph/crushmap-v1 > /data/ceph/crushmap-v1.txt
root@ceph-node1:/data/ceph# cat crushmap-v1.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

# devices #当前的设备列表
device 0 osd.0 class ssd
device 1 osd.1 class ssd
device 2 osd.2 class ssd
device 3 osd.3 class hdd
device 4 osd.4 class hdd
device 5 osd.5 class hdd

# types #当前支持的 bucket 类型
type 0 osd #osd 守护进程,对应到一个磁盘设备
type 1 host #一个主机
type 2 chassis #刀片服务器的机箱
type 3 rack #包含若干个服务器的机柜/机架
type 4 row #包含若干个机柜的一排机柜(一行机柜)
type 5 pdu #机柜的接入电源插座
type 6 pod #一个机房中的若干个小房间
type 7 room #包含若干机柜的房间,一个数据中心有好多这样的房间组成
type 8 datacenter #一个数据中心或 IDC
type 9 zone
type 10 region #一个区域,比如 AWS 宁夏中卫数据中心
type 11 root #bucket 分层的最顶部,根

# buckets
host ceph-node1 {
id -3 # do not change unnecessarily #ceph 生成的 OSD ID,非必要不要
id -4 class ssd # do not change unnecessarily
id -9 class hdd # do not change unnecessarily
# weight 0.03897
alg straw2 #crush 算法,管理 OSD 角色
hash 0 # rjenkins1 #使用是哪个 hash 算法,使用 rjenkins1 hash 函数
item osd.0 weight 0.01949
item osd.3 weight 0.01949
}
host ceph-node2 {
id -5 # do not change unnecessarily
id -6 class ssd # do not change unnecessarily
id -10 class hdd # do not change unnecessarily
# weight 0.03897
alg straw2
hash 0 # rjenkins1
item osd.1 weight 0.01949
item osd.4 weight 0.01949
}
host ceph-node3 {
id -7 # do not change unnecessarily
id -8 class ssd # do not change unnecessarily
id -11 class hdd # do not change unnecessarily
# weight 0.03897
alg straw2
hash 0 # rjenkins1
item osd.5 weight 0.01949
item osd.2 weight 0.01949
}
root default { #根的配置
id -1 # do not change unnecessarily
id -2 class ssd # do not change unnecessarily
id -12 class hdd # do not change unnecessarily
# weight 0.11691
alg straw2
hash 0 # rjenkins1
item ceph-node1 weight 0.03897
item ceph-node2 weight 0.03897
item ceph-node3 weight 0.03897
}

# rules
rule replicated_rule { #副本池的默认配置
id 0
type replicated
step take default
step chooseleaf firstn 0 type host #firstn 0 为表示为 pool 设置的副本数、根据副本数选择主机数量,故障域类型为主机
step emit #弹出配置即返回给客户端
}

# end crush map

1.2.3 将文本转换为 crush 格式

修改curshmap

混合节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
root@ceph-node1:/data/ceph# cat crushmap-v1.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

# devices
device 0 osd.0 class ssd
device 1 osd.1 class ssd
device 2 osd.2 class ssd
device 3 osd.3 class hdd
device 4 osd.4 class hdd
device 5 osd.5 class hdd

# types
type 0 osd
type 1 host
type 2 chassis
type 3 rack
type 4 row
type 5 pdu
type 6 pod
type 7 room
type 8 datacenter
type 9 zone
type 10 region
type 11 root

# buckets
host ceph-node1 {
id -3 # do not change unnecessarily
id -4 class ssd # do not change unnecessarily
id -9 class hdd # do not change unnecessarily
# weight 0.03897
alg straw2
hash 0 # rjenkins1
item osd.0 weight 0.01949
item osd.3 weight 0.01949
}
host ceph-node2 {
id -5 # do not change unnecessarily
id -6 class ssd # do not change unnecessarily
id -10 class hdd # do not change unnecessarily
# weight 0.03897
alg straw2
hash 0 # rjenkins1
item osd.1 weight 0.01949
item osd.4 weight 0.01949
}
host ceph-node3 {
id -7 # do not change unnecessarily
id -8 class ssd # do not change unnecessarily
id -11 class hdd # do not change unnecessarily
# weight 0.03897
alg straw2
hash 0 # rjenkins1
item osd.5 weight 0.01949
item osd.2 weight 0.01949
}
root default {
id -1 # do not change unnecessarily
id -2 class ssd # do not change unnecessarily
id -12 class hdd # do not change unnecessarily
# weight 0.11691
alg straw2
hash 0 # rjenkins1
item ceph-node1 weight 0.03897
item ceph-node2 weight 0.03897
item ceph-node3 weight 0.03897
}

# rules
rule replicated_rule {
id 0
type replicated
step take default
step chooseleaf firstn 0 type host
step emit
}

# 热数据规则 - 自动选择所有节点的SSD
rule hot_data_rule {
id 1
type replicated
step take default class ssd
step chooseleaf firstn 0 type host
step emit
}

# 冷数据规则 - 自动选择所有节点的HDD
rule cold_data_rule {
id 2
type replicated
step take default class hdd
step chooseleaf firstn 0 type host
step emit
}
# end crush map

ssd节点,hdd节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# 逻辑拆分 - 使用虚拟主机名
host ceph-ssdnode1 { # ← 新增的虚拟host
id -3
alg straw2
hash 0
item osd.0 weight 1.00000 # 只有SSD
}

host ceph-ssdnode2 { # ← 新增的虚拟host
id -5
alg straw2
hash 0
item osd.1 weight 1.00000 # 只有SSD
}

host ceph-ssdnode3 { # ← 新增的虚拟host
id -7
alg straw2
hash 0
item osd.2 weight 1.00000 # 只有SSD
}

host ceph-hddnode1 { # ← 新增的虚拟host
id -9
alg straw2
hash 0
item osd.3 weight 1.00000 # 只有HDD
}

host ceph-hddnode2 { # ← 新增的虚拟host
id -11
alg straw2
hash 0
item osd.4 weight 1.00000 # 只有HDD
}

host ceph-hddnode3 { # ← 新增的虚拟host
id -13
alg straw2
hash 0
item osd.5 weight 1.00000 # 只有HDD
}

# 新增的独立root
root ssd_nodes {
id -200
alg straw2
hash 0
item ceph-ssdnode1 weight 1.00000
item ceph-ssdnode2 weight 1.00000
item ceph-ssdnode3 weight 1.00000
}

root hdd_nodes {
id -201
alg straw2
hash 0
item ceph-hddnode1 weight 1.00000
item ceph-hddnode2 weight 1.00000
item ceph-hddnode3 weight 1.00000
}

# 可以保留或删除原来的root default
root default {
# ... 可以保留,也可以删除
}

文本转换为 crush 格式

1
2
3
4
root@ceph-node1:/data/ceph# crushtool -c /data/ceph/crushmap-v1.txt -o crushmap-v2
root@ceph-node1:/data/ceph# ls
crushmap-v1 crushmap-v1.bak crushmap-v1.txt crushmap-v2

1.2.4 导入新的crush

导入的运行图会立即覆盖原有的运行图并立即生效。

1
2
root@ceph-node1:/data/ceph# ceph osd setcrushmap -i /data/ceph/crushmap-v2
37

1.2.5 验证运行图

1
2
3
4
5
6
root@ceph-node1:~# ceph osd crush rule dump | grep hot_data_rule
"rule_name": "hot_data_rule",
root@ceph-node1:~# ceph osd crush rule dump | grep ssd
"item_name": "default~ssd"
root@ceph-node1:~# ceph osd crush rule dump | grep hdd
"item_name": "default~hdd"

1.2.6 验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
root@ceph-node1:~# ceph osd pool create myssdpool 32 32 hot_data_rule
pool 'myssdpool' created
root@ceph-node1:~# ceph osd pool create myhddpool 32 32 cold_data_rule
pool 'myhddpool' created

# 机械盘 osd 3 4 5
root@ceph-node1:~# ceph pg ls-by-pool myhddpool | awk '{print $1,$2,$15}'
PG OBJECTS UP
11.0 0 [4,5,3]p4
11.1 0 [3,5,4]p3
11.2 0 [4,5,3]p4
11.3 0 [5,3,4]p5
11.4 0 [3,5,4]p3
11.5 0 [3,4,5]p3
11.6 0 [3,5,4]p3
11.7 0 [3,4,5]p3
11.8 0 [4,5,3]p4
11.9 0 [4,5,3]p4
11.a 0 [4,3,5]p4
11.b 0 [5,4,3]p5
11.c 0 [3,4,5]p3
11.d 0 [3,4,5]p3
11.e 0 [4,3,5]p4
11.f 0 [5,4,3]p5
11.10 0 [4,3,5]p4
11.11 0 [3,5,4]p3
11.12 0 [5,3,4]p5
11.13 0 [5,4,3]p5
11.14 0 [5,4,3]p5
11.15 0 [5,3,4]p5
11.16 0 [5,3,4]p5
11.17 0 [4,5,3]p4
11.18 0 [3,5,4]p3
11.19 0 [4,3,5]p4
11.1a 0 [3,5,4]p3
11.1b 0 [4,5,3]p4
11.1c 0 [5,4,3]p5
11.1d 0 [5,3,4]p5
11.1e 0 [5,3,4]p5
11.1f 0 [3,4,5]p3

* NOTE: afterwards

# ssd 盘 osd 0 1 2
root@ceph-node1:~# ceph pg ls-by-pool myssdpool | awk '{print $1,$2,$15}'
PG OBJECTS UP
10.0 0 [0,1,2]p0
10.1 0 [1,0,2]p1
10.2 0 [0,1,2]p0
10.3 0 [1,2,0]p1
10.4 0 [0,2,1]p0
10.5 0 [0,2,1]p0
10.6 0 [2,0,1]p2
10.7 0 [0,1,2]p0
10.8 0 [2,1,0]p2
10.9 0 [1,0,2]p1
10.a 0 [1,0,2]p1
10.b 0 [2,0,1]p2
10.c 0 [2,1,0]p2
10.d 0 [1,0,2]p1
10.e 0 [2,0,1]p2
10.f 0 [1,0,2]p1
10.10 0 [0,2,1]p0
10.11 0 [1,0,2]p1
10.12 0 [0,2,1]p0
10.13 0 [0,2,1]p0
10.14 0 [1,0,2]p1
10.15 0 [2,0,1]p2
10.16 0 [1,2,0]p1
10.17 0 [2,0,1]p2
10.18 0 [1,2,0]p1
10.19 0 [2,0,1]p2
10.1a 0 [2,0,1]p2
10.1b 0 [1,2,0]p1
10.1c 0 [0,1,2]p0
10.1d 0 [0,2,1]p0
10.1e 0 [2,1,0]p2
10.1f 0 [2,0,1]p2

Share 

 Previous post: GitLab-Pipeline Next post: ceph_cluster_maintenance 

© 2026 Hekang

Theme Typography by Makito

Proudly published with Hexo