记一次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. 修改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. 迁移docker数据
# 迁移数据 cp -rp /var/lib/docker/* /mnt/docker_data/ #一般来说docker默认的目录就是/var/lib/docker # 检查迁移是否成功 ls /mnt/docker_data #重启docker systemctl start docker
此时应该是可以正常使用了,但是还有两个问题没有解决:
-
1. 满载磁盘空间还没有释放
-
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的硬盘,估计可以撑到我退休。