首页 > ceph osd 由于“No space left on device” 异常down,通过扩容文件系统或者显式运行osd进程解决

ceph osd 由于“No space left on device” 异常down,通过扩容文件系统或者显式运行osd进程解决

文章目录

          • ceph版本:
          • 环境配置:
          • 异常问题:
          • 问题解决:
          • 总结

ceph版本:

ceph 12.2.1

环境配置:

tier_pool 16个分区大小800G 的osd容量 3副本

data_pool 32个4T盘 3副本

异常问题:

ps:在分布式存储中遇到任何问题都不要先去通过重设存储节点,清除磁盘数据来解决,一定要利用分布式存储系统的高可用性来先进行操作。大部分问题只需要耐心分析就可以找到高效,可靠的解决方案。

出现异常,报出如下段错误:

 0> 2019-06-18 09:18:14.340970 7f38be251700 -1 /get_rpm_compile/rpmbuild/ceph-12.2.1/BUILD/ceph-12.2.1/src/os/bluestore/KernelDevice.cc: In function 'void KernelDevice::_aio_thread()' thread 7f38be251700 time 2019-06-18 09:18:14.338169
/get_rpm_compile/rpmbuild/ceph-12.2.1/BUILD/ceph-12.2.1/src/os/bluestore/KernelDevice.cc: 372: FAILED assert(r >= 0)ceph version 12.2.1.05 (3e7492b9ada8bdc9a5cd0feafd42fbca27f9c38e) luminous (stable)1: (ceph::__ceph_assert_fail(char const*, char const*, int, char const*)+0x110) [0x7f38d1153560]2: (KernelDevice::_aio_thread()+0x4b5) [0x7f38d10f7f75]3: (KernelDevice::AioCompletionThread::entry()+0xd) [0x7f38d10fc6ed]4: (()+0x7dc5) [0x7f38cdd19dc5]5: (clone()+0x6d) [0x7f38cce0d76d]NOTE: a copy of the executable, or `objdump -rdS <executable>` is needed to interpret this.

解决方式如下:

根据源码对该异常的描述,在这里断言是因为底层bluestore在处理落盘io时使用异步写方式aio_thread,此时无法继续向磁盘写入数据导致该问题

  • 增加osd日志级别debug_bluestore = 10debug_udev = 10,再次尝试启动发现打印出来的断言异常错误码为-28

    -5> 2019-06-18 13:37:48.192979 7fd821767d00 10 stupidalloc reserve need 0x100000 num_free 0x772900000 num_reserved 0x0
    -4> 2019-06-18 13:37:48.192985 7fd821767d00 10 stupidalloc allocate_int want_size 0x100000 alloc_unit 0x100000 hint 0x0
    -3> 2019-06-18 13:37:48.192999 7fd821767d00  5 bdev(0x7fd82c8eba00 /var/lib/ceph/osd/ceph-9/block) aio_write 0x60c8300000~1000 aio 0x7fd82cd7c010
    -2> 2019-06-18 13:37:48.193029 7fd821767d00 10 bdev aio_wait 0x7fd82c520900 waiting for 1 aios to complete
    -1> 2019-06-18 13:37:48.193034 7fd80f2ee700 10 bdev(0x7fd82c8eba00 /var/lib/ceph/osd/ceph-9/block) _aio_thread finished aio 0x7fd82cd7c010 r -28 ioc 0x7fd82c520900 with 0 aios left
    

    因为该问题为数据写盘时报出的问题,所以为系统可识别的问题,则当前环境执行命令perror 28,则发现如下问题:OS error code 28: No space left on device

  • 检查osd所在磁盘的占用情况

    df -h

    /dev/sdf1                             97M  5.4M   92M   6% /var/lib/ceph/osd/ceph-32
    /dev/sdd1                             97M  5.4M   92M   6% /var/lib/ceph/osd/ceph-35
    /dev/sdc1                             97M  5.4M   92M   6% /var/lib/ceph/osd/ceph-34
    /dev/sdg1                             97M  5.4M   92M   6% /var/lib/ceph/osd/ceph-33
    tmpfs                                 13G     0   13G   0% /run/user/0
    /dev/sde1                            800G  800G  299M 100% /var/lib/ceph/osd/ceph-7
    /dev/sdb1                            788G  748G     0 100% /var/lib/ceph/osd/ceph-9
    

    发现osd.9所在文件系统可用容量为0

    ps:

    当前环境的ceph部署情况是存在tier_pool的情况,我们使用ssd做普通hdd的db/wal存放同时划分一个分区,利用该分区部署osd.所以格式化出的文件系统显示容量包括其中block写入数据的容量。此时该osd已经被写满,文件系统发我继续读写文件导致osd异常down掉

    至此,osd 异常问题已经定位,按照如下两种方式可以尝试解决

问题解决:
  • 方法一:数据重构代价大,时间成本高。 修复当前分区上的osd,但是需要损坏一个副本的hdd ,总体数据不会丢

    我们针对分区osd所在的分区文件系统进行扩容。如果你的节点仍然可以继续插入磁盘,则推荐直接看方法二来解决

    • df -T查看当前分区类型

      /dev/sdb1                           ext4      825564056 783604632         0 100% /var/lib/ceph/osd/ceph-8
      /dev/sde1                           ext4      825564056 783604632         0 100% /var/lib/ceph/osd/ceph-6
      

      ​ 发现文件系统类型都为ext4

    • lsblk查看该osd所在磁盘分布

      sde                           8:64   0 894.3G  0 disk 
      ├─sde1                        8:65   0   800G  0 part /var/lib/ceph/osd/ceph-6
      ├─sde2                        8:66   0    30G  0 part 
      ├─sde3                        8:67   0     1G  0 part 
      ├─sde4                        8:68   0    30G  0 part 
      └─sde5                        8:69   0     1G  0 part 
      

      此时该osd所在磁盘一分区做的是osd,剩下的分区做其他的hdd普通盘osd的db/wal,我们想要取sde2这个分区的容量加入到sde1分区中,所以需要损坏db分区在sde2的hdd

      最后通过命令ceph osd metadata osd.34发现该osd用到的db设备在sde2上

      执行如下步骤:

      1. 操作osd

        #设置集群的osd不进行数据重构,方便我们恢复好osd重新加回来,不会产生太多重构。当然,前提是需要暂停掉当前ceph集群的上层业务
        ceph osd set norecover
        ceph osd set nobackfill systemctl stop ceph-osd@34
        
      2. 操作磁盘

        #卸载挂载的目录,不然无法操作分区
        umount /var/lib/ceph/osd/ceph-6#这里需要记录此时环境中的1分区的start sector和2分区的end sector,因为我们现在做的事两个分区容量合并
        [root@node5 ~]# partx /dev/sde
        NR      START        END    SECTORS SIZE NAME            UUID1       2048 1677723647 1677721600 800G ceph data osd.6 2db49ebf-39a8-40bc-8d9e-c38ce50b48272 1677723648 1740638207   62914560  30G ceph block.db   357c32dc-a165-4f5b-97cd-ff2202946fc83 1740638208 1742735359    2097152   1G ceph block.wal  8e2a9f54-634f-40d1-9310-4ea2f40e61ae4 1742735360 1805649919   62914560  30G ceph block.db   356ae8cd-ed80-4afd-b67b-c07e5e00352e5 1805649920 1807747071    2097152   1G ceph block.wal  d8421c05-c2d8-4803-927d-4db99a7f6a61#这里一定要记得不能使用-z 或者 -Z 或者 -o 选项,不能清除磁盘数据,我们只是删除分区
        sgdisk -d 1 /dev/sde
        sgdisk -d 2 /dev/sd3#重新创建分区
        sgdisk --new=1:2048:1740638207 --mbrtogpt /dev/sde#检查已存在的文件系统数据
        [root@node5 ~]# e2fsck -f /dev/sde1
        e2fsck 1.42.9 (28-Dec-2013)
        Pass 1: Checking inodes, blocks, and sizes
        Pass 2: Checking directory structure
        Pass 3: Checking directory connectivity
        Pass 4: Checking reference counts
        Pass 5: Checking group summary information
        /dev/sdl1: 25/13107200 files (4.0% non-contiguous), 871831/52428800 blocks#重新调整文件系统大小
        [root@node5 ~]# resize2fs /dev/sde1
        resize2fs 1.42.9 (28-Dec-2013)
        Resizing the filesystem on /dev/sdl1 to 60293120 (4k) blocks.
        The filesystem on /dev/sdl1 is now 60293120 blocks long.
        
      3. 至此我们已经为激活做了准备,接下来直接对合并后的1分区执行

        ceph-disk -v activate /dev/sde1即可激活

        使用df -h查看文件系统容量已经变更为830G,当前osd拥有可以用空间

      4. 激活后我们需要重新恢复刚才损坏的db分区所在的osd

        那就是使用sde磁盘剩余容量匀出30G 用作db的分区

        sgdisk -n 2:+0:+30G /dev/sde

        设置分区typecode,因为手动做分区,ceph不会为分区创建链接至uuid的链接文件

        sgdisk --typecode=2:30cd0809-c2b2-499c-8879-2d6b78529876 -- /dev/sdb

        再次重新部署osd.34,osd.34所在磁盘为sdb ,因为存储池是三副本,我们重建不会丢失集群数据

        ceph-disk -v prepare /dev/sdb --block.db /dev/sde2 --block.wal /dev/sde3

        ceph-disk -v activate /dev/sdb1

      5. 恢复集群的重构

        ceph osd unset norecover
        ceph osd unset nobackfill
        
  • 方法二:数据重构代价小,时间成本低。如果存储设备可以再次插入磁盘,即可选择该方案

    该解决办法是通过重新制定down掉的问题osd的/var/lib/ceph/osd/ceph-6目录下的配置文件为其他还有剩余空间的配置,即可显示运行起来down掉的问题osd

    • 在当前存储节点重新插入一块和down掉的osd所在磁盘容量接近的磁盘,做出分区,然后格式化足够容量的文件系统

      sgdisk -n 1:+2G:+1T /dev/sdg
      mkfs.xfs -t /dev/sdg1
      mkdir /ceph-6
      mount /dev/sdg1 /ceph-6
      
    • 接下来我们需要将osd.6的配置文件拷贝到我们挂载的目录下

      cp /var/lib/ceph/osd/ceph-6/* /ceph-6

    • 拷贝完成之后修改目录权限

      chown -R ceph:ceph /ceph-6/

    • 显示执行osd进程,并制定进程加载的配置文件路径,这里使用 --osd-data参数指定路径

      [root@node5 /]# /usr/bin/ceph-osd -f --cluster ceph --id 6 --setuser ceph --setgroup ceph --osd-data /ceph-6 
      starting osd.6 at - osd_data /ceph-6 /var/lib/ceph/osd/ceph-6/journal
      2019-06-19 12:42:29.216032 7f73d1ec8d00 -1 osd.6 19889 log_to_monitors { default=true}
    • 此时osd进程已经起来了,按照此方式将集群其他的类似问题的osd都做如上操作,等集群数据均衡完全之后设置

      #这里我们要做的操作是为了一个一个停掉用上述方法拉起啦的osd,修改osd的bluestore_block_size参数配置,降低block_size大小,就可以降低分区文件系统占用情况了。此时停掉osd,为了保证数据不丢失,需要减少重构
      ceph osd set norecover
      ceph osd set nobackfill#停掉上述进程之后编辑/etc/ceph/ceph.conf,修改block容量大小,降低5个G,即由原来的800G 变为795G
      [osd.6]
      bluestore_block_size = 853624750080#重新创建该osd
      ceph osd rm osd.6 
      ceph auth rm osd.6
      umount /var/lib/ceph/osd/ceph-6
      sgdisk -z /dev/sde1
      ceph-disk -v prepare /dev/sde1;ceph-disk -v activate /dev/sde1#再恢复重构 ,这里是为了让重建后的osd能够获取所在资源池其他osd的副本数据
      ceph osd unset norecover
      ceph osd unset nobackfill#等恢复完成之后,pg状态都变为active+clean之后再对其他osd做以上类似操作,保证我们操作过程中pg数据不会丢失
      
总结

ceph分布式存储有较强的高可用性以及可扩展性,当集群异常时候一定要紧抓住ceph的高可用性,只要是冗余内,我们就可以安心恢复集群,定位问题。即使是冗余外,我们也要尝试尽可能降低数据丢失的体量,不能一味得尝试重建,删除集群来规避问题。

更多相关:

  • 文章目录1. 解决问题2. 应用场景3. 实现方式C++实现C语言实现4. 缺点5. 和其他三种创建模式的对比(单例,工厂,建造者) 1. 解决问题 如果对象的创建成本较大,而同一个类的不同对象之间的差别不大(大部分字段相同),在这种情况下,我们可以利用已有对象(原型)进行赋值(拷贝)的方式,创建新的对象,从而达到节省对象创...

  • 混合osd的部署 先部署所有的ssd 在/etc/ceph.conf中最后添加ssd做osd的block大小如下: 比如部署中有两个ssd,则添加 [osd.0] bluestore_block_size = xxxx [osd.1] bluestore_block_size = xxx 如上的size大小计算如下,如ssd容量...

  • 文章目录Pool创建ec pool创建副本pool创建Pool参数创建根故障域及添加osd其他命令Tier相关 Pool创建 ec pool创建 创建profile ceph osd erasure-code-profile set $profile_name k=$k m=$m crush-failure-domain...

  • 文章目录简介使用OSD相关操作PG相关操作对象相关操作总结 简介 ceph-objectstore-tool工具,能够操作到ceph最底层的数据,包括pg,对象层级。它能够对底层pg以及对象相关数据进行获取、修改。并能够对一些问题pg和对象进行简单修复。所以使用该工具进行操作的时候需要谨慎(涉及到修改的操作最好备份一份数据)...

  • 本文主要是在梳理cephfs内核方式挂载的内核代码逻辑所做的准备 环境:Centos 7.5 内核源码版本:3.10.0-862.el7.x86_64 打开ceph模块的debug信息 单独编译ceph模块的.ko文件 ceph在内核的通用模块主要有三个: ceph.ko 模块路径:/usr/src/kernels/3.10....

  • 文章目录安装使用使用`ceph tell`产生堆栈信息文使用`pprof`工具分析内存及`ceph tell`释放内存火焰图`FlameGraph`可视化进程堆栈信息 pprof是一个google开发的支持可视化、且可分析profile文件而达到对内存的分析。并且能够输出文本和图像来支持分析过程,pprof源码 安装...

  • 目前有两种动态修改的方式来让ceph中各个组件的配置生效,所以介绍如下两种方式方便我们进行功能或者代码的调试 使用ceph daemon方式修改 ceph daemon osd.0 help用于osd的daemon服务ceph daemon mon.ceph-node1 help用于mon的admin socket命令、ceph...

  • 我们内核挂载的前提是:看到centos7.5 中默认内核3.10.0-862.11.6.el7.x86_64的挂载fs执行文件读写性能更优良,所以尝试将3.10.0-862.11.6.el7.x86_64模块中与ceph fs挂载相关的ceph.ko,libceph.ko,dns_resolver.ko,libcrc32c.ko拷贝...

  •   在config/index.js找到dev:{}里面的autoOpenBrowser: 设置为true,重新npm run dev一次就自动弹出浏览器页面啦!  ...

  • 工作中需要用到批量修改文件用户和组的情况,特记录以下便捷用法。 1.批量修改多个文件的user和group chown ats:ats /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh /dev/sdi /dev/sdj /dev/sdk /dev/sdl /dev/sdm...

  • ceph环境:12.2.1 使用古老的ceph-disk工具部署osd,仅仅prepare过程中就出现如上所示问题 Device is in use by a device-mapper mapping md127 解决方法如下: 由于device-mapper为系统自己的磁盘映射器,此时检查系统是否有逻辑卷 pvs lvs v...

  • 环境: ceph L版本12.2.1升级到12.2.12 这个问题是由于升级后进行12.2.12环境中的使用ceph-disk 进行osd部署时出现如下问题,执行命令 ceph-disk -v prepare /dev/sdb;ceph-disk -v activate /dev/sdb1 出现如下问题,出现这个问题之前我的磁盘用作...

  • 划分磁盘分区 sgdisk -n 1:+2G:+50G /dev/sda 划分磁盘分区,一号分区划分为50G,同时预留2G的空间 磁盘格式化 sgdisk -z -og /dev/sda 查看分区详情 sgdisk -i 1 /dev/hda查看hda第一分区的详情信息 [root@node3 ~]# sgdisk...