全省职业考试时服务器突然瘫痪,如何搞定?

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 某省政务云反馈:即将进行的全省职业考试的服务器重启后无法访问,导致全省在线考试系统瘫痪,如果不尽快解决,将影响上万个准备了数月的考生,时间紧迫,要求紧急处理。阿里云售后工程师先“曲线救国”优先保证启动系统,又抛除惯性思维,一步步梳理出症结所在。涉及的技术谈不上精深,但案例和总结都鲜活而生动。

369b142e9fdc0e0db4b9e1dc86f0e0031c9451de

本期云享团的分享嘉宾是闻战,擅长系统故障分析排查,热爱技术挑战。聚焦弹性计算方案应用。
对于云计算服务,闻战是这样理解的:“每一次托付,都是使命与责任并行!”

事件概述:

前几天,阿里云突然接到某省政务云反馈:即将进行的全省职业考试的服务器重启后无法访问,导致全省在线考试系统瘫痪,如果不尽快解决,将影响上万个准备了数月的考生,时间紧迫,要求紧急处理。阿里云售后工程师快速排查发现 Redis服务启动异常,导致后续启动条目卡住,随后尝试单用户chkconfig禁用该服务,优先保证启动系统。但是,重启后发现该组件再次启动,chkconfig多次强关无效。检查rc3.d、rc.local、profile、crontab等脚本并未发现针对redis服务的相关调用。

Hot点:

1、Linux启动流程。
2、服务启动顺序分析。
3、问题分析的方法思路。

影响程度:【紧急】

架构梳理:

screenshot.png

情景复现:

1、主机启动后,ping测试,EIP无法ping通。
2、VNC检查ECS服务器状态,停在启动进度条,按ECS键查看启动过程,发现redis服务启动异常。

screenshot.png

至此,小伙伴大多会初步判定redis服务启动异常,可以尝试禁用Redis服务后,优先保障系统正常启动,按提示写入相关语句到rc.local,进行后续排查,一个并不算太复杂的故障。

But,处理过程没有想象的这么顺利……

无法禁用的小强

1、重启服务器可以正常进入单用户模式,执行chkconfig命令禁用redis服务。

[root@iZ****<strong> ~]# chkconfig --list|grep redis-server
redis-server     0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@iZ</strong>**<strong> ~]# chkconfig redis-server --level 2345 off
[root@iZ</strong>**<strong> ~]# chkconfig --list|grep redis-server
redis-server     0:off   1:off   2:off    3:off    4:off    5:off    6:off
[root@iZ</strong>**** ~]# reboot

重启服务器后,神奇的一幕出现了,服务器再次停留在redis 启动界面。

screenshot.png

2、此刻我是怀疑人生的,难道redis服务没有禁用成功。

为排除原系统干扰,选择通过LiveCD方式切换chroot检查原系统配置。发现redis服务确实已关闭。

[@bash]$     sudo su
[root@bash]# mount /dev/xvda1 /mnt
[root@bash]# chroot /mnt
[root@bash]# chkconfig --list|grep redis-server
redis-server     0:off   1:off   2:off    3:off    4:off    5:off    6:off
[root@bash]# cat /etc/rc.local
#!/bin/sh
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
touch /var/lock/subsys/local

3、按照redis启动时的报错,在rc.local添加对应语句,检查rc.local 已经777有执行权限。保存重启后,还是卡在redis启动界面。

[root@bash]# echo “echo never > /sys/kernel/mm/transparent_hugepage/enabled”>>/etc/rc.local
[root@bash]# ls -al /etc/rc.local
lrwxrwxrwx. 1 root root 13 Aug 14  2014 /etc/rc.local -> rc.d/rc.local
[root@bash]# reboot

曲线救国

由于时间比较紧迫,为保障优先恢复用户业务(全省职业考试),想了一个不是办法的办法:

    在单用户下:先mv /usr/local/redis/bin/redis-server 进行重命名,由于开机找不到这个文件,系统会跳过加载。然后系统正常启动后,再mv把名称改回恢复业务。

但这始终不是一个长久的解决办法,问题的根源还是没有找到。

重整思路

哪里有些不对,忽略了什么细节呢?排查至此,有必要对之前的思路进行一次梳理重整。

1、单用户下能正常启动,把redis-server重命名也能正常启动,证明系统底层和内核是好的。

2、单用户和liveCD chkconfig验证,redis服务自启动是已经关闭的。

3、打点测试 rc.local和profile没有输出对应的log文件,说明系统还没有走到这一步就卡住了。也就是出现问题的环节,在加载rc.local之前。

[root@bash]# echo touch /root/rc_test.log  >>/etc/rc.local
[root@bash]# echo touch /root/pro_test.log >>/etc/profile
[root@bash]# reboot    //重启服务器进入liveCD模式
[@bash]$     sudo su 
[root@bash]# mount /dev/xvda1 /mnt
[root@bash]# cd /mnt/root
[root@bash]# ls -al |grep log|wc -l
0

但是,这个服务到底是怎么起来的呢?

破云见日

1、Linux启动流程

在【加电】→【启动内核】后,Linux进入【init】阶段,示意图如下。

screenshot.png

2、分析推论

对比启动流程逐步检查,分析/etc/inittab文件,发现启动级别为5。默认该启动级别应该为3(这也是刚开始检查rc3.d目录没发现异常的原因之一)。

screenshot.png

3、初见端倪

那么Linux启动时,会去加载/etc/rc5.d/目录中的服务配置,逐个检查该目录下的配置文件终于发现了端倪: S-1redis-server 这个文件,而我们明明在单用户和LiveCD中已经关闭redis服务,怎么还会出现这个服务的启动脚本呢。

随后通过chkconfig启用redis-server服务,对比rc3.d目录,确定了问题所在。

screenshot.png

4、原来如此

正常情况下,我们启用一个服务后,会在对应的rc*.d启动目录下,生成一个该服务的启动配置文件。而rc5.d启动级别,redis-server却有两个启动脚本,其中一个还是负数?!

测试通过chkconfig 关闭redis-server服务时,S-1redis-server不受管控。也就是系统t启动的时候,还是会加载这个服务,而且是插队加载。

Linux读取rc*.d目录加载启动服务时,会顺序读取S开头的配置脚本,辣么……编号为负数的启动条目会跑在所有启动项之前,导致系统卡住,并且不受 chkconfig 管束!!!

各位官人、剩下您知道怎么解了吧?

经验和总结

1、用户现场业务受影响时,应本着业务保障的第一原则,如果快速排查不能定位问题,要考虑是否有途径先恢复业务。可以让用户创建一个镜像进行排查。

2、经验能提高我们快速排障的效率,但有时候也是这些经验,会形成排查时的惯性思维,导致对细节的忽略。

不足之处,请大家随时拍砖。感谢。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
数据挖掘 数据库
服务器数据恢复—服务器raid磁盘故障离线导致阵列瘫痪的数据恢复案例
服务器数据恢复环境: 一台某品牌DL380服务器中3块SAS硬盘组建了一组raid。 服务器故障: RAID中多块磁盘出现故障离线导致RAID瘫痪,其中一块硬盘状态指示灯显示红色。服务器上运行的数据库在D分区,备份文件存放在E分区。由于RAID瘫痪,D分区无法识别,E分区可识别但是拷贝文件报错。管理员重启服务器,导致RAID中先离线的硬盘上线并开始同步数据,同步没有完成管理员意识到有问题,于是就强制关机了,之后就没有再动过服务器。
服务器数据恢复—服务器raid磁盘故障离线导致阵列瘫痪的数据恢复案例
|
2月前
|
存储 运维 数据挖掘
服务器数据恢复—EMC存储raid5阵列故障导致存储瘫痪的数据恢复案例
服务器存储数据恢复环境: 北京某企业一台EMC FCAX-4存储上搭建一组由12块成员盘的raid5磁盘阵列,其中包括2块热备盘。 服务器存储故障: raid5阵列中两块硬盘离线,热备盘只有一块成功激活,raid瘫痪,上层LUN无法使用,存储崩溃。
|
4月前
|
存储 运维 Oracle
服务器数据恢复—MSA2000存储raid5阵列瘫痪导致lun不可用的数据恢复案例
服务器存储数据恢复环境: 某品牌MSA2000存储,该存储中有一组由8块SAS硬盘(其中有一块热备盘)组建的RAID5阵列,raid5阵列上层划分了6个lun,均分配给HP-Unix小型机使用,主要数据为oracle数据库和OA服务端。 服务器存储故障: 该MSA2000存储RAID5阵列中2块硬盘出现故障离线,阵列中只有一块热备盘,虽然热备盘成功激活,RAID5阵列瘫痪,上层LUN无法使用,存储不可用。
服务器数据恢复—MSA2000存储raid5阵列瘫痪导致lun不可用的数据恢复案例
|
9月前
|
存储 数据挖掘
服务器数据恢复—EMC存储raid5阵列瘫痪的数据恢复案例
服务器存储数据恢复环境: EMC某型号存储,8块组建一组raid5磁盘阵列。上层操作系统采用zfs文件系统。 服务器存储故障&分析: raid5阵列中有2块硬盘未知原因离线,raid5阵列崩溃,上层应用无法正常使用。
服务器数据恢复—EMC存储raid5阵列瘫痪的数据恢复案例
|
域名解析 网络协议 容灾
AWS服务器遭DDoS攻击 瘫痪长达15小时!
阿里云HTTPDNS是面向移动开发者的一款域名解析产品,具有域名防劫持、精准调度的特性
3279 0
|
关系型数据库 Oracle 数据库
公司域服务器瘫痪后pdm服务器的恢复过程
我所在的公司的产品是工业级的工具(产品的复杂度来说,比电钻复杂很多,比汽车简单),生产模式属于按单生产,采用SAP和PDM作为公司运行的两个主要平台。上周六公司内网的域服务器瘫痪,准确的说是辅助域控制器瘫痪,因为主域控制器早在多年前就瘫痪了。
1502 0
|
10天前
|
Cloud Native Java 编译器
将基于x86架构平台的应用迁移到阿里云倚天实例云服务器参考
随着云计算技术的不断发展,云服务商们不断推出高性能、高可用的云服务器实例,以满足企业日益增长的计算需求。阿里云推出的倚天实例,凭借其基于ARM架构的倚天710处理器,提供了卓越的计算能力和能效比,特别适用于云原生、高性能计算等场景。然而,有的用户需要将传统基于x86平台的应用迁移到倚天实例上,本文将介绍如何将基于x86架构平台的应用迁移到阿里云倚天实例的服务器上,帮助开发者和企业用户顺利完成迁移工作,享受更高效、更经济的云服务。
将基于x86架构平台的应用迁移到阿里云倚天实例云服务器参考
|
7天前
|
编解码 前端开发 安全
通过阿里云的活动购买云服务器时如何选择实例、带宽、云盘
在我们选购阿里云服务器的过程中,不管是新用户还是老用户通常都是通过阿里云的活动去买了,一是价格更加实惠,二是活动中的云服务器配置比较丰富,足可以满足大部分用户的需求,但是面对琳琅满目的云服务器实例、带宽和云盘选项,如何选择更适合自己,成为许多用户比较关注的问题。本文将介绍如何在阿里云的活动中选择合适的云服务器实例、带宽和云盘,以供参考和选择。
通过阿里云的活动购买云服务器时如何选择实例、带宽、云盘

热门文章

最新文章