1
2
3
4
5
6
7
作者:李晓辉

联系方式:

1. 微信:Lxh_Chat

2. 邮箱:939958092@qq.com

识别问题

在对 Ceph 问题进行故障排除时,第一步要确定是哪个 Ceph 组件造成了问题。有时,你可以在 ceph health detailceph health status 命令提供的信息中找到这一组件

以下故障排除检查清单推荐了后续步骤:

  • 确定导致问题的 Ceph 组件。

  • 为确定的组件设置调试日志并查看日志。

  • 验证你的配置受到支持。

  • 确定操作是速度缓慢还是卡滞不动。

集群运行状况故障排除

当运行状况检查失败时,集群运行状况会变为 HEALTH_WARNHEALTH_ERR

ceph statusceph health 命令可显示集群的运行状况。当集群运行状况为 HEALTH_WARNHEALTH_ERR 时,可使用 ceph health detail 命令来查看运行状况检查消息,以便你可以开始对问题进行故障排除。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[root@serverc ~]# ceph status
cluster:
id: 2ae6d05a-229a-11ec-925e-52540000fa0c
health: HEALTH_WARN
1 stray daemon(s) not managed by cephadm
noscrub,nodeep-scrub flag(s) set
1 pool(s) do not have an application enabled

services:
mon: 4 daemons, quorum serverc.lab.example.com,clienta,serverd,servere (age 70s)
mgr: serverc.lab.example.com.aiqepd(active, since 3h), standbys: serverd.klrkci, servere.kjwyko, clienta.nncugs
osd: 11 osds: 10 up (since 51m), 10 in (since 56m)
flags noscrub,nodeep-scrub
rgw: 2 daemons active (2 hosts, 1 zones)

data:
pools: 6 pools, 137 pgs
objects: 482 objects, 1.0 GiB
usage: 3.4 GiB used, 97 GiB / 100 GiB avail
pgs: 137 active+clean

[root@serverc ~]# ceph health
HEALTH_WARN 1 stray daemon(s) not managed by cephadm; noscrub,nodeep-scrub flag(s) set; 1 pool(s) do not have an application enabled
[root@serverc ~]# ceph health detail
HEALTH_WARN 1 stray daemon(s) not managed by cephadm; noscrub,nodeep-scrub flag(s) set; 1 pool(s) do not have an application enabled
[WRN] CEPHADM_STRAY_DAEMON: 1 stray daemon(s) not managed by cephadm
stray daemon osd.10 on host clienta.lab.example.com not managed by cephadm
[WRN] OSDMAP_FLAGS: noscrub,nodeep-scrub flag(s) set
[WRN] POOL_APP_NOT_ENABLED: 1 pool(s) do not have an application enabled
application not enabled on pool 'testpool'
use 'ceph osd pool application enable <pool-name> <app-name>', where <app-name> is 'cephfs', 'rbd', 'rgw', or freeform for custom applications.

忽略 Ceph 运行状况警报

已经知道相关警告并且当前不需要修复它们时可以忽略,例如,如果你关闭 OSD 以进行维护,则集群会报告 HEALTH_WARN 状态。你可忽略此警告消息,以避免运行状况检查影响报告的整体状态。

要忽略运行状况警报消息,请使用 ceph health 命令。

1
2
3
4
5
6
7
8
[root@serverc ~]# ceph health detail
HEALTH_WARN 1 stray daemon(s) not managed by cephadm; noscrub,nodeep-scrub flag(s) set; 1 pool(s) do not have an application enabled
[WRN] CEPHADM_STRAY_DAEMON: 1 stray daemon(s) not managed by cephadm
stray daemon osd.10 on host clienta.lab.example.com not managed by cephadm
[WRN] OSDMAP_FLAGS: noscrub,nodeep-scrub flag(s) set
[WRN] POOL_APP_NOT_ENABLED: 1 pool(s) do not have an application enabled
application not enabled on pool 'testpool'
use 'ceph osd pool application enable <pool-name> <app-name>', where <app-name> is 'cephfs', 'rbd', 'rgw', or freeform for custom applications.

忽略一下POOL_APP_NOT_ENABLED这个警告

1
2
3
4
5
6
7
8
9
[root@serverc ~]# ceph health mute POOL_APP_NOT_ENABLED
[root@serverc ~]# ceph health detail
HEALTH_WARN 1 stray daemon(s) not managed by cephadm; noscrub,nodeep-scrub flag(s) set; (muted: POOL_APP_NOT_ENABLED)
[WRN] CEPHADM_STRAY_DAEMON: 1 stray daemon(s) not managed by cephadm
stray daemon osd.10 on host clienta.lab.example.com not managed by cephadm
[WRN] OSDMAP_FLAGS: noscrub,nodeep-scrub flag(s) set
(MUTED) [WRN] POOL_APP_NOT_ENABLED: 1 pool(s) do not have an application enabled
application not enabled on pool 'testpool'
use 'ceph osd pool application enable <pool-name> <app-name>', where <app-name> is 'cephfs', 'rbd', 'rgw', or freeform for custom applications.

当你忽略某条运行状况消息时,如果运行状况进一步降级,Ceph 会自动取消忽略相应警报。例如,如果你的集群报告一个 OSD 停机,而你将忽略了该警报,则又有 OSD 停机时,Ceph 会自动取消忽略警告。可测量的运行状况警报不可忽略。

配置日志记录

可为集群中的每个子系统设置不同的日志记录级别。调试级别的范围为 1 到 20,其中 1 表示简洁,20 表示详细。

Ceph 不会将基于内存的日志发送到输出日志,除非遇到以下情况:

  • 引发致命信号。

  • 触发代码中的断言。

  • 你提出了此要求。

要为输出日志级别和内存级别使用不同的调试级别,需使用斜杠 (/) 字符。例如,debug_mon = 1/5 表示将 ceph-mon 守护进程的输出日志级别设置为 1 ,将其内存日志级别设置为 5

临时修改

1
2
3
4
5
6
7
8
9
[root@serverc ~]# ceph tell osd.0 config set debug_ms 1/5
{
"success": ""
}
[root@serverc ~]# ceph tell osd.0 config get debug_ms
{
"debug_ms": "1/5"
}

永久修改

1
2
3
[root@serverc ~]# ceph config set osd.0 debug_ms 1/5
[root@serverc ~]# ceph config get osd.0 debug_ms
1/5

设置日志文件轮转

在默认位置 /var/log/ceph 下查看 Ceph 日志文件

可通过修改 /etc/logrotate.d/ceph 处的日志轮转配置来加快日志轮转。Cron 作业调度程序使用此文件来调度日志轮转。

参考以下例子

1
2
3
4
5
rotate 7
weekly
size size
compress
sharedscripts

将其放入crontab

1
30 * * * * /usr/sbin/logrotate /etc/logrotate.d/ceph >/dev/null 2>&1

处理 Cephx

默认情况下,所有 Ceph 命令都使用 client.admin 用户进行身份验证,但你可以通过使用 --name--id 选项来指定用户名或用户 ID。

Cephx 的问题通常涉及以下方面:

  • 密钥环或 ceph.conf 文件权限不正确。

  • 缺少密钥环和 ceph.conf 文件。

  • 给定用户的 cephx 权限错误或无效。使用 ceph auth list 命令来确定问题。

  • 用户名错误或拼写不正确,这也可以使用 ceph auth list 命令来验证。

Ceph监视器故障排除

mon.X 停机(超出仲裁)

如果 Ceph MON 守护进程未在运行,则有错误阻止了守护进程的启动。

时钟偏移

此错误消息表示 MON 的时钟可能没有同步。mon_clock_drift_allowed 参数可控制集群在显示警告消息之前允许的最大时钟偏差。

Ceph OSDs故障处理

以下是最常见的 Ceph OSD 错误消息列表:

full osds

当集群达到 mon_osd_full_ratio 参数设置的容量时,Ceph 将返回 HEALTH_ERR full osds 消息。默认情况下,此参数设置为 0.95,即集群容量的 95%。

使用 ceph df 命令可确定已用原始存储的百分比,由 %RAW USED 列给出。如果原始存储的百分比超过 70%,则你可删除不必要的数据,或通过添加新的 OSD 节点来缩减集群。

nearfull osds

当集群达到 mon_osd_nearfull_ratio 参数设置的容量时,Ceph 将返回 nearfull osds 消息。默认情况下,此参数设置为 0.85,即集群容量的 85%。

出现此警告消息的主要原因有:

  • OSD 在集群中的 OSD 节点之间不均衡。

  • 根据 OSD 的数量、用例、每个 OSD 的目标 PG 数以及 OSD 使用量,放置组的数量不正确。

  • 集群使用了不适当的 CRUSH 可调项。

  • OSD 的后端存储几乎已满。

对此问题进行故障排除:

  • 验证 PG 数是否足够。

  • 验证你是否使用了针对集群版本优化的 CRUSH 可调项;如果没有,则进行调整。

  • 根据利用率更改 OSD 的权重。

  • 确定 OSD 使用的磁盘上有多少剩余空间。

osds are down

当 OSD 停机或抖动时,Ceph 会返回 osds are down 消息。出现此消息的主要原因是由于潜在故障或与其他 OSD 联网问题,其中一个 ceph-osd 进程不可用。