← 返回文章列表

记一次Linux磁盘满载导致的服务不可用

cover_image

记一次Linux磁盘满载导致的服务不可用

原创 集家嘴的壳玛 集家嘴的壳玛

在小说阅读器中沉浸阅读

一早上同事发来消息说:Seatable打不开。

聊天记录

发现错误

然后我参考了国内的seatable论坛,得到如下:

bbs.seatable.cn

国外的相关帖子如下:

forum.seatable.com

这时候我发现部分表格还是能打开。所以我觉得seatable系统是好的,可能是部分表格的错误,我决定按照seatable官方的备份方法进行备份。然而在我使用

rsync -az --exclude 'ccnet' --exclude 'logs' --exclude 'pids' --exclude 'db-data' /opt/seatable/seatable-data/seatable /opt/seatable-backup/data/

进行备份的时候发现rsync也报错,隐约感觉不对劲,老实换回

cp -R /opt/seatable-backup/data/* /opt/seatable/seatable-data/

依旧出现报错更加坚定了我的想法,磁盘空间不足了。

确认错误

因为同事要开的表格存了我们这里近三年的数据,并且因为是服务器在公司内部,所以我基本上没有备份,也没有条件备份。

伊拉克战争版仓库(也是资料室,也是“机房”)

这个所谓的服务器是我当时想把公司很多纸质和Excel表格之类的数据搬到一个固定服务器上,一个是方便资料留存,一个是能够使一些报表自动化。纸质数据和大量Excel文件的数据不利于这样,对于周期性经济活动或者上级单位要的报告特别浪费人力和时间,但是当年我刚开始自学,所以领导放手我自己做,把公司淘汰下来的旧PC让我摸索。(很感谢领导的开明)

扯远了,于是我使用了df -h命令查看了磁盘空间,果然如我猜的磁盘空间已经满了。然后陆续打开了服务器上其他的服务,有的服务也已经打不开了。至于seatable上有的表格打的开,有的打不开,我猜是因为小的表格在redis中能够缓存下来,大的表格在redis缓存不够,所以出现数据截断,然后造成Cannot read properties of undefined (reading 'forEach')报错。

于是我又找开明的领导要了个旧PC,下了两块硬盘下来装在了Linux服务器上,这里顺便又复习了一遍Linux对硬盘的格式化与挂载。

线不够长,加装了几块硬盘,也塞不进去了

解决问题

确认新硬盘已识别

lsblk

查看输出,确认新添加的硬盘(例如 /dev/sdb)已显示在列表中。

分区新硬盘

fdisk /dev/sdb

在fdisk交互界面中执行:

  • • 输入 n 创建新分区

  • • 输入 p 创建主分区

  • • 输入 1 作为分区号

  • • 按回车接受默认起始扇区

  • • 按回车接受默认结束扇区

  • • 输入 w 保存分区表并退出

Tip:上面是新硬盘的做法,由于我是windows上取下来的旧硬盘,所以在输入“n”创建新分区之前,需要输入“d”来逐个删除旧的硬盘分区(可以使用“p”查看旧硬盘分区)

格式化分区

mkfs.ext4 /dev/sdb1

创建挂载点并挂载硬盘

# 创建挂载点 mkdir -p /mnt/docker_data # 挂载硬盘 mount /dev/sdb1 /mnt/docker_data

这时硬盘就已经挂载好了


后面还需要迁移Docker数据:

迁移Docker数据

  1. 1. 修改Docker配置

    # 停止Docker服务 systemctl stop docker  #有的时候还需要systemctl stop docker.socket # 创建Docker新数据目录 mkdir -p /mnt/docker_data chmod 700 /mnt/docker_data # 修改Docker配置 sudo vim /etc/docker/daemon.json

    在文件中添加(如果文件不存在则创建):

    {   "data-root": "/mnt/docker_data",   "registry-mirrors": ["https://f1361db2.m.daocloud.io"] }

    保存退出后,此时不要重启docker。

  2. 2. 迁移docker数据

    # 迁移数据 cp -rp /var/lib/docker/* /mnt/docker_data/        #一般来说docker默认的目录就是/var/lib/docker # 检查迁移是否成功 ls /mnt/docker_data #重启docker systemctl start docker

此时应该是可以正常使用了,但是还有两个问题没有解决:

  1. 1. 满载磁盘空间还没有释放

  2. 2. Linux服务器重启之后命令挂载的磁盘需要手动挂载


释放磁盘空间

实际上就是把已经迁移到的文件夹删除掉
rm -rf /var/lib/docker

配置磁盘自动挂载

编辑/etc/fstab文件,添加以下内容:
vim /etc/fstab
添加行:
/dev/sdb1 /mnt/docker_data ext4 defaults 0 0
保存退出后,验证配置:

mount -a df -h | grep /mnt/docker_data

Tip:这里说一句,我在配置自动挂载的时候没有释放系统盘空间,导致写入fstab文件都报错,后来释放了磁盘空间之后就正常了。还有就是我这里只列举了添加一块硬盘的方法,实际上我是添加了两块硬盘,重复的部分我就懒得写了。

后记

在一个庞大的企业里面想从下向上改变是一件挺难的事情:

我知道我需要一个机房,我需要一台正式的服务器,我需要一个UPS。

或者我需要多个云服务器,我需要一个域名,我需要一个数字证书。

可是现在我什么都没有,我只有这个旧PC和一个有外网服务的IP,然后我用了自己购买的域名使用二级域名和cloudflare tunnel来搞定这些事情。

虽然我也跟领导提过,私下和会上都有提过,但是这样去增加一个PC部门不现实,我们的设备部更加对这个一窍不通。

3年的数据大约500GB,看来现在能够做的就是跟领导申请一个4T的硬盘,估计可以撑到我退休。