美文网首页
如何处理PG inconsistent状态

如何处理PG inconsistent状态

作者: ypdai | 来源:发表于2019-02-26 18:52 被阅读0次

    title: 如何处理PG inconsistent状态

    前言

    这里通过实验操作,说明下集群出现pg inconsistent状态的原因和处理办法。

    实验操作

    1、准备测试集群

    下面是我准备的3节点测试集群

    [root@ceph01 23.1_head]# ceph -s
        cluster 29978a95-87f1-4a0c-96fa-2369e985bfbe
         health HEALTH_OK
         monmap e1: 1 mons at {ceph01=192.168.10.20:6789/0}
                election epoch 13, quorum 0 ceph01
          fsmap e44: 1/1/1 up {0=ceph01=up:active}
         osdmap e462: 7 osds: 7 up, 7 in
                flags sortbitwise,require_jewel_osds
          pgmap v142266: 464 pgs, 15 pools, 156 MB data, 272 objects
                1153 MB used, 103 GB / 104 GB avail
                     464 active+clean
    
    [root@ceph01 23.1_head]# ceph osd tree
    ID WEIGHT  TYPE NAME       UP/DOWN REWEIGHT PRIMARY-AFFINITY 
    -1 0.08752 root default                                      
    -2 0.02917     host ceph01                                   
     0 0.01459         osd.0        up  1.00000          1.00000 
     1 0.01459         osd.1        up  1.00000          1.00000 
    -3 0.02917     host ceph02                                   
     2 0.01459         osd.2        up  1.00000          1.00000 
     3 0.01459         osd.3        up  1.00000          1.00000 
    -4 0.02917     host ceph03                                   
     4 0.01459         osd.4        up  1.00000          1.00000 
     5 0.01459         osd.5        up  1.00000          1.00000 
     6       0 osd.6                up  1.00000          1.00000
    

    2、模拟pg inconsistent状态

    随便选择一个pg,我这里选择的是23.1这个pg,该pg分布在osd.2和osd.2上面:

    [root@ceph01 23.1_head]# ceph pg map 23.1
    osdmap e462 pg 23.1 (23.1) -> up [0,2] acting [0,2]
    

    在主本osd.0所在节点上进入pg 23.1的目录,并选择一个对象获取其所有的xattrs:

    [root@ceph01 23.1_head]# pwd
    /var/lib/ceph/osd/ceph-0/current/23.1_head
    [root@ceph02 23.1_head]# getfattr -m ".*" 475caa43-5052-4d27-8ffb-897db2b8a2ec.84114.2\\u222__head_81BA0161__17 
    # file: 475caa43-5052-4d27-8ffb-897db2b8a2ec.84114.2\134u222__head_81BA0161__17
    user.ceph._
    user.ceph._@1
    user.ceph._user.rgw.acl
    user.ceph._user.rgw.etag
    user.ceph._user.rgw.idtag
    user.ceph._user.rgw.manifest
    user.ceph._user.rgw.manifest@1
    user.ceph._user.rgw.manifest@2
    user.ceph._user.rgw.pg_ver
    user.ceph._user.rgw.source_zone
    user.ceph._user.rgw.unix-key1
    user.ceph._user.rgw.unix1
    user.ceph.snapset
    user.cephos.spill_out
    user.foo
    

    然后获取其中一个xattr:

    [root@ceph01 23.1_head]# getfattr -n user.ceph._user.rgw.idtag 475caa43-5052-4d27-8ffb-897db2b8a2ec.84114.2\\u222__head_81BA0161__17
    # file: 475caa43-5052-4d27-8ffb-897db2b8a2ec.84114.2\134u222__head_81BA0161__17
    user.ceph._user.rgw.idtag="_oamSgdWXhjtMSTEP3OI9g1dL42ZQNx11"
    

    到pg 23.1的副本osd上,同样获取下这个对象的xattr:

    [root@ceph02 23.1_head]# getfattr -n user.ceph._user.rgw.idtag 475caa43-5052-4d27-8ffb-897db2b8a2ec.84114.2\\u222__head_81BA0161__17
    # file: 475caa43-5052-4d27-8ffb-897db2b8a2ec.84114.2\134u222__head_81BA0161__17
    user.ceph._user.rgw.idtag="_oamSgdWXhjtMSTEP3OI9g1dL42ZQNx11"
    

    可以看到对象的user.ceph._user.rgw.idtag扩展属性在主副本上是一样的,这就是正常情况。下面我们手动把主本的扩展属性改下:

    [root@ceph01 23.1_head]# setfattr -n user.ceph._user.rgw.idtag -v "_oamSgdWXhjtMSTEP3OI9g1dL42ZQNx12" 475caa43-5052-4d27-8ffb-897db2b8a2ec.84114.2\\u222__head_81BA0161__17
    

    然后手动触发scrub:

    [root@ceph01 23.1_head]# ceph pg scrub 23.1
    instructing pg 23.1 on osd.0 to scrub
    

    然后再看集群状态变成了ERR:

    [root@ceph01 23.1_head]# ceph -s
        cluster 29978a95-87f1-4a0c-96fa-2369e985bfbe
         health HEALTH_ERR
                1 pgs inconsistent
                1 scrub errors
         monmap e1: 1 mons at {ceph01=192.168.10.20:6789/0}
                election epoch 13, quorum 0 ceph01
          fsmap e44: 1/1/1 up {0=ceph01=up:active}
         osdmap e462: 7 osds: 7 up, 7 in
                flags sortbitwise,require_jewel_osds
          pgmap v142290: 464 pgs, 15 pools, 156 MB data, 272 objects
                1153 MB used, 103 GB / 104 GB avail
                     463 active+clean
                       1 active+clean+inconsistent
    

    此时在osd.0的日志里面可以看到scrub的信息:

    2019-02-26 17:33:49.841272 7f4976219700  0 log_channel(cluster) log [INF] : 23.1 scrub starts
    2019-02-26 17:33:49.842529 7f4976219700 -1 log_channel(cluster) log [ERR] : 23.1 : soid 23:86805d81:::475caa43-5052-4d27-8ffb-897db2b8a2ec.84114.2_222:head attr value mismatch '_user.rgw.idtag'
    2019-02-26 17:33:49.842613 7f4976219700 -1 log_channel(cluster) log [ERR] : 23.1 scrub 0 missing, 1 inconsistent objects
    2019-02-26 17:33:49.842619 7f4976219700 -1 log_channel(cluster) log [ERR] : 23.1 scrub 1 errors
    

    上面的信息告诉我们23.1这个pg里面的475caa43-5052-4d27-8ffb-897db2b8a2ec.84114.2_222这个对象的_user.rgw.idtag属性在主副本之间不一致。

    这里可以知道pg出现inconsistent状态时,是由于pg里面的对象的主副本之间出现数据或元数据不一致导致的(我们上面是修改了其中一个副本的xattr,也可以直接删掉某一个xattr)。

    下面看下如何处理这种情况。

    3、如何解决

    3.1、方式一

    上面我们通过osd日志知道哪个pg出现了问题(也可以直接通过ceph health detail命令查看),然后对这个pg执行repair操作即可:

    [root@ceph01 23.1_head]# ceph pg repair 23.1
    instructing pg 23.1 on osd.0 to repair
    

    一般情况下,等待一小会儿,集群就可以恢复正常了。

    这里要注意:repair会去选择权威的副本,然后把选择出来的权威副本上属性同步到其他副本上去。

    那我们如何知道权威副本是哪个呢?可以把debug_osd开到10,然后执行完ceph pg scrub {pgid},然后在pg的主osd日志里面可以看到如下信息:

    [root@ceph01 ~]# cat /var/log/ceph/ceph-osd.0.log|grep auth
    2019-02-26 18:22:33.849430 7f4976219700 10 osd.0 pg_epoch: 462 pg[23.1( v 367'28 (0'0,367'28] local-les=460 n=1 ec=181 les/c/f 460/462/0 459/459/383) [0,2] r=0 lpr=459 crt=367'28 lcod 0'0 mlcod 0'0 active+clean+scrubbing] be_select_auth_object: **selecting osd 0** for obj 23:86805d81:::475caa43-5052-4d27-8ffb-897db2b8a2ec.84114.2_222:head with oi 23:86805d81:::475caa43-5052-4d27-8ffb-897db2b8a2ec.84114.2_222:head(367'25 client.84123.0:989 dirty|data_digest|omap_digest s 0 uv 25 dd ffffffff od ffffffff alloc_hint [0 0])
    2019-02-26 18:22:33.849718 7f4976219700 10 osd.0 pg_epoch: 462 pg[23.1( v 367'28 (0'0,367'28] local-les=460 n=1 ec=181 les/c/f 460/462/0 459/459/383) [0,2] r=0 lpr=459 crt=367'28 lcod 0'0 mlcod 0'0 active+clean+scrubbing] scrub_process_inconsistent: checking authoritative
    

    从上面的日志中可以看出osd.0被选成了权威副本。

    3.2、方式二

    1.查看pg的详细错误信息

    [root@ceph01 0.14_head]# rados list-inconsistent-obj 0.14 --format=json-pretty
    

    2.通过rados get/put的方式修复

    先把该对象获取出来
    [root@ceph01 0.14_head]# rados -p rbd get rbd_data.d37a6b8b4567.0000000000000017 /tmp/rbd_data.d37a6b8b4567.0000000000000017
    
    然后再put进去
    [root@ceph01 0.14_head]# rados -p rbd put rbd_data.d37a6b8b4567.0000000000000017 /tmp/rbd_data.d37a6b8b4567.0000000000000017
    

    3.3、方式三

    如果经过上面的操作,集群仍没有达到OK状态,可以尝试用下面这种方式进行修复。(参考:https://lihaijing.gitbooks.io/ceph-handbook/content/Troubleshooting/troubleshooting_pg.html

    1、停掉数据不一致且非权威副本所属的 osd (如何知道哪个是权威副本,请参考我上面的说明)。

    $ systemctl stop ceph-osd@{osdid}
    

    2、刷新该 osd 的日志。

    $ ceph-osd -i {osdid} --flush-journal
    

    3、将不一致的 object 移除。

    $ mv /var/lib/ceph/osd/ceph-{osdid}/current/{pgid}_head/ {object-name} /home
    

    4、重新启动该 osd 。

    $ systemctl start ceph-osd@{osdid}
    

    5、重新执行修复命令。

    $ ceph pg repair {pgid}
    

    总结

    上面是两种修复的方法,基本的思想是一样的,就是先找出不一致(inconsistent)的对象,然后对比这个对象的主副本数据哪个更新,然后使用正确的副本对象去修复其他有问题的副本对象。

    相关文章

      网友评论

          本文标题:如何处理PG inconsistent状态

          本文链接:https://www.haomeiwen.com/subject/kmszyqtx.html