问题场景
- 我们在某地部署信控平台,当初是在产品研发早期,采取的还是Windows服务器部署虚拟机的方式
- 使用virtualbox导入centos7虚拟机,虚拟机里运行docker服务,使用docker-compose统一管理
- 客户今天上午反馈,昨天断电了两次,平台没有自动重启没有启动起来,收到执行启动命令也卡主不动
- 卡主的位置,对应的一条语句是
docker network create signal-network
,创建网络
解决
container
- 看着页面卡主了,检查了下内存占用和磁盘空间,都没问题,重复执行还是卡主
- 首先让维保人员,把虚拟机关掉,又重启了一次,毕竟重启解决大部分问题
- 重启后,还是不行,然后怀疑docker服务有问题,执行
docker -v
发现也没反应,还是卡主,确定是docker服务有问题了
- 执行docker服务的重启命令
systemctl restart docker
,还是不行 - 想着要先想办法把docker关掉,再启动试试,于是试着分开命令执行,还是不行
systemctl stop docker
systemctl stop docker.socket
systemctl stop docker.service
systemctl stop docker
systemctl restart docker
- 使用
journalctl - xe
查看报错信息,发现containerd
没启动起来,使用命令systemctl status containerd
也是一样,加上-l
查看详细信息
- 这个时候知道事情不简单了,感觉应该是断电导致文件损坏了,先去网上搜索下,解决这个
containerd
- 异常断电,文件损坏,一般都是正在读写的文件,于是按照搜索结果,删除
containerd
的文件夹里的文件执行命令,containerd
可以了
rm -rf /var/lib/containerd/*
systemctl restart containerd
docker服务
-
继续执行docker服务的重启命令
systemctl restart docker
,还是不行,头大,卡在了启动过程systemctl docker activating (start)
,一直启动不起来
-
感觉像是启动过程中卡主卡死了,于是想着把进程
ps -ef|grep docker
直接干掉kill -9 xxx xxx ...
,再启动试试,还是不行 -
想着
containerd
都解决了,也是实在不想重装虚拟机,就继续搜索解决。systemctl status docker -l
继续查看详细报错信息
-
想着是不是网络问题,搜索结果里也有些说是防火墙影响的,先关闭防火墙
systemctl stop firewalld
,重启虚拟机,再启动docker解决,我试了下,不行 -
此时
docker -v
可以了,有输出了,以为好了,很高兴 -
试了下其他命令如
docker images
,还是不行,会报错Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon
-
systemctl status docker -l
查看status,发现新的报错start request repeated too quickly for docker.service
-
使用
journalctl -u docker.service
继续查看更详细的日志,发现启动某个容器时报错了,就去把容器文件夹都删了,还是不行 -
没招了,重装系统是不可能的,就把docker卸载了,然后重装,可以了
rm -rf /var/lib/docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /etc/docker
rm -rf /etc/systemd/system/docker.service.d
- 此处还有两个小插曲,一是可能没删干净,准备的rpm包,不能使用命令
rpm -ivh *.rpm
一次性安装完成,只能一个个执行 - 第二是,这种重装会将已有的镜像和容器全部删干净,如果没有备份镜像或将可变数据映射到本地卷,数据就会丢失了
- 我们所有要的数据,都映射到其他目录了,所以可以放心删除和重装,镜像也都有现成的,重新装载即可
数据库服务
-
docker搞定后,发现
PostgreSQL
数据库文件也损坏了,数据库启动不了,找不到 checkpoint
-
幸好,我每天都对数据库文件夹全量备份,删掉现有的,还原即可
-
坑爹的是,第一次还原时,忘了把数据库停掉,还原的文件也不对,只好重来
-
数据库关闭,文件夹情况,还原备份文件,搞定
后续
-
异常断电,容易造成损坏,Windows服务器套虚拟机更是如此,一定要做好备份工作
-
下次如果再出问题,导出一份数据库后,直接还原到这个日期就行
-
再把数据库也导进去,就是最新状态了(其他缓存和队列里的数据无所谓)