程永新
(上海新炬网络信息技术股份有限公司,广东 广州 510623)
随着互联网行业的飞速发展,传统的单机架构已经无法满足海量的计算处理需求,因此分布式解决方案(集群技术)应运而生。集群技术可以使用较为廉价的硬件获得性能上的水平扩展,且可靠性和灵活性也有较强的保证,因此这种技术在应用服务、负载均衡、数据库、大数据等领域获得了广泛应用。然而,使用廉价硬件导致硬件故障成为常态,复杂的互联方式使得系统架构复杂,分布式的处理逻辑使得软件问题追踪困难,这些问题都导致对集群的运维远比传统的单机运维困难。基于此,本文提出一种集群健康度评价方法,运用机器学习和大数据技术,量化评价集群整体和各个节点的运行情况,从而为集群故障处理提供指引。
首先,本方法通过使用异常检测算法,可以判断集群每个节点和集群整体当前是否存在故障。这种故障判定具有准实时性、精准性的特征。如果整个集群都很繁忙,则节点繁忙才是正常的,节点空闲则不正常;同理,如果整个集群都很空闲,则节点空闲才是正常的,节点繁忙则不正常。
其次,通过使用故障预测算法,集群的运行情况往往呈现出某种规律性、延续性,可使用最近一段时间的指标走势大致推断今后较短时间内的指标情况。本方法利用了这种规律性,以某指标近N个周期的集群维度汇聚值来推测今后某个周期的值,再综合各指标的预测值来计算集群健康度的预测值。
最后,通过综合两者得到集群健康度的评价值。
图1为本方法的实现流程图。
结合图1,本方法的具体实现过程描述如下:
(1)步骤1:以一定频率采集上游集群的各种硬件性能指标,包括并不限于CPU使用率、内存使用量/率、操作系统进程数、磁盘IO次数、磁盘空间使用量/率、网络出入流量等可以反映硬件层面工作状况的指标。
(2)步骤2:以一定频率采集上游集群的各种软件性能指标,包括并不限于特定进程每秒响应请求数、内存使用量、端口连接数等可以反映该节点软件层面工作状况的指标。
(3)步骤3:将步骤1和步骤2中采集到的硬件、软件性能指标储存到某种介质中,可使用的介质需要支持再次读取指标进行计算,包括并不限于本地硬盘、数据库、内存、网络存储、消息队列等。
(4)步骤4:为保证采集到的指标的数据质量,需要对已储存的指标数据进行清洗,方法包括并不限于:
◆残缺数据清洗。由于硬件故障、软件故障、网络超时等非正常因素,可能会出现某些采集批次中的某些指标未采到值的情况。为便于后续步骤识别和处理,可使用某种默认值填充逻辑来进行补全(按需选择填充0、填充负值、填充NaN等任意一种方式),如果后续步骤兼容性好,也可不做补全处理。
图1 健康度评价方法流程图
◆错误数据清洗。由于硬件故障、软件故障、统计误差等非正常因素,可能会出现某些采集批次中的某些指标出现错误数据的情况。例如CPU使用率超过100%、物理内存使用量超过物理内存安装量等情况。为保证后续步骤工作正常,可使用某种替换逻辑来进行纠正(按需选择替换为0、替换为最大值、替换为上周期值等任意一种方式)。
◆重复数据清洗。由于硬件故障、软件故障、网络超时等非正常因素,可能会出现某些采集批次中的某些指标出现多于一个值的情况。为保证后续步骤工作正常,可使用某种保留逻辑来进行纠正(按需选择保留第一个、保留最后一个、保留最大值、保留最小值等任意一种方式)。
(5)步骤5:为了将各种不同计量单位的指标缩放到近似相同的区域内(一种较好的选择是[0,1]),需要对清洗后的数据进行预处理。方法包括并不限于:
◆占比法。使用实际值除以物理门限值,如物理内存使用量指标,使用实际物理内存使用量除以物理内存安装量。
◆最大最小值法。这种方法需要大致了解该指标历史上出现过的最大值和最小值。如操作系统进程数指标,实施者清楚其历史最大值Max和历史最小值Min,且有本周期实际值Act,则可使用(Act-Min)/(Max-Min)。
◆对数法。这种方法适合实际值的标量较大,且无法确定物理门限值或历史最大最小值的情况。如磁盘IO次数,有本周期实际值Act,可使用lognAct,对数的底n可根据实际情况选择2、e或10等值。这种方法缺点是不一定能缩放到[0,1]的区间内。
对于预处理后的数据,可写回步骤3所述的存储介质,也可保留在内存中供后续使用。
(6)步骤6:根据执行异常检测算法需要的指标,取出集群每个节点上这些指标最近一个周期的值。需注意,该步骤和步骤4、步骤5之间不一定有先后关系,即可以先执行步骤4和步骤5再执行步骤6,也可以先执行步骤6再执行步骤4和步骤5。
(7)步骤7:对于步骤6取出的每个指标,将该集群每个节点的该指标汇聚到一起,使用异常检测算法进行计算,得到该指标的节点正常概率值。通常步骤6的数据有多少种指标,就要执行多少次异常检测算法。
如使用者设定异常检测算法将检测n种指标,集群共有m个节点。对第j种指标,假设最近一个周期采集到的值为{Act(1), Act(2), …, Act(m)}计算这组值的均值μ、方差σ2和该指标的节点正常概率值,其中i是节点编号。
(8)步骤8:在步骤7得到每个指标的节点正常概率值后,使用以下公式计算第i个节点的正常概率值p(i):
对该值归一化得到该节点的健康度瞬时值,归一化方法可根据实际需求选择最大值法、梯度法等的一种。为不失一般性,本方法以最大值法为例,设所有m个节点的p(i)的最大值为pmax,则该节点的健康度瞬时值H(i)可使用如下公式计算:
(9)步骤9:在步骤8得到节点的健康度瞬时值后,对每个节点判断节点的健康度瞬时值是否低于阈值,该阈值可根据经验和集群的实际工作状况指定。如设置为60,如果集群各节点存在安装的软件不一致或数据量不均匀等偏差情况,也可对每个节点单独设置阈值。如果有节点健康度瞬时值低于阈值,则跳转到步骤10;否则若全部节点均无低于阈值的情况,跳转到步骤11。
(10)步骤10:如果步骤9判断的结果为是,则执行本步骤,将这些节点的健康度瞬时值储存到某种介质中,可选的介质类型参考步骤3。
(11)步骤11:计算集群当前时刻的健康度瞬时值Hcur,可使用的评价算法包括并不限于:
◆健康节点计数法。步骤9中,对每个节点判断节点的健康度瞬时值是否低于阈值,不低于阈值的节点称之为健康,则Hcur=(健康节点数/总节点数)×100。
◆最低值法。即使用最小的节点健康度瞬时值作为整个集群的健康度瞬时值,Hcur=miniH(i)。
◆平均数法。即使用所有节点健康度瞬时值的平均数作为整个集群的健康度瞬时值。
◆中位数法。即使用所有节点健康度瞬时值的中位数作为整个集群的健康度瞬时值。
(12)步骤12:在步骤11得到集群的健康度瞬时值后,判断集群的健康度瞬时值是否低于阈值,该阈值可根据经验和集群的实际工作状况指定,如设置为60。如果低于阈值,则跳转到步骤13;否则,跳转到步骤14。
(13)步骤13:如果步骤12判断的结果为是,则执行本步骤,将该集群的健康度瞬时值储存到某种介质中,可选的介质类型参考步骤3。
(14)步骤14:根据执行故障预测算法需要的指标,取出集群每个节点上这些指标最近N个周期的值。N的值可以根据指标采集频率、所需的故障预测精度等考量,在实施时确定。如采集频率为1 min,可将N设置为15、30或60等。需注意,该步骤和步骤4、步骤5之间不一定有先后关系,即可以先执行步骤4和步骤5再执行步骤14,也可以先执行步骤14再执行步骤4和步骤5。
(15)步骤15:故障预测算法首先对步骤11取出的每个节点的最近N个周期的指标,按指标名和所属时间周期聚合出集群维度的最近N个周期的值,聚合方法包括并不限于:
◆最低值法。即对某指标和某周期,使用所有节点中最小的指标值作为整个集群的指标值。
◆平均数法。即对某指标和某周期,使用所有节点的平均指标值作为整个集群的指标值。
◆中位数法。即对某指标和某周期,使用所有节点的中位数指标值作为整个集群的指标值。
设上述计算得到指标Y的集群维度的最近N个周期的值分别为yi,其中i=1, 2, …, N。令xi为第i个指标采集时刻的系统时间毫秒数,则这N个值可用(xi, yi)表示。设有曲线y=Φ(x),需要使该曲线能近似穿过这N个点,即求解曲线拟合问题。拟合的方法包括并不限于:
◆最小二乘法;
◆指数平滑法;
◆Bezier曲线法;
◆B样条曲线法。
实际使用时,因不同指标数据点的波动情况千差万别,可使用多种方法对历史数据测试后选取预测效果最好的。为不失一般性,本方法使用最小二乘法来求解。设曲线在样本(xi, yi)处的偏差σi=Φ(xi)-yi,最小二乘法需要求解以下最小值问题:
若拟合曲线为k阶多项式,即y=Φ(x)=a0+a1x+…+akxk。最小值问题等同于求解a0, a1, …, ak的值,使得最小。
推导可得解为A=(X′*X)-1*X′*Y,其中:
预测指标Y未来的可能值,将未来某时刻的毫秒数值代入y=Φ(x)即可。如预测下一个时间周期的值(xN+1, yN+1),使用yN+1=Φ(xN+1)计算。在本方法中使用yN+1作为该指标的未来预测值,实际实施中也可使用其它周期的y值。
(16)步骤16:计算集群的健康度预测值使用如下方法。设指标Yj的阈值为Tj,该阈值可根据经验和集群的实际工作状况指定,未来预测值为Pj。指标Yj的健康度预测值Hj可用如下公式估计:
集群的健康度预测值Hpre可用如下公式估计,其中n为指标种类总数:
(17)步骤17:在步骤16得到集群的健康度预测值后,判断集群的健康度预测值是否低于阈值。该阈值可根据经验和集群的实际工作状况指定,如设置为60,如果低于阈值,则跳转到步骤18;否则,跳转到步骤19。
(18)步骤18:如果步骤17判断的结果为是,则执行本步骤,将该集群的健康度预测值储存到某种介质中,可选的介质类型参考步骤3。
(19)步骤19:加权计算集群健康度的评价值,集群健康度的评价值可用如下公式计算:
其中α、β为系数且有α≥0,β≥0,α+β=1。具体实施时,根据实际监控场景更关注处理当前故障还是更关注预防未发生的故障,来设定α、β的具体值。
(20)步骤20:将步骤19计算得到的集群健康度的评价值储存到某种介质中,可选的介质类型参考步骤3。
该数据可以通过多种方式提供给配套的评价数据消费系统使用,如推方式(集群健康度评价系统将集群健康度的评价值发送给消费系统)、拉方式(消费系统在需要的时候从本步骤所述存储介质中读取数据),如图2所示:
图2 健康度评价数据应用示意图
以某省级电信运营商分布式业务系统为例,在原有环境下,当业务部门发现业务异常时联系运维部门进行分析。运维部门需要对平台内的分布式集群进行故障排查,由于分布式集群涉及软件较多,且内部交互非常复杂,通常需要进行逐步排查,确定故障点并进行解决,基本流程如图3所示。
引入健康度实时自动化评价系统后,问题的处理方式转变为图4所示,由于增加了主动排查与自动定位,并减少了复杂的分步排查环节,加之可以实时查看集群健康度,更快定位故障点,使得问题定位准确率与预警及时率上升,故障处理平均时长明显下降。
(1)故障处理耗时减少。2017年5月—8月故障处理平均时长为30.25 min,2017年9月初引入本文评价方法后,2017年9月—12月故障处理平均时长下降至10.75 min,具体如图5所示。
图3 原有故障排查流程
图4 改进后的故障排查流程
图5 故障处理平均时长比较
(2)预警及时率提升。在原有环境下,多由业务部门首先发现异常,本文评价方法实施后,运维部门可以先于业务部门发现异常及故障点,做到提前预警。对比实施前后四个月的预警及时率,预警及时率由平均85.5%提升至97%,提升了13.5%,如图6所示:
图6 预警及时率对比
(3)故障初步定位准确率上升。在故障发生时需要快速对故障进行初步诊断,而初步诊断的结果往往影响后续处理的方向。本文评价方法可以通过检查具体指标对应的模块,快速定位故障点,有很强的指导作用。对比实施前后四个月的定位准确率,由平均73%上升至91.5%,提高了25%,如图7所示:
图7 问题初步定位准确率对比
本文通过使用异常检测算法,利用了集群中个别和整体的关系,以节点各种指标在整个集群内的概率分布来评价节点的瞬时健康情况,进一步可使用多种算法计算集群整体的瞬时健康情况,使得技术人员可以及时发现、精确定位故障。通过使用故障预测算法,可以预测集群在未来某个时刻的运行情况,能够较准确地预测指标的变化情况,使得技术人员可以提前预知集群性能的异常波动,采取干预手段。综合异常检测与预测算法得到的集群健康度评价值,可以对集群整体健康状况有量化、直观的感受,便于从更高层面统领全局、随时监控。
通过在大型分布式系统中的实际应用及效果分析表明,本方法可以在运维工作中更好地掌握集群的健康状态,显著地减少了故障处理的时间,使得故障预警更加及时,故障初步定位更加准确,有助于提高业务系统的整体稳定性和可用性。