CDC

Place to Be & Show Yourself

教小白彻底搞定各种磁盘空间不足的问题

问题的提出

各位做运维的同学一定会经常遇到磁盘空间不足的问题,数据文件太大了,占用了所有的磁盘空间,还没办法清理;debug log突然爆发了,还不敢删除,删除了问题就没办法定位了,业务报表也没办法及时生成,搞得运维人员痛不欲生。我们的一套生产环境最近就遇到了2次磁盘空间爆满引起的业务中断故障。

本文就来讲讲如何彻底搞定各种磁盘空间问题。

主动防御

其实磁盘空间问题不仅仅是一个运维问题,而是一个设计问题。一个系统在设计阶段就应该考虑到这个问题,是为主动防御。包括Debug Log的设计,数据库的设计,批量转储的设计等。

在运维阶段,预防debug log爆满,最简单直接的做法就是使用系统的logrotate工具了。logrotate可以根据日志文件的数量或者大小进行rotate,超过数量和大小的日志文件会被自动删除,避免了日志文件的无限增长。

数据库文件占用空间的增长,从某种意义上讲,这个是没办法避免的,因为数据库一般都是存储比较重要的业务数据,除非定期清理历史数据。但是也有一种情况会导致空间的浪费,以MySQL5.7为例,删除数据库表之后,占用的数据文件大小并没有跟着变小,请参考本博客的另一篇博文,进行数据库配置的修改:释放MySQL数据文件占用空间

被动防御

被动防御要怎么做呢?当然是监控告警了。极客俱乐部开发了一套简单易用的基于Prometheus的监控告警系统,今后会开源给大家使用。

但是有的时候预防/防御并没有办法解决所有的问题,磁盘空间爆满的问题还是会不期而遇。如果真的出现了磁盘空间爆满的问题,要该怎么解决呢?如果因为业务需要,真的需要更大的磁盘空间,要如何对磁盘空间进行扩容呢?

找到罪魁祸首

其实只需要几个简单的命令,就可以找到是哪个文件或者目录占用太多的磁盘空间了
df -h 显示已经挂载的分区列表剩余空间和已用空间
du -sh dir1 估算目录 ‘dir1′ 已经使用的磁盘空间’
du -sk * | sort -rn 以容量大小为依据依次显示文件和目录的大小
《教小白彻底搞定各种磁盘空间不足的问题》
find . -size +100M 查看超过100M的所有文件

新增磁盘空间的方法

业务需要,真的要扩展磁盘空间了。就只好加硬盘了。最简单单的办法就新加一块硬盘,并挂载到一个特定的目录下面了。

挂载到新目录

  1. Step1: 找到新增加的磁盘

  1. Step2:对新增加的磁盘进行分区
    《教小白彻底搞定各种磁盘空间不足的问题》
    按照上面步骤
    n 回车
    p 回车
    1 回车
    两次回车
    w 回车
    结束之后可以用步骤一的命令查看磁盘分区状态

  2. Step3:格式化分区

  1. Step4:挂载新磁盘

  1. Step5:设置开机自动挂载
    vim /etc/fstab
    在文件最后添加 /dev/sdb1 /ssd ext4 defaults 0 0 如下图
    《教小白彻底搞定各种磁盘空间不足的问题》

但是真的有这么简单吗?想象一下,如果如果数据文件需要更大的空间,新挂载的空间要怎么才能利用起来呢?当然就需要进行数据文件的迁移了。但是迁移真的不是一件简单的事情
请参考本博客的另一篇文章:从AppArmor的原理看MySQL数据文件路径修改失败

挂载到根目录

那要怎么把一块新的磁盘挂在原来的根目录扩展根目录的空间呢?显然通常的方法是行不通的啊。幸运的是,不少云计算平台提供了便捷的方式来动态扩容

AWS扩容

在AWS中的操作步骤如下:
1. 将 instance 停机
2. 在 Elastics block store 中 Modify volume size
3. 启动 instance

其他平台

不过也有一些云计算平台,不支持直接动态扩容,只能新增一块硬盘空间。怎么用这块新增的空间扩展原来的根目录空间呢?这个时候vgroup的概念就登场了。本位以vmware的私有云平台VRS为例进行说明。

如图所示新增了一块磁盘空间
《教小白彻底搞定各种磁盘空间不足的问题》

按照如下步骤将新的磁盘空间增加到Volume Group中

物理磁盘的挂载

物理磁盘如果挂载到新的挂载点,和虚拟机云平台的方法基本相同,就不再赘述了。但是如果需要挂载到根目录空间,就需要创建Volume Group了。请参考这个link来创建LVM: 创建LVM

点赞

发表评论

电子邮件地址不会被公开。