ceph两台机器osd分布不均衡

ceph两台机器hostA和hostB

hostA 上有2个hdd,1个ssd

hostB上有2个hdd,其中一个hdd  down掉了,现有1个hdd

var值为负载均衡值,值越大说明跟其他的osd差异越大

 osd.3上的pg一直没有没有网另外3个硬盘上移动,经查发现问题

osd.3位于hostB上,只有一个这个osd,另外一个down掉的osd已经移除了。

ceph的crush规则配置故障域设置的为host,

 所以需要修改crush规则。修改如下

 

 

 

 

 

 

 

 

要修改 Ceph 的 CRUSH 规则以​​优先将 PG 分配到 Host A 的 OSD(0、1、4)​​,并降低 Host B(OSD 3 所在主机)的副本优先级,需通过调整 CRUSH 规则的故障域层级或权重实现。以下是详细操作步骤(以副本池为例):

​一、前置准备​

  1. ​确认当前 CRUSH 规则​​:
    查看当前生效的 CRUSH 规则名称(通常为 replicated_rule):
    ceph osd crush rule ls  # 输出类似:replicated_rule

​二、导出并解码 CRUSH 规则​

1. 导出当前 CRUSH 映射(二进制格式)

ceph osd getcrushmap -o crushmap.bin  # 导出到文件 crushmap.bin

2. 解码为可读的文本格式

使用 crushtool 解码二进制规则,便于编辑:

crushtool -d crushmap.bin -o crushmap-decoded.txt  # 生成可读文件

​三、修改 CRUSH 规则(关键步骤)​

编辑 crushmap-decoded.txt,找到需要调整的规则(如 replicated_rule),重点修改其 steps 部分,添加对 Host A 的偏好。以下是具体修改逻辑:

​场景:优先选择 Host A 的 OSD​

假设原规则通过 host 故障域分配副本,现在需让 Host A 的 OSD 在副本选择中更优先。

​原规则示例(部分)​​:

rule replicated_rule {
    id 0
    type replicated
    min_size 1
    max_size 10
    step take default
    step chooseleaf firstn 0 type host  # 原逻辑:选择任意 host
}

​修改后规则(优先 Host A)​​:
通过添加 child_numweight 调整 Host A 的优先级。例如,若 Host A 是更优存储位置,可强制副本优先选择它:

rule replicated_rule {
    id 0
    type replicated
    min_size 1
    max_size 10
    step take default
    # 新增步骤:优先选择 Host A(假设 Host A 的名称为 "host-a")
    step choose firstn 1 type host  # 选择 1 个 host(优先 Host A)
    step emit  # 输出选择的 host
    # 原逻辑调整为仅在 Host A 不可用时选择其他 host(可选)
    step chooseleaf firstn 0 type osd  # 从选中的 host 中选择 OSD
}

​更精细的权重调整(可选)​

若需通过权重控制(而非强制选择),可在 host 层级为 Host A 设置更高权重,Host B 设置更低权重。例如:

# 在 CRUSH 树的 host 层级调整权重(需找到对应的 host 定义)
host host-a {  # Host A 的名称(如实际为 "server-a")
    id -2           # 原始 ID(需与实际一致)
    weight 2.0      # 提高 Host A 的权重(默认 1.0,值越大越优先)
}

host host-b {  # Host B 的名称(如实际为 "server-b")
    id -3           # 原始 ID(需与实际一致)
    weight 0.5      # 降低 Host B 的权重(原 1.0)
}

​四、重新编译并应用新规则​

1. 编译修改后的规则(文本转二进制)

crushtool -c crushmap-decoded.txt -o new-crushmap.bin  # 生成新的二进制规则

2. 应用新规则到集群

ceph osd setcrushmap -i new-crushmap.bin  # 加载新规则

​五、验证规则生效​

1. 确认规则已更新

ceph osd crush rule dump replicated_rule  # 查看规则详情(确认 steps 已修改)

2. 观察 PG 迁移趋势

ceph osd df tree  # 查看 Host A(host-a)和 Host B(host-b)的 OSD 使用率变化
ceph pg dump | grep -E 'host-a|host-b'  # 查看 PG 是否向 Host A 倾斜

​六、注意事项​

  1. ​避免副本不足​​:确保 Host A 的 OSD 数量满足池的副本要求(如 size=3 时,至少 3 个 OSD 在线)。
  2. ​逐步调整​​:若首次修改,建议先小范围测试(如调整 1 个副本的优先级),观察集群稳定性。
  3. ​回滚准备​​:若迁移后出现问题(如 PG degraded),可通过以下命令回滚规则:
    ceph osd setcrushmap -i crushmap.bin  # 恢复原规则(需提前备份 crushmap.bin)

通过以上步骤,CRUSH 算法会优先将 PG 分配到 Host A 的 OSD(0、1、4),从而触发 OSD 3 上的 PG 迁移,最终实现负载均衡。

 

 

crush详解 https://cloud.tencent.com/developer/article/1978160

posted @ 2025-06-06 15:16  mofy  阅读(27)  评论(0)    收藏  举报