一. 问题描述
我们去面试时,有些面试官会经常问我们:你都遇到过哪些线上的故障?是解决这些线上故障的?今天千锋就给大家讲解一个比较奇葩的线上故障,问题如下所示:
线上集群中,某一台服务器频繁重启是怎么回事?如何解决?
下面是千锋的线上服务器架构图:
二. 问题排查
为什么会出现线上某台服务器频繁重启呢?为了搞清楚问题所在,我们可以按照如下思路来进行问题排查。
首先我给大家说明一下,千锋的线上服务器,请求负载均衡策略是采用的是轮询机制,请求数量平均分配。
接下来我们可以定位一下故障发生的时间点。在本案例中,我的线上服务器重启的时间段基本是固定的,所以我就可以在那个特定的时间段内进行监控。
然后我们再来分析一下,服务器重启可能有哪些常见的原因:
硬件风扇散热不好,造成服务器过热,服务器会重启---->我的服务器风扇没有问题,排除掉;
检查内存空间是否充足。可以在那个时间段通过top命令监控CPU和内存的利用率,看看是否在那个时间段内硬件资源消耗殆尽了;
软件原因。服务器内部是否有什么任务代码,在那个时间段会将硬件资源耗尽,造成重启。
通过以上排查方法,我既没有发现风扇有问题,也没有发现在服务器中除了当前自己的应用外,还有其他大型应用在占用硬件资源。但通过top命令,我却在服务器经常重启的时间段内,发现硬件CPU和内存资源在某一个时间段内提升地特别快,进而造成硬件资源耗尽,服务器重启。
那么如果在没有外部软件占用资源的情况下,CPU和内存资源的消耗更多地是由自己的软件耗尽的。所以现在我们可以初步诊断出,是当前自己的应用在处理请求能力上较差,造成大量请求累积。
为了验证结论是否正确,千锋使用了jmeter压力测试工具,对集群中几台没有问题的服务器和当前服务器进行测试对比,结果发现当前出现问题的服务器在处理请求能力上与其他服务器相比速度较慢。
最终,千锋通过以上经验推测和测试方法得出结果,之所以会出现线上服务器经常重启,此处主要是因为某台服务器硬件性能较差,在轮询策略分配请求时,平均分配造成当前机器请求的积压过多,承载不了,从而产生系统重启。
三. 解决方案
针对这个问题,解决方案如下:
修改分布式请求策略。虽然轮询策略平均分配了请求数,但由于不同配置的机器对相同请求的处理能力不同,有可能会出现个别服务器无法承载过多压力而崩溃的情况;
给请求的机器地址添加权重。我们也可以给出现问题的机器分配较少的权重,在请求分配时,给配置较低的服务器少分配一些权重,避免造成请求积压。
现在你知道如何排查线上服务器的类似故障了吗?如果你还有其他问题,可以在评论区留言哦。关注Java架构栈,干货天天都不断哦。