rook-ceph的osd块存储权重数据迁移脚本
osd脚本
osd属于osd的存储池pool概念管理下,储存池默认三副本对应三个osd
要将osd不存储数据需要先把新的osd加入集群,有四块osd之后就可以进行旧osd下线操作,这个脚本只处理权重以及数据迁移的监控,下线以防万一还是手动执行避免误操作
进入到ceph-tools的pod中操作,将脚本放到/tmp下执行。
#!/bin/bash# 提示用户输入要操作的OSD盘号
read -p "请输入要调整的osd盘号(仅输入数字部分,例如0):" osd_num# 构建完整的OSD名称
osd_name="osd.$osd_num"echo "===== 调整前查看$osd_name的PG数量 ====="
initial_pg_count=$(ceph pg ls-by-osd $osd_name | grep -v ^PG | sed -e '/^$/d' -e '/^\*$/d' | awk '{print $1}' | grep '^[0-9]\+\.[0-9a-fA-F]\+$' | sort -u | wc -l)
echo "调整前$osd_name的PG数量:$initial_pg_count"echo -e "\n===== 设置$osd_name的权重为0 ====="
ceph osd crush reweight $osd_name 0echo -e "\n===== 验证$osd_name权重是否已设置为0 ====="
ceph osd tree | grep $osd_nameecho -e "\n===== 开始监控$osd_name的PG迁移进度(每10秒刷新一次,直到PG数量为0) ====="
current_pg_count=$initial_pg_count
interval=10 # 检查间隔时间(秒),可根据需要调整# 循环监控PG数量,直到为0
while [ $current_pg_count -gt 0 ]; do# 获取当前PG数量current_pg_count=$(ceph pg ls-by-osd $osd_name | grep -v ^PG | sed -e '/^$/d' -e '/^\*$/d' | awk '{print $1}' | grep '^[0-9]\+\.[0-9a-fA-F]\+$' | sort -u | wc -l)echo "$(date +'%Y-%m-%d %H:%M:%S') - 当前$osd_name的PG数量:$current_pg_count(剩余比例:$((current_pg_count * 100 / initial_pg_count))%)"# 如果PG数量不为0,等待指定间隔后再次检查if [ $current_pg_count -gt 0 ]; thensleep $intervalfi
doneecho -e "\n===== $osd_name的PG数量已降至0,数据迁移完成 ====="echo -e "\n===== 查看集群整体状态 ====="
ceph -s
执行案例
例如想把osd.0的盘下线,在有4块osd的基础上执行结果
在开始前查看osd的某个pg所在存储osd,执行脚本之后重新查看验证结果。
ceph pg dump | grep -E '^[0-9]+\.' | grep -v 'dumped all' | awk '{print "PG号:", $1, " 主存储OSD(ACTING_PRIMARY):", $20, " 所有存储OSD(ACTING):", $19}' | grep 9.6
具体执行时只需要输入osd的ID号即可
最后也可以通过命令看看osd下是否真的没有pg了,例如查看osd.0
ceph pg ls-by-osd osd.0 | grep -v ^PG | sed -e '/^$/d' -e '/^\*$/d' | awk '{print $1}' | grep '^[0-9]\+\.[0-9a-fA-F]\+$' | sort -u