2. 常见 OSD 故障处理
进行 OSD 排障前,先检查一下 monitors 和网络。如果 ceph health
或 ceph -s
返回的是健康状态,这意味着 monitors 形成了法定人数。如果 monitor 还没达到法定人数、或者 monitor 状态错误,要先解决 monitor 的问题。核实下你的网络,确保它在正常运行,因为网络对 OSD 的运行和性能有显著影响。
2.1 收集 OSD 数据
开始 OSD 排障的第一步最好先收集信息,另外还有监控 OSD 时收集的,如 ceph osd tree
。
Ceph 日志
如果你没改默认路径,可以在 /var/log/ceph
下找到 Ceph 的日志:
ls /var/log/ceph
如果看到的日志还不够详细,可以增大日志级别。请参考[1.12 日志和调试],查阅如何保证看到大量日志又不影响集群运行。
管理套接字
用管理套接字工具检索运行时信息。列出节点上所有 Ceph 套接字:
ls /var/run/ceph
然后,执行下例命令显示可用选项,把 {daemon-name}
换成实际的守护进程(如 osd.0 ):
ceph daemon osd.0 help
或者,你也可以指定一个 {socket-file}
(如 /var/run/ceph
下的文件):
ceph daemon {socket-file} help
和其它手段相比,管理套接字允许你:
- 在运行时列出配置
- 列出历史操作
- 列出操作的优先队列状态
- 列出在进行的操作
- 列出性能计数器
显示可用空间
可能会引起文件系统问题。用 df
命令显示文件系统的可用空间。
df -h
其它用法见 df --help
。
I/O 统计信息
用 iostat
工具定位 I/O 相关问题。
iostat -x
诊断信息
要查看诊断信息,配合 less
、 more
、 grep
或 tail
使用 dmesg
,例如:
dmesg | grep scsi
2.2 停止数据向外重平衡
你得周期性地对集群的子集进行维护,或解决某个故障域的问题(如某个机架)。如果你不想在停机维护 OSD 时让 CRUSH 自动重均衡,首先设置集群的 noout
标志:
ceph osd set noout
设置了 noout 后,你就可以停机维护失败域内的 OSD 了。
stop ceph-osd id={num}
注意:在定位某故障域内的问题时,停机的 OSD 内的 PG 状态会变为 degraded
。
维护结束后,重启 OSD 。
start ceph-osd id={num}
最后,解除 noout
标志。
ceph osd unset noout
2.3 OSD 没运行
通常情况下,简单地重启 ceph-osd
进程就可以让它重回