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 reweightceph 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 | root@ceph-node1:~# ceph osd df |
1.2 crush运行图管理
通过工具将 ceph 的 crush 运行图导出并进行编辑,然后导入
1.2.1 导出 crush 运行图
**注:**导出的 crush 运行图为二进制格式,无法通过文本编辑器直接打开,需要使用crushtool 工具转换为文本格式后才能通过 vim 等文本编辑宫工具打开和编辑。
1 | root@ceph-node1:~# mkdir -p /data/ceph |
1.2.2 将运行图转换为文本
导出的运行图不能直接编辑,需要转换为文本格式再进行查看与编辑
1 | # 系统是ubuntu 24.04.3 系统算是新的 目前清华没有相关的源 |
1 | root@ceph-node1:/data/ceph# crushtool -d /data/ceph/crushmap-v1 > /data/ceph/crushmap-v1.txt |
1.2.3 将文本转换为 crush 格式
修改curshmap
混合节点
1 | root@ceph-node1:/data/ceph# cat crushmap-v1.txt |
ssd节点,hdd节点
1 | # 逻辑拆分 - 使用虚拟主机名 |
文本转换为 crush 格式
1 | root@ceph-node1:/data/ceph# crushtool -c /data/ceph/crushmap-v1.txt -o crushmap-v2 |
1.2.4 导入新的crush
导入的运行图会立即覆盖原有的运行图并立即生效。
1 | root@ceph-node1:/data/ceph# ceph osd setcrushmap -i /data/ceph/crushmap-v2 |
1.2.5 验证运行图
1 | root@ceph-node1:~# ceph osd crush rule dump | grep hot_data_rule |
1.2.6 验证
1 | root@ceph-node1:~# ceph osd pool create myssdpool 32 32 hot_data_rule |