ceph集群pg出现unfound objects处理办法
程序员文章站
2024-01-13 19:51:40
...
作者:【吴业亮】
博客:https://wuyeliang.blog.csdn.net/
在特殊的失败组合下Ceph会警告unfound objects。这意味着存储集群知道有些对象存在,但是却无法找到它的副本。
下面的例子说明这是怎么发生的,有1个PG他映射的的OSD是 1和2:
- OSD 1挂掉
- OSD 2单独处理一些请求
- OSD 1运行
- OSD 1和2重新peering,1上丢失的对象在队列中等待恢复
- 在新对象之前被复制之前,OSD2挂掉
现在OSD 1知道一些对象存在,但是没有这个副本活的OSD。 这种情况下,到这些对象的IO将被阻塞,集群希望失败的OSD快速地回来。这时假设返回一个IO错误给用户是适当的。
修复建议:
1、启动停止的osd
首先,你应该确认哪些对象找不到了:
# ceph pg 3.39 list_missing
[starting offset, in json]
{ "offset": { "oid": "",
"key": "",
"snapid": 0,
"hash": 0,
"max": 0},
"num_missing": 0,
"num_unfound": 0,
"objects": [
{ "oid": "object 1",
"key": "",
"hash": 0,
"max": 0 },
...
],
"more": 0}
如果在一次查询里列出的对象太多, more 这个字段将为 true ,你就可以查询更多。
其次,你可以找出哪些 OSD 上探测到、或可能包含数据:
# ceph pg 3.39 query
"recovery_state": [
{ "name": "Started\/Primary\/Active",
"enter_time": "2012-03-06 15:15:46.713212",
"might_have_unfound": [
{ "osd": 1,
"status": "osd is down"}]},
所有停止osd.1
2、如果还无法恢复,你可能只有放弃丢失的对象。执行如下命令回滚或删除对象:
ceph pg {pgname} mark_unfound_lost revert|delete
- revert选项:回滚到对象的前一个版本
- delete选项:完全删除这个对象
使用这个操作时注意,因为它可能是使预期存在这个对象的程序混乱。
列出带有丢失对象的PG的名字:
ceph pg {pgname} list_missing
举例:
[[email protected] ~]# ceph health detail | grep unfound
HEALTH_ERR 50 pgs backfill_wait; 3 pgs backfilling; 60 pgs degraded; 1 pgs inconsistent; 1 pgs recovering; 19 pgs recovery_wait; 60 pgs stuck degraded; 73 pgs stuck unclean; 41 pgs stuck undersized; 41 pgs undersized; recovery 126807/1654284 objects degraded (7.665%); recovery 186892/1654284 objects misplaced (11.297%); recovery 1/551428 unfound (0.000%); 1 scrub errors
pg 3.39 is active+recovering+undersized+degraded+remapped, acting [14,2], 1 unfound
recovery 1/551428 unfound (0.000%)
[[email protected] ~]# ceph pg 3.39 mark_unfound_lost delete
pg has 1 objects unfound and apparently lost marking
上一篇: Linux笔记:网络常用命令
下一篇: IOS-录音功能