当前位置: 首页 > 编程日记 > 正文

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的高可用性,只要是冗余内,我们就可以安心恢复集群,定位问题。即使是冗余外,我们也要尝试尽可能降低数据丢失的体量,不能一味得尝试重建,删除集群来规避问题。

相关文章:

java云服务器系统选择,java云服务器系统选择

java云服务器系统选择 内容精选换一换登录Windows操作系统弹性云服务器时&#xff0c;无法正常进入系统。自启动系统修复模式&#xff0c;但选择修复选项后报错&#xff0c;无法继续进行系统恢复。Windows文件已损坏。登录管理控制台&#xff0c;选择“计算 > 弹性云服务器”…

WordPress数据库优化技巧

各位站长都知道wordpress用久了就会越来越慢。今天就给大家介绍如何给自己的wordpress提速&#xff0c;分两种方法&#xff1a;1.插件属性wordpress的都知道其插件是相当的多&#xff0c;只要你能想得到的基本都有&#xff0c;在这给大家介绍几个小编知道的插件&#xff1a;WP-…

【JDK7】新特性(2) 语法

2019独角兽企业重金招聘Python工程师标准>>> JDK7对Java语法有少量更新&#xff0c;重点是在易用性和便捷性的改进。 1.二进制字面量 JDK7开始&#xff0c;终于可以用二进制来表示整数&#xff08;byte,short,int和long&#xff09;。使用二进制字面量的好处是&am…

AtcoderCodeForces杂题11.6

Preface NOIP前突然不知道做什么,感觉思维有点江僵化,就在vjudge上随便组了6道ABC DCF Div2 C/D做,发现比赛质量还不错,知识点涉及广,难度有梯度,码量稍小,思维较多. 同时发现vjudge的比赛功能很不错 A. ABC112-D-Partition 难度感觉比NOIP T1简单了些了 首先naiive的想法是枚举…

centos下将vim配置为强大的源码阅读器

每日杂事缠身&#xff0c;让自己在不断得烦扰之后终于有了自己的清静时光来熟悉一下我的工具&#xff0c;每次熟悉源码都需要先在windows端改好&#xff0c;拖到linux端&#xff0c;再编译。出现问题&#xff0c;还得重新回到windows端&#xff0c;这个过程太耗费时间。 vim作为…

虚拟机看服务器mac地址,虚拟机修改服务器mac地址吗

虚拟机修改服务器mac地址吗 内容精选换一换本章节指导用户为Windows系统的ECS主机添加域名解析并添加安全组&#xff0c;防止下载Agent安装包与采集监控数据时出现异常。修改ECS的DNS配置有两种方式&#xff1a;Windows图形化界面和管理控制台。您可以根据自己的使用习惯选择其…

条件注释判断浏览器!--[if !IE]!--[if IE]!--[if lt IE 6]!--[if gte IE 6]

条件注释判断浏览器<!--[if !IE]><!--[if IE]><!--[if lt IE 6]><!--[if gte IE 6]> <!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]--><!--[if IE]> 所有的IE可识别 <![endif]--><!--[if IE 6]> 仅IE6可识…

USACO09FEB Fair Shuttle

题目传送门 据说\(NOIp\)前发题解可以\(\mathfrak{RP}\) 因为要尽可能满足更多奶牛&#xff0c;所以按照这种区间贪心题的套路&#xff0c;先按右端点排序&#xff0c;然后依次遍历&#xff0c;能坐车的就让它们坐车&#xff0c;这样一定是最优的。 在贪心的时候&#xff0c;我…

diy高性能存储服务器,diy存储服务器

diy存储服务器 内容精选换一换帮助用户完成专属云服务器备份任务的创建&#xff0c;快速完成服务器数据保护。专属云服务器不支持应用一致性备份。当专属对象存储的容量不足时&#xff0c;会导致专属云服务器备份创建失败。已开通专属对象存储。登录管理控制台。单击&#xff0…

使用内存盘 格式化文件系统以及部署ceph-osd

文章目录创建RAMDISK使用内存盘使用内存盘格式化文件系统使用内存盘部署ceph-osd删除内存盘为了测试内存盘类型的磁盘做ceph osd的io性能&#xff0c;将内存部分空间取出来用作普通物理磁盘(RAMDISK)&#xff0c;并在该磁盘上部署ceph osd支持该操作的系统驱动为brd.koPS &…

iBatis的CRUD操作详细总结

昨天晚上看了一下关于iBatis的一个讲解的视频&#xff0c;讲的和我的这个简单的总结差不多.... 思考了一下还是把主要操作都总结一下吧&#xff0c;当然这里也不是全的&#xff0c;知识简单的CRUD。。。 首先我觉得持久层的操作主要就是这几个&#xff1a; public interface IP…

min聚合函数查询带有额外字段sql|dense_rank()over(partition)|+班级学生成绩最高

oracle爱好者和群snowg的问题 上面的这个&#xff0c;有站点stationid&#xff0c;year&#xff0c;month&#xff0c;day和每天记录的day_tmin字段。现在要求统计处每个stationid下面每月每日的最小day_tmin字段&#xff0c;因为不关注year&#xff0c;所以sql这样写 select …

提升jmeter自身性能

JMeter负载测试时使用GUI界面和较多的收集测试结果的监听器容易造成jmeter的性能瓶颈&#xff0c;远程测试时的控制台尤为明显。提升JMeter负载测试时性能的方法如下&#xff1a; 官方的解决办法&#xff1a;http://jakarta.apache.org/jmeter/usermanual/best-practices.html#…

C++ STL的reserve函数

在阅读ceph源码过程中发现部分C语法还是不够熟悉&#xff0c;特此做一下笔记。 关于STL中的reserve函数的使用 reserve()是为容器预留空间&#xff0c;即为当前容器设定一个空间分配的阈值&#xff0c;但是并不会为容器直接allocate具体的空间&#xff0c;具体空间的分配是在创…

AJAX进行分页

新建数据集&#xff1a;PagingDataSet.xsd SELECT * from ( select id, areaID, area, father,Row_Number() over (order by areaID) rownum FROM dbo.area) t where t.rownum >startRowIndex and t.rownum <endRowIndex在集合中添加两个参数&#xff1a; startRowIndex…

华为服务器引入清空外部配置文件,云服务器还原配置文件

云服务器还原配置文件 内容精选换一换外部镜像文件在从原平台导出前&#xff0c;没有按照“Windows操作系统的镜像文件限制”的要求完成初始化操作&#xff0c;推荐您使用弹性云服务器完成相关配置。流程如图1所示。云服务器的正常运行依赖于XEN Guest OS driver(PV driver)和K…

脚本SFTP定时取Linux服务器文件

为什么80%的码农都做不了架构师&#xff1f;>>> 在工作中尤其是政府机关为了安全方面考虑&#xff0c;通常是不开通服务器与服务器之间FTP服务 如果每天又要巡检服务器&#xff0c;每次都要登录查看某个文件给自己的工作带来很大的不便 这里通过 winscp工具使用S…

使用sigaction处理内核信号

文章目录函数描述函数使用抓取发送信号的进程信息mark一次获取内核信号&#xff0c;并作相应处理的手段linux内核中断机制的一个重要实现就是信号。信号使得内核和用户态的交互更加便捷&#xff0c;这个便捷对开发者来说可以更好的利用系统原生内核来处理信息。《深入理解unix内…

ios share extension 真机不显示_ios企业签名:APPGroups实现App之间数据共享

一、认识App GroupsAppGroup allows data sharing between two different apps or even app and widgets by creating one common shared path (like document directory). Data saved over there can be accessed by any app which is associated with that particular AppGro…

处理 JSON null 和空数组及对象

描述了对 JSON 数据中使用的 null 和空数组及对象的处理。 JSON 数据具有 null 和空数组及对象的概念。此部分说明其中每个概念如何映射到 null 和未设置的数据对象概念。 Null 值 JSON 具有特殊值 null&#xff0c;可以对任何数据类型设置该值&#xff0c;包括数组、对象、数字…

xml file too big to import to wordpress website

xml文件太大无法上传到wordpress 原因&#xff1a;从一个wordpress上导出了自己所有的文章&#xff0c;大概6~7MB&#xff0c;准备导入到本机自建的一个wordpress&#xff0c;不过上传文件有限制&#xff0c;最大2MB。 解决方法&#xff1a; 1. 网上很多关于修改配置文件的…

亚麻 面经_ml

Ds -如何预测一个人会不会在下一个月在Amazon买东西&#xff0c;有什么模型。https://mlwave.com/predicting-repeat-buyers-vowpal-wabbit/https://www.researchgate.net/post/How_can_I_study_the_past_spending_behaviour_of_a_customer_in_a_banking_perspective_and_predi…

ceph bluestore源码分析:C++ 获取线程id

阅读ceph源码过程中需要明确当前操作是由哪个线程发出&#xff0c;此时需要根据线程id来确认线程名称 C获取线程id是通过系统调用来直接获取 函数描述 头文件:<sys/syscall.h> 函数名称:syscall(SYS_gettid) 该函数直接返回了一个pid_t int类型的数字&#xff0c;即为当…

判断两直线段是否相交

转自&#xff1a;http://www.cnblogs.com/shengshouzhaixing/archive/2013/03/17/2964950.html //功能&#xff1a;求点在有向直线左边还是右边 //返回&#xff1a;0共线、1左边、-1右边 int left_right(point a,point b,double x,double y) { d…

led显示屏建设标准_户外LED显示屏3大防护标准_显示屏应对恶劣天气?

户外LED显示屏是现在LED显示屏应用最棺广泛的领域。面积巨大&#xff0c;显示效果震撼。同时为了更好的宣传效果&#xff0c;通常安装余楼顶&#xff0c;道路等空旷无遮挡地带。由于面积大且处于露天状态&#xff0c;LED显示屏面临巨大的环境挑战。经常要面对大风、暴雨、冰雹等…

转载 Sqlerver 计算 MD5

2019独角兽企业重金招聘Python工程师标准>>> 在SQl2005下自带的函数hashbytes() &#xff0c;此函数是微软在SQL SERVER 2005中提供的&#xff0c;可以用来计算一个字符串的 MD5 和 SHA1 值&#xff0c;使用方法如下&#xff1a; --获取123456的MD5加密串 select ha…

vim使用说明

模式 命令 操作 开始 vim 文件路径 打开|新建文件 命令模式 i 切换到输入模式 x 删除当前光标所在处的字符 : 切换到底线命令模式 shiftzz 保存并退出 移动光标的方法 h|← 左 j|↓ 下 k|↑ 上 l|→ 右 [Ctrl] [f] 输入模式下的page down [Ctrl] […

g++编译c++11特性 的.cc文件

写一个.cc文件&#xff0c;其中抱哈std::lock_guard以及std::thread等c11特性&#xff0c;开始使用gcc编译,过程中出现如下问题 gcc test_lock.cc -o test_lock This file requires compiler and library support for the ISO C 2011 standard. This support is currently ex…

联想r720内存频率_联想 IdeaPad14s 2020 轻薄本双十一促销

IT之家11月10日消息 作为一款主打轻薄的笔记本电脑&#xff0c;联想 IdeaPad14s 2020 自推出以来便受到不少办公学习用户的青睐。如今&#xff0c;这款联想 IdeaPad14s 2020 轻薄笔记本已开启双十一促销&#xff0c;搭载第十代酷睿处理器&#xff0c;采用 14 英寸双侧窄边框屏幕…

HDU 1273 漫步森林

比赛的时候是看见人家A得很快&#xff0c;但是一看的时候觉得没什么头绪&#xff0c;画了一个六边形的灵感来了&#xff0c;就YY一下 第一次提交写错了结束条件&#xff0c;之后意淫下公式交上去A了。 用五边形来解释&#xff1a; 1.设有五个点1&#xff0c;2,3,4,5, 2.从1开始…