欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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