Ceph OSD故障排除|万字经验总结
1.1. 与OSD相关的最常见错误消息
下表列出了ceph health detail
命令返回或包含在Ceph日志中的最常见错误消息。
与OSD相关的错误消息
Error message | state |
---|---|
| HEALTH_ERR |
| HEALTH_WARN |
| HEALTH_WARN |
| HEALTH_WARN |
| HEALTH_WARN |
与OSD相关的Ceph日志中的常见错误消息
Error message | Log file |
---|---|
| Main cluster log |
| Main cluster log |
| Main cluster log |
| OSD log |
| OSD log |
1.1.1. Full OSDs
ceph health detail
命令返回类似于以下内容的错误消息:
HEALTH_ERR 1 full osds
osd.3 is full at 95%
这意味着什么:
Ceph可防止客户端在整个OSD节点上执行I/O操作,以避免丢失数据。HEALTH_ERR full osds
当集群达到mon_osd_full_ratio
参数设置的容量时,它将返回消息。默认情况下,此参数设置为0.95即
95%的集群容量。
解决方式:
确定存储使用的百分比(%RAW USED
):
# ceph df
如果%RAW USED
超过70-75%,你可以:
删除不必要的数据,这是避免生产停止的短时间的解决方案。有关详细信息,请参见第1.6部分“从完整集群中删除数据”。
通过添加新的OSD节点来扩展集群。
1.1.2. Nearfull OSDs
ceph health detail
命令返回类似于以下内容的错误消息:
osd.2 is near full at 85%
这意味着什么:
nearfull osds
当集群达到mon osd nearfull ratio defaults
参数设置的容量时,Ceph返回消息。默认情况下,此参数设置为0.85
占集群容量的85%。
Ceph以最佳方式分配基于CRUSH层次结构的数据,但不能保证完全平均分配。数据分布不均匀和nearfull osds
消息的主要原因是:
OSD在集群中的OSD节点之间不平衡。也就是说,一些OSD节点承载的数据明显多于其他OSD节点,或者CRUSH映射中某些OSD的权重不足以满足其容量。
根据OSD的数量,用例,每个OSD的目标PG和OSD利用率,放置组(PG)数目不正确。
集群使用不适当的CRUSH可调参数。
OSD的后端存储空间几乎已满。
解决方式:
1. 验证PG数目是否足够,并在需要的时候增加它。
2. 验证您是否使用对集群版本最佳的CRUSH可调参数,如果不是则调整它们。
3 .按利用率更改OSD的权重。
4. 确定OSD使用的磁盘上剩余的空间。
a. 查看OSD使用的空间大小:
#ceph osd df
b. 查看OSD在特定节点上使用的空间大小。使用包含nearful
OSD 的节点中的以下命令:
$ df -h
c. 如果需要,请添加新的OSD节点。
1.1.3. 一个或多个OSD Down掉
运行ceph health
命令返回类似于以下错误:
这意味着什么:
ceph-osd
由于可能的服务故障或与其他OSD通信的问题, 其中一个进程不可用。结果,幸存的ceph-osd
守护进程向监视器mon报告了此失败。
如果ceph-osd
守护程序未运行,则基础OSD驱动器或文件系统已损坏,或者某些其他错误(例如缺少密钥环keyring)阻止守护程序启动。
在大多数情况下,网络问题会导致ceph-osd
守护程序运行但仍标记为的情况down
。
解决方式:
1. 确定哪个OSD是down
:
#ceph health detail
HEALTH_WARN 1/3 in osds are down
osd.0 is down since epoch 23, last address 192.168.106.220:6800/11080
2. 尝试重新启动ceph-osd
守护程序:
systemctl restart ceph-osd@<OSD-number>
替换<OSD-number>
为OSD的ID down
,例如:
#systemctl restart ceph-osd@0
a.如果您无法启动ceph-osd
,请按照下列步骤的ceph-osd
守护进程无法启动。
b.如果您能够启动ceph-osd
,但是它被标记为down
,请去掉标记n
。
该ceph-osd
守护程序无法启动
1. 如果你的节点包含多个OSD(通常多于12个),请验证默认的最大线程数(PID数)是否足够。。
2. 验证OSD数据和日志journal分区是否正确:
... /dev/vdb :
/dev/vdb1 ceph data, prepared
/dev/vdb2 ceph journal
/dev/vdc :
/dev/vdc1 ceph data, active, cluster ceph, osd.1, journal /dev/vdc2
/dev/vdc2 ceph journal, for /dev/vdc1
/dev/sdd1 :
/dev/sdd1 ceph data, unprepared
/dev/sdd2 ceph journal
使用ceph-disk 查看磁盘状态,已经安装的分区标记为active,但
如果是分区prepared
,请安装它。
3. 如果您收到ERROR: missing keyring, cannot use cephx for authentication
错误消 息,则OSD是缺少keyring认证。
4. 如果收到ERROR: unable to open OSD superblock on /var/lib/ceph/osd/ceph-1
错
误消息,则ceph-osd
守护程序无法读取基础文件系统。
5. 检查相应的日志文件以确定失败的原因。默认情况下,Ceph将日志文件存储在/var/log/ceph/
目
录中。
a. 一个EIO
类似下面的一个错误消息表示基础磁盘的故障:
要解决此问题,请更换基础OSD磁盘。
b. 如果日志包含任何其他FAILED assert
错误(例如以下错误),请详细查看日志。
6. 检查系统dmesg日志
输出以查找基础文件系统或磁盘的错误:
a. 类似于以下error -5
错误消息表示底层XFS文件系统的损坏。
xfs_log_force: error -5 returned
b. 如果dmesg
输出包含任何SCSI error
错误消息,则查看磁盘物理连接情况。
c. 或者,如果您无法修复基础文件系统,请更换OSD驱动器。
7.如果OSD出现分段故障(如下所示),则查看详细的启动情况。
Caught signal (Segmentation fault)在ceph-osd
正在运行,但仍标记为down
1. 检查相应的日志文件以确定失败的原因。默认情况下,Ceph将日志文件存储在/var/log/ceph/
目录
中。
a. 如果日志包含类似于以下内容的错误消息,请参见第1.1.4节“Flapping OSDs””。
wrongly marked me downheartbeat_check: no reply from osd.2 since back
1.1.4. Flapping抖动OSD
ceph -w | grep osds
命令显示的OSD在短时间内反复up与down:
# ceph -w | grep osds
2017-04-05 06:27:20.810535 mon.0 [INF] osdmap e609: 9 osds: 8 up, 9 in
2017-04-05 06:27:24.120611 mon.0 [INF] osdmap e611: 9 osds: 7 up, 9 in
2017-04-05 06:27:25.975622 mon.0 [INF] HEALTH_WARN; 118 pgs stale; 2/9 in osds are down
2017-04-05 06:27:27.489790 mon.0 [INF] osdmap e614: 9 osds: 6 up, 9 in
2017-04-05 06:27:36.540000 mon.0 [INF] osdmap e616: 9 osds: 7 up, 9 in
2017-04-05 06:27:39.681913 mon.0 [INF] osdmap e618: 9 osds: 8 up, 9 in
2017-04-05 06:27:43.269401 mon.0 [INF] osdmap e620: 9 osds: 9 up, 9 in
2017-04-05 06:27:54.884426 mon.0 [INF] osdmap e622: 9 osds: 8 up, 9 in
2017-04-05 06:27:57.398706 mon.0 [INF] osdmap e624: 9 osds: 7 up, 9 in
2017-04-05 06:27:59.669841 mon.0 [INF] osdmap e625: 9 osds: 6 up, 9 in
2017-04-05 06:28:07.043677 mon.0 [INF] osdmap e628: 9 osds: 7 up, 9 in
2017-04-05 06:28:10.512331 mon.0 [INF] osdmap e630: 9 osds: 8 up, 9 in
2017-04-05 06:28:12.670923 mon.0 [INF] osdmap e631: 9 osds: 9 up, 9 in
此外,Ceph日志包含类似于以下内容的错误消息:
2016-07-25 03:44:06.510583 osd.50 127.0.0.1:6801/149046 18992 : cluster [WRN] map e600547 wrongly marked me down
2016-07-25 19:00:08.906864 7fa2a0033700 -1 osd.254 609110 heartbeat_check: no reply from osd.2 since back 2016-07-25 19:00:07.444113 front 2016-07-25 18:59:48.311935 (cutoff 2016-07-25 18:59:48.906862)这意味着什么:
找出OSD反复flapping的主要原因:
某些集群操作(例如清理或恢复)会花费异常的时间,例如,如果您对具有大索引或大型放置组的对象执行这些操作。通常,在这些操作完成之后,flapping osd问题会解决。
底层物理硬件的问题。在这种情况下,该
ceph health detail
命令也会返回slow requests
错误消息。网络问题。
当公共(前端)网络以最佳方式运行时,如果集群(后端)网络出现故障或显着延迟时,OSD则会无法很好地处理这种情况。
OSD使用集群网络相互发送心跳包以通知它们是up
和in状态
。如果集群网络无法正常工作,则OSD无法发送和接收心跳包。因此,他们互相报告为down状态
,同时将自己标记为up
。
Ceph配置文件中的以下参数会影响此行为:
Parameter | Description | Default value |
---|---|---|
| 在报告OSD | 20 seconds |
| 在监视器将OSD标记 为Down之前,有多少OSD必须报告另一个OSD | 1 |
| 在监视器将OSD标记 为Down之前,必须报告OSD的Down次数 | 3 |
此表显示在默认配置中,mon标记OSD,就down
好像只有一个OSD制作了关于第一个OSD的三个不同报告down
。在某些情况下,如果一个主机遇到网络问题,整个集群可能会遇到抖动的OSD。这是因为驻留在主机上的OSD将报告集群中的其他OSD down
。
解决方式:
1. ceph health detail
再次 检查命令的输出。如果它包含slow requests
错误消息,请参见1.1.5 部分“Slow Requests, and Requests are Blocked”,以获取有关如何解决此问题的详细信息。
HEALTH_WARN 30 requests are blocked > 32 sec; 3 osds have slow requests
30 ops are blocked > 268435 sec
1 ops are blocked > 268435 sec on osd.11
1 ops are blocked > 268435 sec on osd.18
28 ops are blocked > 268435 sec on osd.39
3 osds have slow requests
2. 确定哪些OSD被标记为down
以及它们在哪些节点上:
3. 在包含拍打OSD的节点上,排除故障并修复任何网络问题。
4.或者,您可以临时强制标记osd为noup,nodown:
# ceph osd set noup# ceph osd set nodown
注意:使用noup
和nodown
标志不能从根本上解决问题,只能防止OSD抖动。
1.1.5. Slow Requests, and Requests are Blocked
该ceph-osd
守护进程是缓慢的,以响应请求和ceph health detail
命令返回类似于以下之一的错误消息:
30 ops are blocked > 268435 sec
1 ops are blocked > 268435 sec on osd.11
1 ops are blocked > 268435 sec on osd.18
28 ops are blocked > 268435 sec on osd.39
3 osds have slow requests
此外,Ceph日志包含类似于以下内容的错误消息:
2016-07-25 03:44:06.510583 osd.50 [WRN] slow request 30.005692 seconds old, received at {date-time}: osd_op(client.4240.0:8 benchmark_data_ceph-1_39426_object7 [write 0~4194304] 0.69848840) v4 currently waiting for subops from [610]
这意味着什么:
每个具有慢请求的OSD,其不能在由osd_op_complaint_time
参数定义的时间内服务队列中的每秒I/O操作(IOPS)。默认情况下,此参数设置为30秒。
OSD请求缓慢的主要原因是:
底层硬件的问题,例如磁盘驱动器,主机,机架或网络交换机。
网络问题。这些问题通常与flapping OSD有关。
系统负载。
下表显示了慢速请求的类型。使用dump_historic_ops
administration socket命令确定慢速请求的类型。
Slow request type | Description |
---|---|
| OSD正在等待获取操作的放置组pg的锁定。 |
| OSD正在等待副本OSD将操作应用于日志。 |
| OSD没有达到任何重大操作点要求。 |
| OSD尚未复制指定次数的对象。 |
解决方式:
1. 确定具有慢速或块请求的OSD是否共享一个共同的硬件,例如磁盘驱动器,主机,机架或网络交换机。
2. 如果OSD共享磁盘:
a. 使用该smartmontools工具
检查磁盘或日志的运行状况以确定磁盘上的任何错误。
注意:该smartmontools
实用程序包含在smartmontools
包中。
b. 使用该iostat命令
获取%iowai,
OSD磁盘上的I/O等待报告(%iowai
) 可以确定磁盘是否处于高负载状态。
注意:该iostat工具
包含在sysstat
包中。
3. 如果OSD在同一主机上:
a. 检查RAM和CPU利用率
b. 使用该netstat
实用程序可以查看网络接口控制器(NIC)上的网络统计信息,并解决任何网络问题。
4. 如果OSD在同一机架,请检查机架的网络交换机。例如,如果使用巨型帧,请验证路径中的NIC是否设置了巨型帧。
1.2. Stopping and Starting Rebalancing
当OSD失败或人为停止时,CRUSH算法会自动启动重新平衡过程,以在剩余的OSD中重新分配数据。
重新平衡可能需要些时间和资源,因此,请在故障排除或维护OSD期间停止数据重新平衡。为此,请在停止OSD之前设置noout标志:
# ceph osd set noout完成故障排除或维护后,取消设置noout
标志以开始重新平衡:
1.3. 安装OSD数据分区
如果未正确配置OSD数据分区,则ceph-osd
守护程序无法启动。如果发现未按预期配置分区,请按照以下的步骤进行安装。
过程:安装OSD数据分区
1. 挂载分区:
# mount -o noatime <partition> /var/lib/ceph/osd/<cluster-name>-<osd-number>替换<partition>
为专用于OSD数据的OSD驱动器上的分区路径。指定集群名称和OSD编号,例 如:# mount -o noatime/dev/sdd1 /var/lib/ceph/osd/ceph-0
2. 尝试启动失败的ceph-osd
守护程序:
替换为<OSD-number>
OSD的ID,例如:
1.4. 更换OSD驱动器
Ceph专为容错而设计,这意味着它可以在degraded
不丢失数据的状态下运行。因此,即使数据存储驱动器发生故障,Ceph也可以运行。在驱动器出现故障的情况下,degraded
状态意味着存储在其他OSD上的额外数据副本将自动回填到集群中的可用OSD。但是,如果发生这种情况,请更换发生故障的OSD驱动器并手动重新创建OSD。
当驱动器发生故障时,Ceph会将OSD报告为down
:
osd.0 is down since epoch 23, last address 192.168.106.220:6800/11080
注意
Ceph将OSD标记down可能由网络故障或者权限等原因造成的
。
现代服务器通常使用热插拔驱动器进行部署,因此您可以在不关闭节点的情况下拉出故障驱动器并将其替换为新驱动器。整个过程包括以下步骤:
1. 从Ceph集群中删除OSD。
2. 更换驱动器。
3. 将OSD添加到集群。
在开始之前
1. 确定Down掉的OSD:
# ceph osd tree | grep -i downID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY
0 0.00999 osd.0 down 1.00000 1.00000
2. 使用如下命令,确认OSD服务已经停止:
# systemctl status ceph-osd@<OSD-number>替换<OSD-number>
为标记为的OSD的ID down
,例如:
...
Active: inactive (dead)
过程: 从Ceph集群中删除OSD
1. 标记OSD为out:
# ceph osd out osd.<OSD-number>替换<OSD-number>
为标记为的OSD的ID down
,例如:
# ceph osd out osd.0
marked out osd.0.
注意:如果OSD是down
,Ceph在没有从OSD接收任何心跳包的900秒后自动将其标记为out。发生 这种情况时,其他带有失败OSD数据副本的OSD开始回填,以确保集群中存在所需的副本数量。当集群回填时,集群将处于某种degraded
状态。
2. 确保失败的OSD正在回填。输出将包括类似于以下内容的信息:
# ceph -w | grep backfill
2017-06-02 04:48:04.414397 mon.0 [INF] pgmap v10293283: 431 pgs: 2 active+undersized+degraded+remapped+backfilling, 75 active+undersized+degraded+remapped+wait_backfill, 59 stale+active+clean, 295 active+clean; 72347 MB data, 101398 MB used, 1623 GB / 1722 GB avail; 969 kB/s rd, 6778 B/s wr, 32 op/s; 10626/35917 objects degraded (29.585%); 10580/35917 objects misplaced (29.457%); 125 MB/s, 31 objects/s recovering
2017-06-02 04:48:00.380063 osd.1 [INF] 0.6f starting backfill to osd.0 from (0'0,0'0] MAX to 2521'166639
2017-06-02 04:48:00.380139 osd.1 [INF] 0.48 starting backfill to osd.0 from (0'0,0'0] MAX to 2513'43079
2017-06-02 04:48:00.380260 osd.1 [INF] 0.d starting backfill to osd.0 from (0'0,0'0] MAX to 2513'136847
2017-06-02 04:48:00.380849 osd.1 [INF] 0.71 starting backfill to osd.0 from (0'0,0'0] MAX to 2331'28496
2017-06-02 04:48:00.381027 osd.1 [INF] 0.51 starting backfill to osd.0 from (0'0,0'0] MAX to 2513'87544
3. 从CRUSH MAP中删除OSD:
# ceph osd crush remove osd.<OSD-number>替换<OSD-number>
为标记为的OSD的ID down
,例如:
removed item id 0 name 'osd.0' from crush map
4. 删除与OSD相关的身份验证密钥:
# ceph auth del osd.<OSD-number>替换<OSD-number>
为标记为的OSD的ID down
,例如:
updated
5. 从Ceph存储集群中删除OSD:
# ceph osd rm osd.<OSD-number>替换<OSD-number>
为标记为的OSD的ID down
,例如:
removed osd.0
如果已成功删除OSD,则以下命令的输出中不存在对应的OSD:
# ceph osd tree6. 卸载发生故障的驱动器:
# umount /var/lib/ceph/osd/<cluster-name>-<OSD-number>指定集群的名称和OSD的ID,例如:
# umount /var/lib/ceph/osd/ceph-0/如果已成功卸载驱动器,则它不会出现在以下命令的输出中:
# df -h过程:更换物理驱动器
1.有关更换物理驱动器的详细信息。
a.如果您使用Ansible部署集群,请ceph-ansible
再次从Ceph管理服务器运行该手册:
b.如果手动添加OSD,请确认每一步完整。
2.当驱动器出现在/dev/目录下时,请记下驱动路径。
3.如果要手动添加OSD,请找到OSD驱动器并格式化磁盘。
过程: 将OSD添加到Ceph集群
1. 再次添加OSD.
a. 如果您使用Ansible部署集群,请ceph-ansible
再次从Ceph管理服务器运行该手册:
b. 如果手动添加OSD,请确认每一步完整。
2.确保CRUSH层次结构准确:
# ceph osd tree
3.如果您对CRUSH层次结构中OSD的位置不满意,请将OSD移动到所需位置:
ceph osd crush move <bucket-to-move> <bucket-type>=<parent-bucket>例如,要将位于sdd:row1
根桶的桶移动到根桶:
1.5. Increasing the PID count
如果你的节点包含超过12个Ceph OSD,则默认的最大线程数(PID数目)可能不足,尤其是在恢复期间。因此,一些ceph-osd
守护进程可能会终止并无法再次启动。如果发生这种情况,请增加允许的最大线程数。
临时增加数量:
# sysctl -w kernel.pid.max=4194303
永久增加数量,请/etc/sysctl.conf
按如下方式添加配置:
1.6. 从完整集群中删除数据
Ceph自动阻止对达到mon_osd_full_ratio
参数指定容量的OSD的任何I/O操作,并返回full osds
错误消息。
此过程说明如何删除不必要的数据以修复此错误。
注意:该mon_osd_full_ratio
参数是在创建集群时设置full_ratio参数值。你不能改变mon_osd_full_ratio
之后的值。要暂时增加full_ratio
值,请增加pg_full_ratio
。
过程:从完整集群中删除数据
1.确定当前值full_ratio
,默认情况下设置为0.95:
full_ratio 0.95
2.临时增加的价值pg_full_ratio
来0.97
:
注意:建议不要将pg_full_ratio
值设置为高于0.97。将此参数设置为更高的值会使恢复过程更 加困难。因此,您可能根本无法恢复完整的OSD。
3.验证您是否已成功将参数设置为0.97
:
full_ratio 0.97
4. 监控集群状态:
# ceph -w只要集群从状态更改full
为nearfull
,就删除任何不必要的数据。
5. 将值设置full ratio
为0.95
:
6. 验证您是否已成功将参数设置为0.95
:
full_ratio 0.95
翻译自:https://access.redhat.com/documentation/enus/red_hat_ceph_storage/2/html/troubleshooting_guide/troubleshooting-osds#full-osds
译者:祝祥 新钛云服运维架构师
十年运维经验,曾任刻通云运维工程师、微烛云和某互联网金融平台首席运维架构师。拥有OpenStack、CCIE、阿里云、ZStack等技术认证。有上万台云主机,PB级别分布式存储运维经验。熟悉各种虚拟化技术,软硬件,网络,容器编排等技术,拥有python开发经验。热爱各种开源技术。
了解新钛云服
新钛云服正式获批工信部ISP/IDC(含互联网资源协作)牌照
新钛云服,打造最专业的Cloud MSP+,做企业业务和云之间的桥梁
祝祥精品技术干货
OpenStack与ZStack深度对比:架构、部署、计算存储与网络、运维监控等
OpenStack Rocky:专注于裸机云管理,快速升级以及硬件加速
Ceph BlueStore 与 FileStore:利用 Micron NVMe SSD 进行性能比较