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 规则的故障域层级或权重实现。以下是详细操作步骤(以副本池为例):
一、前置准备
- 确认当前 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_num
或 weight
调整 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 倾斜
六、注意事项
- 避免副本不足:确保 Host A 的 OSD 数量满足池的副本要求(如
size=3
时,至少 3 个 OSD 在线)。 - 逐步调整:若首次修改,建议先小范围测试(如调整 1 个副本的优先级),观察集群稳定性。
- 回滚准备:若迁移后出现问题(如 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