学院君网站昨天下午宕机不能访问及恢复复盘
关注学院君的朋友可能昨天下午 3 点半以后在访问学院君网站的时候都遇到不能访问的问题,今天我来复盘下问题定位和恢复流程,以便下次可以直接按照清单操作,也给遇到类似问题的朋友提供借鉴。
问题初步定位
目前学院君网站使用了两台阿里云 ECS,一台部署 Web 应用(后面简称为 app
),一台部署数据库和缓存(后面简称为 db
),登录到 app
服务器查看应用错误日志,提示 db
服务器拒绝连接,我首先尝试通过 SSH 远程登录 db
服务器,连接超时,也 ping 不通,因此我第一时间选择重启了 db
这台机器,重启耗时很长,重启之后仍然连不上,于是我选择在阿里云控制台通过 Web 界面远程连接,在连接成功后发现服务器其实并没有启动成功,而是报如下错误信息并且一直卡在这里:
这是磁盘的问题,导致数据库和 Redis 无法读写,进而导致 Web 应用无法访问。
提阿里云工单
登录不了 db
服务器,重启还失败,这就属于产品问题了,于是我尝试给阿里云提工单,那种机器人工单建议直接跳过,属于侮辱程序员智商的级别,既然有强大的搜索功能,还能更快找到需要的文档,要这傻瓜导航有啥用。人工工单入口在这里,藏的很深:
如果问题比较紧急,比如我这种,应用都挂了,请设置优先级为“重要”:
否则等到处理你的问题时,黄花菜都凉了。
提交之后,阿里云售后工程师很快介入处理了,于是我就去做别的事情了,以为凭着阿里云工程师的出色能力,应该很快就能搞定,事实证明,世界太复杂,是我太天真,too young too simple,even naive。
从下午3点50一直到晚上11点半我每次打开这个工单,除了授权、提交截图之外,得到的都是类似下面这样的回复:
我隐隐觉得有些不安,直到我11点半在知识星球发完微服务和PHP面试题日常分享,回头看到这个:
呜呜呜,感情搞了半天,将近6个小时,到最后还得我自己来处理呗,处理就处理,还要自己掏钱买云盘恢复数据呗,掏钱就掏钱,为啥不早点告诉我,比如下午下班前,还要我熬夜爆肝解决?。
这就好比,我的车子出了问题,去4s店维修,他们最后丢给我一堆工具,让我自己解决,嗯,有可能还缺工具,需要在4s店购买。
此刻我的心情是想骂人的:
不过活还得照干,网站还得恢复,所以我立即恢复了理智,开始自救之路。
初始化系统盘
有一说一,阿里云售后工程师解决问题能力差那么点火候,但是给清单的能力还是可以的,我想他们应该是受过系统化培训:解决不了的问题,无非是重启系统,重启系统还解决不了,那就重装系统!
嗯,上面给的解决方案细品一下就是这个万能套路,我们在自己的电脑已经无数次验证了它的正确性,正所谓知识不够,套路来凑。
接下来,我就是按照这个套路来恢复系统的,不得不说,这个屡试不爽的套路真香。下面给出我的清单:
- 对即将初始化的系统盘创建快照(备份现有系统数据),不了解怎么做的可以参考阿里云文档:https://help.aliyun.com/document_detail/25455.html;
- 快照创建完成后(需要花几分钟时间),在控制台打开购买云盘页面,购买和待初始化系统盘的服务器(我这里就是
db
服务器)处于相同可用区的云盘(否则后面无法挂载),选择从快照创建磁盘(上述第一步创建的快照),操作明细可以参考阿里云文档:https://help.aliyun.com/document_detail/32317.html,之所以要购买额外的云盘,是因为马上就要初始化购买 ECS 服务器时附带的系统盘了,上面的数据会全部丢失,需要把这个磁盘上的所有数据备份到外部存储介质,就好比重装系统前重要数据用 U 盘拷贝出来一样; - 完成上述数据备份工作后,接下来初始化
db
服务器系统盘,其实就是重装操作系统,并清空原来系统盘上的所有数据,具体操作细节参考阿里云文档:https://help.aliyun.com/document_detail/25449.html; - 最后,将上述第二步购买并从快照初始化的云盘挂载到
db
服务器,操作明细见阿里云文档:https://help.aliyun.com/document_detail/25446.html。
至此,就已经可以通过 SSH 远程登录到重装系统后的 db
服务器了。
挂载快照盘
在界面上挂载完成后,还没有完事,还需要进入 db
服务器内部,结合 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_logfile0
、ib_logfile1
、ibdata1
等)访问权限也要调整为 mysql:mysql
。
再次访问数据库 xueyuanjun
,就可以看到所有数据表和数据都已经恢复了,至此,数据库恢复工作完成,Redis 主要保存的是缓存数据,无需做数据恢复,只需要重新安装并启动即可。
如果想要从其他机器访问这台 db
服务器的数据库,还要编辑 MySQL 配置文件(具体位置因系统而异,比如 Ubuntu 系统是 /etc/mysql/mysql.conf.d/mysqld.cnf
),注释掉如下这行配置(修改完配置需要重启 MySQL 服务器):
bind-address = 127.0.0.1
MySQL 数据库和 Redis 服务恢复正常后,学院君网站自然也恢复正常了:
复盘小结
以上,就是昨天下午学院君网站不能访问以及恢复过程的复盘,总结下来,凡事主动性还是在自己,不要过于依赖别人,别人往往是靠不住的,然后就是数据库的备份,要多处存放,否则有单点隐患,这样,下次遇到类似问题,可以快速切换机器提供服务,而不是要等到服务器恢复,这个过程和时间往往是不可控的。
后续维权
问题处理了,最后的损失谁来买单呢,时间精力啥的先不论,人在家中坐,锅从天上来花出去的 100 块云盘血汗钱无论如何要追讨回来,毕竟这是阿里云的产品问题导致的计划外支出,好在阿里云毕竟是大厂,财大气粗,没有和我过多扯皮,虽然电话沟通的时候售后客服一度试图用技术术语唬我,但我是不懂技术的菜鸟,王八念经,不听不听,我只关心我啥也没做,网站就挂了,之后他们就很爽快的就把钱以代金券的方式返给我了:
反正马上又要续费域名了,正好用上,就这么了了吧。至于耽误了我刷庆余年第29集的事情,就算了吧,做人不能太计较鸡毛蒜皮的小事情。
5 Comments
看来阿里水货也不少,学员君是大牛还能自己解决问题,碰见不懂行的只能吃个哑巴亏.之前买了阿里云服务器,居然直接有人到我公司来推广云产品了,令人毛骨悚然
是的 大牛不敢当 我之前也接到阿里云的推销电话 问我为啥最近没有登录阿里云后台 我说我不登录不是代表你们服务做得好吗 又不是社交网站 天天让人刷活跃度 阿里云现在是一家销售公司
哈哈哈哈哈,耽误刷剧了233
前几天也遇到同样问题,服务器重启后就登不进去了。严重怀疑他们的产品搞鬼,有一次客服打电话推销他们的 ddos高仿产品。我没买,结果没过几天 网站被ddos攻击了好几天。就觉得很蹊跷,可是咱又没证据。
钓鱼执法?