跳转至

疑难病ceph恢复

概述

os版本:CentOS Linux release 7.9.2009

ceph版本:ceph version 14.2.19

问题:因ceph空间不足导致ceph故障;[空间问题,主要原因: 数据备份较多,较大~]

具体修复操作

  • 删除ceph上备份
  • 停止物理机、虚拟机上备份脚本
  • 停止所有物理机上img在ceph上的虚拟机
  • osd修复
  • pg修复
  • mds修复

osd修复

osd服务修复

部分osd因空间不足启动不了,新增磁盘,扩展lv

FILE_PATH="/home/virt_disk_cannot_delte/virtual_disk_loop5.img"
SIZE="10G"

# 1. 创建指定大小的虚拟磁盘文件
# echo "创建 ${SIZE} 文件..."
# fallocate -l $SIZE $FILE_PATH
# 优化后如下
echo "创建 ${SIZE} 虚拟磁盘文件: $FILE_PATH..."
if [ -f "$FILE_PATH" ]; then
    echo "警告:文件 $FILE_PATH 已存在,跳过创建"
else
    fallocate -l $SIZE $FILE_PATH || { echo "fallocate失败,尝试用dd创建"; dd if=/dev/zero of=$FILE_PATH bs=1G count=$(echo $SIZE | sed 's/G//') status=progress; }
fi

# 2. 将虚拟文件关联到空闲loop设备
echo "关联虚拟文件到loop设备..."
LOOP_DEVICE=$(sudo losetup -f --show $FILE_PATH)
echo "成功关联到loop设备: $LOOP_DEVICE"

# 3. 格式化 $LOOP_DEVICE
mkfs.xfs /dev/loop1 

# 4. 将loop设备加入Ceph卷组(VG)
# vgextend ceph-e5631d65-5fe4-4614-8a08-44eed1f87a57  /dev/loop0
vgextend ceph-e5631d65-5fe4-4614-8a08-44eed1f87a57 $LOOP_DEVICE
lvextend -l +100%FREE  /dev/ceph-e5631d65-5fe4-4614-8a08-44eed1f87a57/osd-block-7e8d315c-d164-46da-9d98-b78d49f9fcef

# 5. 执行BlueStore扩容,让Ceph识别新增空间
# 需要确认停止目标OSD(BlueStore扩容必须), 本次osd 就是stop状态
ceph-bluestore-tool bluefs-bdev-expand --path /var/lib/ceph/osd/ceph-0

# 6. 启动相应osd
systemctl start ceph-osd@2

# 7. 调整对应 osd 权重
ceph osd reweight 2 0.8

迁移优化

以下这些命令用于调整 Ceph OSD 的恢复行为和操作优先级,主要目的是平衡集群恢复速度与客户端正常读写的性能,尤其适用于集群处于恢复状态(如 OSD 故障后重建、扩容后数据均衡)时优化资源分配。

1
2
3
4
ceph config set osd osd_max_backfills 4
ceph config set osd osd_recovery_max_active 8
ceph config set osd osd_recovery_op_priority 4
ceph config set osd osd_client_op_priority 63
  1. ceph config set osd osd_max_backfills 4
  2. 含义:控制单个 OSD 同时处理的 “回填(backfill)” 操作数量(默认值通常为 1-2)。
  3. 作用:回填是指 OSD 被动接收其他 OSD 复制过来的数据(用于恢复冗余度)。设置为 4 表示每个 OSD 最多同时处理 4 个回填任务,避免过多回填占用网络 / IO 资源,影响客户端操作。
  4. ceph config set osd osd_recovery_max_active 8
  5. 含义:控制单个 OSD 主动发起的 “恢复(recovery)” 操作数量(默认值通常为 3-5)。
  6. 作用:恢复是指 OSD 主动向其他 OSD 复制数据以修复 PG 不一致。设置为 8 表示每个 OSD 最多主动发起 8 个恢复任务,数值越高恢复速度越快,但会占用更多资源。
  7. ceph config set osd osd_recovery_op_priority 4
  8. 含义:设置恢复操作的优先级(范围 1-63,默认通常为 3)。
  9. 作用:优先级数值越低,恢复操作在 OSD 处理队列中越靠后。设置为 4 表示恢复操作优先级较低,避免抢占客户端读写的资源,保证业务正常运行。
  10. ceph config set osd osd_client_op_priority 63
  11. 含义:设置客户端操作(如读写请求)的优先级(范围 1-63,63 为最高)。
  12. 作用:将客户端操作优先级设为最高(63),确保在恢复操作与客户端请求冲突时,优先处理用户业务,减少读写延迟。

pg修复

ceph pg deep-scrubceph pg repair 是 Ceph 中用于维护 PG(Placement Group,放置组)数据一致性的核心命令,前者用于深度检查数据完整性,后者用于修复已发现的不一致问题。以下是详细说明:

ceph pg deep-scrub <pg-id>:深度检查 PG 数据一致性

ceph pg repair <pg-id>:修复 PG 数据不一致

ceph pg dump | egrep "undersized|degraded|remapped|backfill_wait|inconsistent" | awk '{print "ceph pg deep-scrub "$1}' 
ceph pg dump | egrep "undersized|degraded|remapped|backfill_wait|inconsistent" | awk '{print "ceph pg repair "$1}'

mds修复

高危操作

本次已操作,但数据还在,之后不建议执行此操作~

ceph fs reset <fs-name> --yes-i-really-mean-it 是一个高风险操作,用于彻底重置指定的 Ceph 文件系统(此处为 gdsrmfs),会删除该文件系统的所有元数据、数据及相关配置。以下是详细说明:

命令作用

  • 完全删除指定文件系统(gdsrmfs)的元数据池(cephfs_metadata 相关)和数据池(cephfs_data 相关)。
  • 清除该文件系统关联的所有 MDS 配置(包括 rank、日志、缓存等)。
  • 不可逆操作:所有文件系统数据(文件、目录结构、权限等)将永久丢失,无法恢复。

执行前提

  1. 确保文件系统存在
# 确认目标文件系统名称正确
ceph fs ls | grep gdsrmfs  
  1. 卸载所有客户端挂载
# 在所有客户端执行(以 Linux 为例)
umount /path/to/mountpoint
  1. 停止相关 MDS 服务
1
2
3
4
# 查看关联的 MDS
ceph fs status gdsrmfs
# 停止对应 MDS(替换 {mds-name})
systemctl stop ceph-mds@{mds-name}.service

修复

  • 重启所有mds
systemctl restart ceph-mds@cephfs-0.service
  • 检查修复mds
ceph-journal-tool --rank=cephfs:0 journal repair

重置

命令 ceph-journal-tool --rank=cephfs:0 journal reset 用于重置 CephFS 中指定 MDS 实例(rank=cephfs:0)的元数据日志(journal)。这通常在 MDS journal 严重损坏、无法通过 repair 修复,或 journal 与元数据存储严重不一致时使用。

命令解析:

  • --rank=cephfs:0:指定目标 MDS 实例。cephfs 是文件系统名称,0 是 MDS 的 rank 编号(通常对应第一个 active MDS)。
  • journal reset:清空并重置 MDS 的 journal(会删除现有 journal 中的所有数据)。

使用前提与风险

  • 必须停止目标 MDS:操作前需确保对应 MDS 已停止,否则会导致数据损坏:
systemctl stop ceph-mds@cephfs-0.service  # 名称需与实际 MDS 实例匹配
  • 数据风险

重置 journal 会丢失其中未同步到元数据存储(RADOS 池)的操作记录,可能导致元数据不完整或不一致。操作前务必备份 MDS 数据目录(默认路径:/var/lib/ceph/mds/ceph-cephfs-0/)。

  • 适用场景

  • journal 损坏导致 MDS 无法启动(日志中提示 journal 格式错误、校验和失败等)。

  • ceph-journal-tool --rank=cephfs:0 journal repair 修复失败。

  • 具体操作:

# 名称需与实际 MDS 实例匹配
systemctl stop ceph-mds@cephfs-0.service
# 应显示目标 MDS 为 down 状态
ceph mds stat
# 确认无相关进程
ps aux | grep ceph-mds
# 执行重置命令:
ceph-journal-tool --rank=cephfs:0 journal reset
# 启动 MDS 后,它会自动从元数据存储(RADOS 中的 cephfs_metadata 池)同步最新状态,并重建 journal:
systemctl start ceph-mds@cephfs-0.service

# 验证修复结果
# 查看 MDS 状态
ceph mds stat  
# 检查集群健康
ceph health  
# 查看 MDS 日志(确认无 journal 相关错误)
tail -f /var/log/ceph/ceph-mds.cephfs-0.log

存储比例告警

  1. ceph osd set-full-ratio(对应配置项 mon_osd_full_ratio

  2. 默认值0.95(即 95%)。

  3. 作用:当 OSD(对象存储磁盘)的已用空间达到总容量的 95% 时,Ceph 会禁止客户端读写操作(集群进入 “只读” 或 “锁死” 状态),以此防止因磁盘空间耗尽导致数据丢失。此时集群无法正常提供服务,需紧急扩容或清理数据。

  4. ceph osd set-backfillfull-ratio(对应配置项 mon_osd_backfillfull_ratio

  5. 默认值0.90(即 90%)。

  6. 作用:当 OSD 已用空间超过 90% 时,Ceph 会暂停数据回填操作(如集群 Rebalance、故障恢复时的数据迁移)。这是 “存储满” 前的预警阶段 —— 若继续回填可能导致磁盘被写满,进而触发 full-ratio 锁死。需在此时扩容或清理数据,避免集群进入只读状态。

  7. ceph osd set-nearfull-ratio(对应配置项 mon_osd_nearfull_ratio

  8. 默认值0.85(即 85%)。

  9. 作用:当 OSD 已用空间达到 85% 时,Ceph 会发出 *“nearfull” 警告 *(集群状态 HEALTH WARN),提示 “存储池接近满阈值”。这是最早期的预警,需提前规划扩容或清理,防止后续触发 backfillfull-ratio(90%)和 full-ratio(95%)的更严重限制。

三个参数的递进关系

三者按 “预警→限制回填→锁死读写” 的顺序生效: nearfull-ratio (85%)backfillfull-ratio (90%)full-ratio (95%)

  • 达到 85%:警告 “快满了”;
  • 达到 90%:停止数据迁移(回填);
  • 达到 95%:彻底禁止客户端读写;

cephfs 最大文件

cephfs 支持的最大文件默认为1TB,虚拟机镜像1.5T,启动报错,权限不足;

CephFS可以配置最大文件大小,默认情况下为1TB,可以修改为更高,通过ceph fs set <fs name> max_file_size <size in bytes>

1
2
3
4
# 查看max_file_size
ceph fs get gdsrmfs | grep max_file_siz
# 把1099511627776 改为 3099511627776
ceph fs set gdsrmfs max_file_size 3099511627776

总结

  1. 使用空闲目录扩展ceph-osd-lv
  2. OSD 的恢复行为和操作优先级操作
  3. pg 检查修复
  4. ceph fs reset --yes-i-really-mean-it` 是一个高风险操作,勿操作
  5. mds修复和重建
  6. 存储比例告警
  7. cephfs 最大文件