Ceph FS文件系统不可用(Requests are blocked)

    • 一、问题描述

      由于系统内核版本或者其他网络原因中断,正在对数据块的访问没有完成导致请求被blocked,同时部分pg会处于不同步状态,通过ceph health会发现ceph集群不在OK 状态

      health HEALTH_ERR 1 pgs inconsistent; 1 pgs repair; 2 requests are blocked > 32 sec; 1 scrub errors
      pg 6.89 is active+clean+inconsistent, acting [12,1,10]
      1 ops are blocked > 33554.4 sec
      1 ops are blocked > 33554.4 sec on osd.16
      1 osds have slow requests

      通过以上命令可以发现这里有部分osd(osd.16)出现请求被blocked,重启这些osd,让ceph自己进行恢复:

      ubuntu:
      /etc/init.d/ceph stop osd.16

      /etc/init.d/ceph start osd.16

      suse:

      systemctl stop ceph-osd@16

      systemctl start ceph-osd@16
      系统会对该 osd 执行 recovery 操作, recovery 过程中, 会断开 block request, 那么这个 request 将会重新请求 mon 节点, 并重新获得新的 pg map, 得到最新的数据访问位置, 从而解决上述问题

      一段时间后,可以通过ceph -s 查看ceph的状态为ok 

      二、.通过重启OSD 后ceph pgs inconsistent依然不一致

      #ceph pg repair  6.89
      instructing pg 6.89 on osd.12 to repair
      进行pg的同步,过几分钟,自动修复完成
      # ceph health detail
      HEALTH_OK

       三、.发现有不一致的pg,有pg repiar后结果依旧

      [root@ceph-6-11 ~]# ceph health detail

      HEALTH_ERR 1 pgs inconsistent; 1 scrub errors

      pg 2.37c is active+clean+inconsistent, acting [75,6,35]

      1 scrub errors

      问题依然存在,异常pg没有修复;

      然后执行:

      要洗刷一个pg组,执行命令:

      ceph pg scrub 2.37c   

      ceph pg deep-scrub  2.37c

      ceph pg repair 2.37c

      以上命令执行后均未修复,依然报上面的错误,查看相关osd 日志报错如下:

      2017-07-24 17:31:10.585305 7f72893c4700  0 log_channel(cluster) log [INF] : 2.37c repair starts

      2017-07-24 17:31:10.710517 7f72893c4700 -1 log_channel(cluster) log [ERR] : 2.37c repair 1 errors, 0 fixed

      决定修复pg 设置的三块osd ,执行命令如下: 

      ceph osd repair 75

      ceph osd repair 6

      ceph osd repair 35

      修复命令执行后等待一段时间,osd 修复完成,发现错误依然存在!!!!!!!!!

      此时想做下面两个操作:

      1:找到pg object信息,把主osd 上面的数据删掉,让后让集群修复;

      2:修改pg现在使用的主osd信息,现在是osd 75 ,改成别的磁盘(没找到方法修改);

      最后的方法解决,关闭有问题pg 所使用的主osd 75

      查询pg 使用主osd信息

      ceph pg  2.37c query |grep primary 

       

                      "blocked_by": [],

                      "up_primary": 75,

                      "acting_primary": 75

      执行操作如下:

      systemctl stop ceph-osd@75

      此时ceph开始数据恢复,将osd75 上面的数据在其它节点恢复,等待一段时间,发现数据滚动完成,执行命令查看集群状态。 

      [root@ceph-6-11 ~]# ceph health detail  

      HEALTH_ERR 1 pgs inconsistent; 1 scrub errors

      pg 2.37c is active+clean+inconsistent, acting [8,38,17]

      1 scrub errors

      看到上面的信息,心都要碎了!为啥还是这样?不报希望的执行以下常规修复!

      [root@ceph-6-11 ~]# ceph pg repair 2.37c

      ‘instructing pg 2.37c on osd.8 to repair

      然后查看集群状态:

      [root@ceph-6-11 ~]# ceph health detail  

      HEALTH_OK

       四、针对以上操作,一般3副本,基本都可以解决了。如果是两副本,还是没有修复好,则可能pg下有相应的object出现问题了。

      通过ceph -w 或者查看ceph log的报错信息,确认有问题的object

      2017-08-30 00:30:12.604191 7f6614757700 -1 log_channel(cluster) log [ERR] : deep-scrub 0.64 0:26006f55:::rbd_data.10eb238e1f29.0000000000006911:head on disk size (4194304) does not match object info size (1048576) adjusted for ondisk to (1048576)

      然后在ceph目录查看有问题的object  

      ses01:/var/lib/ceph/osd/ceph-0/current/0.64_head/DIR_4/DIR_6/DIR_0/DIR_0 # ls -l
      total 102400
      -rw-r--r-- 1 ceph ceph 0 Aug 29 05:21 __head_00000064__0
      -rw-r--r-- 1 ceph ceph 4194304 Aug 31 02:48 rbd\udata.10eb238e1f29.0000000000006911__head_AAF60064__0

      ceph osd object信息可能与元数据sever记录的信息不一致,导致无论osd数据banlance还是pg的repiar都一直无效。

      解决问题方法,删除有问题的object,尝试修复,会影响原来的应用数据。

      删除有问题的object对象

      https://ceph.com/planet/ceph%E5%88%A0%E9%99%A4osd%E4%B8%8A%E4%B8%80%E4%B8%AA%E5%BC%82%E5%B8%B8object/

      恢复MDS,查看ceph状态

      http://docs.ceph.com/docs/master/cephfs/disaster-recovery/

       

       

       

       

       

       

       

       

posted @ 2017-08-08 15:07  伊川草  阅读(1287)  评论(0)    收藏  举报