进行 OSD 排障前,先检查一下 monitors 和网络。如果 ceph health 或 ceph -s 返回的是健康状态,这意味着 monitors 形成了法定人数。如果 monitor 还没达到法定人数、或者 monitor 状态错误,要先解决 monitor 的问题。核实下网络,确保它在正常运行,因为网络对 OSD 的运行和性能有显著影响。

2.1 收集 OSD 数据

开始OSD 排障的第一步最好先收集信息,如 ceph osd tree

ceph 日志

默认路径 /var/log/ceph,其他路径查看配置文件

管理套接字

列出节点上所有ceph 套接字:
ls /var/run/ceph 执行以下命令显示可用选项,将 {daemon-name}换成实际的守护进程,如
ceph daemon osd.1 help

I/O 统计工具

iostat -x

诊断信息

dmesg | grep scsidmesg | grep error

2.2 停止数据向外重新平衡

周期性维护,停机维护osd 让caush自动平衡停止:ceph osd set noout 维护好osd后,ceph osd unset noout

2.3 OSD没运行

OSD起不来

重启集群后,有osd启动不了,依次检查:

  • 配置文件
  • 检查路径:检查配置文件、osd数据、osd日志分区路径
  • 检查最大线程数:节点osd如果有很多,就回触碰到最大线程数限制,可通过 sysctl -w kernel.pid_max=4194303调大线程数,若解决,可通过修改/etc/sysctl.conf 中的kernel.pid_max永久生效
  • 内核版本
  • 段错误,提高日志级别查看详细

OSD失败

通过 ceph health detail查看
如果因磁盘或其他错误不能正常运行,将会在日志/var/log/ceph里输出一条错误信息
如果守护进程因心跳失败、或者底层核心文件系统无响应停止,查看dmesg获取硬盘或者内核错误

硬盘无剩余空间

ceph 不允许向满的osd 写入数据。mon osd full ratio 默认为0.95,达到0.95阻止写入,mon osd health ratio 默认0.85,0.85健康告警

  • 增加osd
  • 删除不需要的数据
  • 单独调整已满的osd 的near full 和full比例
ceph tell osd.id injectargs '--mon-osd-full-ratio .98'
ceph tell osd.id injectargs '--mon-osd-full-ratio 0.98
  • 调低 osd crush weight,使数据迁移
    ceph osd crush reweight osd.id {a-little-lower-weight-value}

2.4 OSD 龟速或无响应

网络问题

确保ceph 进程和依赖的进程在监听

netstat -alp|grep ceph

检查网络统计信息
netstat -s

驱动器配置

一个存储驱动器应该只用于一个osd,检查是否共用

扇区损坏/碎片化磁盘

检查磁盘是否有坏道/碎片

MON、OSD 共存

mon 频繁调用fsync(),会妨碍工作,特别是共享驱动器时。遭遇的性能问题可能有:

  • 较老的内核(低于3.0)
  • Argonaut 版运行在老的glibc上
  • 运行的内核不支持sysncfs(2)系统调用

进程共存

日志记录级别

osd限流

因osd速度过快影响性能

内核版本

内核与syncfs问题

文件系统问题

内存不足

建议 osd/1G 内存

2.5 震荡的OSD

如果 cluster(后端)网络失败、或出现了明显的延时,同时 public(前端)网络却运行良好, OSD 目前不能很好地处理这种情况。这时 OSD 们会向 monitor 报告邻居 down 了、同时报告自己是 up 的,我们把这种情形称为震荡( flapping )
如果有原因导致 OSD 震荡(反复地被标记为 down ,然后又 up ),你可以强制 monitor 停止这种震荡状态:

ceph osd set noup
ceph osd set nodown

这些标记记录在 osdmap 数据结构里:

ceph osd dump | grep flags
flags no-up,no-down

可用以下命令清楚标记:

ceph osd unset noup
ceph osd unset nodown