学院君网站昨天下午宕机不能访问及恢复复盘

关注学院君的朋友可能昨天下午 3 点半以后在访问学院君网站的时候都遇到不能访问的问题,今天我来复盘下问题定位和恢复流程,以便下次可以直接按照清单操作,也给遇到类似问题的朋友提供借鉴。

问题初步定位

目前学院君网站使用了两台阿里云 ECS,一台部署 Web 应用(后面简称为 app),一台部署数据库和缓存(后面简称为 db),登录到 app 服务器查看应用错误日志,提示 db 服务器拒绝连接,我首先尝试通过 SSH 远程登录 db 服务器,连接超时,也 ping 不通,因此我第一时间选择重启了 db 这台机器,重启耗时很长,重启之后仍然连不上,于是我选择在阿里云控制台通过 Web 界面远程连接,在连接成功后发现服务器其实并没有启动成功,而是报如下错误信息并且一直卡在这里:

阿里云ECS重启失败

这是磁盘的问题,导致数据库和 Redis 无法读写,进而导致 Web 应用无法访问。

提阿里云工单

登录不了 db 服务器,重启还失败,这就属于产品问题了,于是我尝试给阿里云提工单,那种机器人工单建议直接跳过,属于侮辱程序员智商的级别,既然有强大的搜索功能,还能更快找到需要的文档,要这傻瓜导航有啥用。人工工单入口在这里,藏的很深:

创建工单

如果问题比较紧急,比如我这种,应用都挂了,请设置优先级为“重要”:

紧急工单

否则等到处理你的问题时,黄花菜都凉了。

提交之后,阿里云售后工程师很快介入处理了,于是我就去做别的事情了,以为凭着阿里云工程师的出色能力,应该很快就能搞定,事实证明,世界太复杂,是我太天真,too young too simple,even naive。

从下午3点50一直到晚上11点半我每次打开这个工单,除了授权、提交截图之外,得到的都是类似下面这样的回复:

工单回复1

工单回复2

工单回复3

工单回复4

我隐隐觉得有些不安,直到我11点半在知识星球发完微服务和PHP面试题日常分享,回头看到这个:

工单回复5

呜呜呜,感情搞了半天,将近6个小时,到最后还得我自己来处理呗,处理就处理,还要自己掏钱买云盘恢复数据呗,掏钱就掏钱,为啥不早点告诉我,比如下午下班前,还要我熬夜爆肝解决😓。

这就好比,我的车子出了问题,去4s店维修,他们最后丢给我一堆工具,让我自己解决,嗯,有可能还缺工具,需要在4s店购买。

此刻我的心情是想骂人的:

33c6ce33960a14ec22f9869dae77cecf

不过活还得照干,网站还得恢复,所以我立即恢复了理智,开始自救之路。

1B2285C3F4FF3C11A5ACC44AF164A30F

初始化系统盘

有一说一,阿里云售后工程师解决问题能力差那么点火候,但是给清单的能力还是可以的,我想他们应该是受过系统化培训:解决不了的问题,无非是重启系统,重启系统还解决不了,那就重装系统!

嗯,上面给的解决方案细品一下就是这个万能套路,我们在自己的电脑已经无数次验证了它的正确性,正所谓知识不够,套路来凑。

接下来,我就是按照这个套路来恢复系统的,不得不说,这个屡试不爽的套路真香。下面给出我的清单:

  1. 对即将初始化的系统盘创建快照(备份现有系统数据),不了解怎么做的可以参考阿里云文档:https://help.aliyun.com/document_detail/25455.html
  2. 快照创建完成后(需要花几分钟时间),在控制台打开购买云盘页面,购买和待初始化系统盘的服务器(我这里就是 db 服务器)处于相同可用区的云盘(否则后面无法挂载),选择从快照创建磁盘(上述第一步创建的快照),操作明细可以参考阿里云文档:https://help.aliyun.com/document_detail/32317.html,之所以要购买额外的云盘,是因为马上就要初始化购买 ECS 服务器时附带的系统盘了,上面的数据会全部丢失,需要把这个磁盘上的所有数据备份到外部存储介质,就好比重装系统前重要数据用 U 盘拷贝出来一样;
  3. 完成上述数据备份工作后,接下来初始化 db 服务器系统盘,其实就是重装操作系统,并清空原来系统盘上的所有数据,具体操作细节参考阿里云文档:https://help.aliyun.com/document_detail/25449.html
  4. 最后,将上述第二步购买并从快照初始化的云盘挂载到 db 服务器,操作明细见阿里云文档:https://help.aliyun.com/document_detail/25446.html

至此,就已经可以通过 SSH 远程登录到重装系统后的 db 服务器了。

挂载快照盘

在界面上挂载完成后,还没有完事,还需要进入 db 服务器内部,结合 df -hfdisk -l 命令查看那个云盘没有完成最终挂载:

df -h

fdisk -l

显然这里 /dev/vdb1 没有分配,需要通过 mount 命令进行手动挂载,比如我将其挂载到 /mnt/data,可以这么做:

mkdir -p /mnt/data          // 先创建对应目录路径
mount /dev/vdb1 /mnt/data   // 完成挂载

这样才算完成最终挂载,通过 df -h 可以查看对应的目录信息:

查看是否挂载成功

此时就可以进入 /mnt/data 查看之前备份的数据盘数据了。

恢复数据库数据

最后,也是核心环节,恢复 MySQL 数据库数据,这里由于系统盘已经初始化了,可以通过如下命令重装 MySQL 数据库:

apt-get update
apt-get install mysql-server

默认安装的 MySQL ROOT 用户没有密码,可以直接登录:

mysql -u root

可以通过如下命令来设置 ROOT 用户密码:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root-password';

接下来,创建一个用户级数据库:

create database xueyuanjun default charset utf8mb4 collate utf8mb4_general_ci;
create user nonfu identified by 'user-passwd';
grant all privileges on xueyuanjun.* to nonfu@'%' identified by 'user-passwd';
flush privileges;

现在这个数据库 xueyuanjun 是空的,需要将其从备份快照盘中拷贝过来:

cp -r /mnt/data/var/lib/mysql/xueyuanjun /var/lib/mysql/
chown mysql:mysql -R /var/lib/mysql/mysql  // 调整目录权限

注:MySQL 默认存储位置是 /var/lib/mysql,如果你修改过需要调整。

如果数据库存储引擎是 MyISAM 的话,以上操作就够了,如果是 InnoDB 的话,还需要拷贝 idb* 文件:

cp /mnt/data/var/lib/mysql/ib* /var/lib/mysql/

同样,上述几个 ib* 文件(ib_logfile0ib_logfile1ibdata1 等)访问权限也要调整为 mysql:mysql

再次访问数据库 xueyuanjun,就可以看到所有数据表和数据都已经恢复了,至此,数据库恢复工作完成,Redis 主要保存的是缓存数据,无需做数据恢复,只需要重新安装并启动即可。

如果想要从其他机器访问这台 db 服务器的数据库,还要编辑 MySQL 配置文件(具体位置因系统而异,比如 Ubuntu 系统是 /etc/mysql/mysql.conf.d/mysqld.cnf),注释掉如下这行配置(修改完配置需要重启 MySQL 服务器):

bind-address          = 127.0.0.1

MySQL 数据库和 Redis 服务恢复正常后,学院君网站自然也恢复正常了:

学院君网站恢复

复盘小结

以上,就是昨天下午学院君网站不能访问以及恢复过程的复盘,总结下来,凡事主动性还是在自己,不要过于依赖别人,别人往往是靠不住的,然后就是数据库的备份,要多处存放,否则有单点隐患,这样,下次遇到类似问题,可以快速切换机器提供服务,而不是要等到服务器恢复,这个过程和时间往往是不可控的。

后续维权

问题处理了,最后的损失谁来买单呢,时间精力啥的先不论,人在家中坐,锅从天上来花出去的 100 块云盘血汗钱无论如何要追讨回来,毕竟这是阿里云的产品问题导致的计划外支出,好在阿里云毕竟是大厂,财大气粗,没有和我过多扯皮,虽然电话沟通的时候售后客服一度试图用技术术语唬我,但我是不懂技术的菜鸟,王八念经,不听不听,我只关心我啥也没做,网站就挂了,之后他们就很爽快的就把钱以代金券的方式返给我了:

阿里云工单回复6

反正马上又要续费域名了,正好用上,就这么了了吧。至于耽误了我刷庆余年第29集的事情,就算了吧,做人不能太计较鸡毛蒜皮的小事情。

上一篇: 网站日常功能优化和问题修复[20191201]

下一篇: 学院君微信视频号已开通,我将基于它进行技术微分享