拒绝组团宕机!关于缩短MTTR的万字探索

指尖上的架构 2024-08-15 22:33:12

当系统出现故障时,需要通过一些指标来衡量故障的严重程度和影响范围,其中MTTR(Mean Time To Repair 名为平均修复时间)是一个非常重要的指标。本文将从监控报警识别、如何快速发现问题、快速止血缓解系统线上问题、利用现有工具智能分析、快速定位解决问题等维度来降低MTTR,最后编写了团队快速缩短MTTR三字经,提升系统稳定性。

一、什么是MTTR

在今年的敏捷团队建设中,我通过Suite执行器实现了一键自动化单元测试。Juint除了Suite执行器还有哪些执行器呢?由此我的Runner探索之旅开始了!

当系统出现系统故障时,需要通过一些指标来衡量故障的严重程度和影响范围。其中MTTR(Mean Time To Repair名为平均修复时间)是一个非常重要的指标,它可以帮助了解修复系统所需的平均时间。花费太长时间来修复系统是不可取的,尤其对于京东这样的企业来说更是如此。如果MTTR过长,可能会导致用户结算卡单、影响公司收入损失等严重后果。因此,为了确保系统的稳定性和可靠性,需要尽可能地缩短MTTR。

图1

要计算MTTR,就是将总维护时间除以给定时间段内维护操作的总数,MTTR计算公式:

图2

二、如何缩短MTTR

了解MTTR对于任何组织来说都是一个非常重要的工具,因为它可以帮助更好地响应和修复生产中的问题。在大多数情况下,组织都希望通过内部维护团队来降低MTTR,这需要必要的资源、工具以及软件支持。

那么,您可以采取哪些步骤来缩短组织的MTTR呢?最好的起点是了解MTTR的每个阶段并采取措施减少每个阶段的时间。具体来说,可以考虑以下几个方面:

1.问题发现时间:监控报警识别故障

对于发生故障后技术人员识别问题的时间段,可以通过建立报警系统来缩短MTTR识别时间。通过实时监测系统的运行情况,及时发现并触发报警机制,可以帮助在最短的时间内定位问题,并采取相应的措施进行修复。

可以通过设置合理的阈值和规则,过滤掉那些不必要的告警信息,从而避免告警噪音对开发运维团队的干扰,让他们更加专注于真正的问题。

1)UMP监控

通过UMP实现3个黄金监控指标(可用率、调用量、TP99)。

在配置报警机制时,可以综合考虑可用率、TP99以及调用量等因素来进行评估。通过这些指标的综合评估,可以帮助我们更全面地了解系统运行情况,从而及时发现潜在的问题并采取相应的措施。

建议在进行报警配置时,可先采取较为严格的策略,即先紧后松,逐步调整到最佳状态。这样可以确保在最开始阶段就能够及时发现问题,避免出现重大故障。但随着系统的逐渐稳定,也可以根据实际情况适当放宽报警阈值,以提高系统的可用性和效率。

需要注意的是,在进行报警配置时,需要结合具体的业务场景和系统特点来进行调整和优化。不同的系统可能存在不同的风险点和瓶颈,因此需要根据实际情况来制定相应的报警策略,以保证系统的稳定性和可靠性。

critical告警方式:咚咚、邮件、即时消息(京ME)、语音可用率:(分钟级)可用率 < 99.9% 连续 3 次超过阈值则报警,且在 3 分钟内报一次警。性能:(分钟级)TP99 >= 200.0ms 连续 3 次超过阈值则报警,且在 3 分钟内只报一次警。调用次数:当方法调用次数在 1 分钟的总和,连续 3 次大于 5000000 则报警,且在 3分钟内只报一次警warning告警方式:咚咚、邮件、即时消息可用率:(分钟级)可用率 < 99.95% 连续 3 次超过阈值则报警,且在 30 分钟内报一次警。性能:(分钟级)TP99 >= 100.ms 连续 3 次超过阈值则报警,且在 30 分钟内只报一次警。调用次数:当方法调用次数在 1 分钟的总和,连续 3 次大于 2000000 则报警,且在 3 分钟内只报一次警

如果UMP是定时任务,最重要的一点就是确定好监控时段。只有正确地配置了监控时段,才能确保UMP在预计时间段内正常执行,这样一旦UMP未能在预计时间段内执行,就会自动触发报警机制,及时发现并解决问题。

2)报警要 快、准、少

在处理报警信息时,关键不在于数量的多少,而在于信息的准确性和完整性。小组每天都会接收到几百个报警信息,你是否有足够的精力和时间去查看每一个呢?你能确保每一个都得到了关注吗?

因此,需要对业务影响进行评估,并根据情况设定适当的报警频率。特别是对于那些被视为"关键语音"的报警信息,更应该第一时间发现并进行处理。只有这样,我们才能保证在面对紧急情况时,能够迅速、准确地作出反应,最大程度地减少可能的影响。

3)细节决定成败

如果报警信息的响应时间较长,需要检查一下团队的值班响应机制是否正常。需要确保告警信息是否能够有效地传达给正确的人,以便及时解决问题。

关于报警信息的日清日结,应该建立相应的处理机制,确保每条报警信息都能得到妥善处理。如果无法做到日清日结,则需要深入分析原因,并采取相应的措施加以改进。

在处理报警信息时,需要深入分析其根本原因。只有找到问题的根源,才能从根本上解决问题。

如果报警频繁但一直未被处理,便需要认真思考这个报警是否有必要的存在。有时候,一些报警可能是由于误报或者无关紧要的问题引起的,这时候需要对这些报警进行筛选和排除。

如果出现问题后发现对应的UMP或其他环节的报警信息未添加,就需要仔细检查是否还有其他核心环节也漏添加了。如果有漏添加的情况,可以采用工具扫描来发现。

对于之前出现的报警信息,不能凭经验认为是某原因导致的。历史经验并不一定准确可靠,只有通过调查和分析相关日志才能得出真正的结论。

在配置报警信息时,需要认真考虑其合理性。建议先采取紧后松的方式逐步调整到最佳状态。这样可以避免一开始就出现过多或过少的报警信息,从而提高工作效率和准确性。

2.缓解系统问题时间:故障响应机制、快速止血

为什么需要缓解系统问题时间,而不是仅仅定位问题呢?这是因为在处理系统问题时,仅仅定位问题只是解决问题的一部分。更重要的是,需要尽快缓解系统问题,以避免其对业务的影响进一步扩大。

为了提高问题处理效率,需要从以下三个方面入手:

完善指挥体系和角色分工:一个完善的指挥体系和明确的角色分工可以有效地提高故障处理的效率。在处理问题时,各个角色需要明确自己的职责和任务,并协同配合,共同解决问题。

完备的技术层面故障隔离手段:在技术层面上,需要采取一些故障隔离手段,比如通过DUCC开关等方式来避免过度回滚代码。这样可以更加快速止血(DUCC开关秒级,如机器多回滚需要5-10分钟)

经过足够的演练的故障处理机制保障:最后,需要建立一个经过足够演练的故障处理机制保障,包括UAT环境测试、捣乱演练、应急预案SOP等。这样可以在真正出现问题时,快速响应并有效解决问题。

总之,为了提高问题处理效率,需要采取一系列措施来缓解系统问题时间,而不仅仅是定位问题。只有这样,才能真正保障系统的稳定性和可靠性。

1)执行故障应急响应机制

无论一个组织规模有多大,其最重要的特征之一就是应对紧急事件的能力。在面对紧急情况时,需要有一套完善的应急预案和实战训练机制,以确保能够快速、有效地应对各种突发状况。为了实现这一目标,需要从以下几个方面入手:

建立完备的训练和演习流程:建立和维护一套完备的训练和演习流程是非常重要的。这需要一批对业务熟悉、专注投入的人来负责制定和执行相关计划。同时,还需要根据实际情况定期进行演习和模拟测试,以确保应急预案的有效性和可操作性。

先把问题上报组内、发挥团队的力量:在处理紧急事件时,应该先把问题上报组内,并充分发挥团队的力量。通过集思广益的方式,可以更加快速地找到问题的根源,并采取相应的措施进行解决。

合理判定问题严重程度:在判断问题的严重程度时,需要具备良好的工程师判断力,并保持一定的冷静。

总之,为了提高组织的应对紧急事件的能力,需要建立完备的训练和演习流程,充分发挥团队的力量,并合理判定问题的严重程度。只有这样,才能真正保障组织的稳定性和可靠性。

2)关键角色分工

故障指挥官。这个角色是整个指挥体系的核心,他最重要的职责是组织和协调,而不是执行,比如负责人、小组长、架构师。沟通引导。负责对内和对外的信息收集及通报,但是要求沟通表达能力要比较好,比如产品经理。

执行者。参与到故障处理中的各类人员,真正的故障定位和业务恢复都是他们来完成的,比如小组核心研发、运维同事等。

3)流程机制

故障发现后,On-Call同事或者小组长,有权召集相应的业务开发或其它必要资源,快速组织会议。

如果问题疑难,影响范围很大,这时可以要求更高级别的介入,比如部门负责人等。

4)反馈机制

反馈当前处理进展以及下一步Action,如果中途有需要马上执行什么操作,也要事先通报,并且要求通报的内容包括对业务和系统的影响是什么,最后由故障指挥官决策后再执行,避免忙中出错。没有进展也是进展,也要及时反馈。对于技术以外的人员反馈,如客服等等。一定不是用技术术语,而是以尽量业务化的语言描述,并且要给到对方大致的预期,比如正在做什么,大致多长时间会恢复,如果不能恢复,大约多长时间内会给一个反馈等等。

5)快速止血应急预案

基本原则:在故障处理过程中采取的所有手段和行动,一切以恢复业务为最高优先级,恢复现场止血方案高于寻找故障原因。

面对问题时,你的第一反应可能是立即开始故障排查过程,试图尽快找到问题根源,这是错误的!不要这样做。正确的做法是:缓解系统问题是第一要务,尽最大可能让系统恢复服务。

快速止血而不是根源排查。首先只需要粗定位问题大概即可,然后通过一些应急预案措施(DUCC开关降级、限流、回滚等)来恢复现场。

线上问题首先思考,是不是上线、业务修改配置等变更导致,拉齐信息。

发布期间开始报错,且发布前一切正常?什么都不用管,先回滚再说,恢复正常后再慢慢排查。

应用已经稳定运行很长一段时间,突然开始出现进程退出现象?很可能是内存泄露,默默上重启大法。

如何确认是不是上线引入的问题呢?同比下上线前(比如昨天、上周)是否也存在一样问题。如果也存在说明跟上线没关系。看看昨天的日志,日志是最靠谱的。可用率会欺骗大家(因为你可能今天治理了可用率,之前可用率是100%,但不一定是真的100%)。

业务、产品、研发多路并行。

快速定位问题时乃应该及时保存问题现场,比如先把JSF服务摘除,但机器保留1台(别重启),保留JVM堆栈信息以便后续进行问题根源分析。

3.充分利用现有工具,智能分析定位问题

1)针对TP99高,定位难:

调用关系复杂,难以快速定位性能瓶颈。可通过工具事先梳理清楚服务间复杂的依赖关系,聚焦瓶颈服务的核心问题,而不是出现问题才去整理链路。

如泰山 故障转移等:智能告知这个告警与哪个因素最相关,功能试用中。全域看板,集成UMP采集点,可快速定位是哪一个环节TP99高。长链路应用,配置泰山雷达图。Pfinder分布式调用链路,作为分析基础。

2)针对调用量突然高

可通过JSF》流量防护》应用和接口》别名&方法名 定位上游哪个应用调用量情况,再采取对应措施,比如更上游沟通,限流策略等

3)线程分析、JVM、火焰图CPU采样等

泰山平台》故障诊断》在线诊断

4)业务问题

根据logbook查找,这个没什么好讲的。

通过标准化程序来指导训练技术人员,可以减少解决问题所需的时间。在相同的故障情况下,拥有适当的文档和应急预案SOP可以让您快速检查可能导致故障的所有因果因素。

三、团队快速缩短MTTR三字经

下面不是严格的顺序,需要根据实际情况调整可多路并行,比如清楚问题大概环节,先止血。如不清楚,报备分工,初步定位大概环节再快速止血。

在故障处理过程中采取的所有手段和行动,一切以恢复业务为最高优先级,恢复现场快速止血方案高于寻找故障原因等其他所有环节。

图3

别慌张,先报备

先组会,明分工

描现象,非结论

先止血,再定位

看监控,看日志

找规律、先试验

看输入,看输出

留现场,时反馈

1.别慌张,先报备

1)在处理紧急事件(线上问题或者疑似问题)时,先把问题上报组内。

2)充分发挥团队的力量,通过集思广益的方式,可以更加快速地找到问题的根源,并采取相应的措施进行解决。

✅正例:假设一个团队中一名成员遇到了一个业务或者其他团队研发反馈的线上问题。他首先将问题上报给了组内TL/架构(电话、语音优先、咚咚),然后通过在线会议或即时通讯工具与团队成员分享问题的细节。团队成员们迅速展开讨论,集思广益,共同分析问题的原因和可能的解决方案。经过大家的共同努力,最终找到了问题的根源,并成功解决了问题。这个过程中,团队成员们充分发挥了团队协作的力量,提高了解决问题的效率。

❌反例:假设一个团队中一名成员遇到了一个业务或者其他团队研发反馈的线上问题。他没有将问题上报给组内,而是试图自己解决。结果,这个问题没有得到及时的解决,反而加重影响了线上损失。

2.先组会,明分工

1)故障指挥官(问题发现人或者小组长/架构),有权召集相应的业务、产品、开发或其它必要资源,快速组织会议。

2)故障指挥官明确各角色职责,分工明确,这样可以有效地提高故障处理的效率。

✅正例:故障指挥官(问题发现人或者TL/架构)有权召集相关的业务、产品、开发等团队成员,快速组织一个会议。在会议上,明确各成员的角色职责,如产品人员、开发人员、测试人员等,并分工明确。这样,每个人都能清楚地知道自己需要完成的任务,从而有效地提高故障处理的效率。通过集思广益,团队成员们能够迅速找到问题的根源,并采取相应的措施进行解决。

❌反例:故障指挥官(问题发现人或者TL/架构)没有及时召集相关的业务、产品、开发等团队成员开会。他试图自己解决问题,但由于缺乏专业的业务知识和经验,问题没有得到及时的解决。同时,其他团队成员也因为不知道问题的严重性而没有给予足够的关注。这种情况下,故障指挥官需要花费更多的时间和精力去协调各方资源,最终可能导致问题得不到有效解决,影响整个项目的进度。

3.描现象,非结论

1)让问题发现者描述发现的现象(时间、影响范围、影响程度),而不是判断的结论(因为判断的结论可能是错误的,这样会误导大家排查方向)

2)请大家避免在描述问题现象时,过多地表达自己的判断和看法,因为这可能会影响到大家的排查方向。需要保持客观和理性的态度,以便更好地分析问题。

3)同时,也请大家注意自己的思维方式,避免让自己的大脑成为别人思想的跑马场。在讨论问题时,可以提出自己的观点和建议,但请确保这些观点是基于事实和证据的,而不是个人的主观臆断。

✅正例:假设在一个软件开发团队中,当遇到一个性能问题时,问题发现者描述了如下现象: 时间:2023年8月18日上午9点至10点之间,用户在使用过程中发现了明显的性能下降。 影响范围:影响到用户登录、数据查询等主要功能模块。 影响程度:由于性能下降,用户的请求响应时间明显增加,部分用户无法正常完成操作。在这个例子中,问题发现者提供了具体的现象信息,使得团队成员能够迅速定位问题所在,并采取相应的措施进行优化和修复。

❌反例:假设在一个软件开发团队中,当遇到一个性能问题时,问题发现者仅给出了自己的判断结论: 时间:2023年8月18日上午9点至10点之间。 影响范围:可能是数据库连接池的问题。 影响程度:很严重,导致大部分用户都无法正常使用系统。在这个例子中,问题发现者没有提供具体的现象信息,而是仅仅给出了自己的判断结论。这可能会导致团队成员在排查问题时产生困惑,无法准确地找到问题的根源。同时,由于判断结论可能是错误的,这也可能误导团队成员,导致他们在排查问题上浪费时间和精力。

4.先止血,再定位

1)在故障处理过程中采取的所有手段和行动,一切以恢复业务为最高优先级,恢复现场止血方案高于寻找故障原因。

2)快速止血:可以采用开关技术、回滚技术等手段,迅速恢复系统功能,避免服务中断。

3)日常应急预案:请大家提前制定好应急预案,包括关键业务的容灾策略、故障切换流程等,以便在发生故障时能够迅速启动预案,降低故障对业务的影响。

4)请大家在故障处理过程中,不要过于关注故障原因的寻找。虽然找到故障原因是解决问题的关键,但在紧急情况下,需要优先考虑如何快速止血,恢复业务。只有在确保业务稳定运行的前提下,才能有更多的时间和精力去深入分析故障原因,从根本上解决问题。

✅正例:案例1:假设在一个软件开发团队中,当遇到一个系统故障时,问题发现者迅速采取了快速止血措施,恢复了系统功能。同时,团队成员在日常工作中制定了详细的应急预案,使得在类似的故障发生时能够迅速启动预案,降低故障对业务的影响。在这个例子中,问题发现者和团队成员将恢复业务作为最高优先级,迅速采取了快速止血措施,确保了系统的稳定性和可用性。同时,他们也注重日常应急预案的制定,为将来可能出现的故障做好了充分的准备。案例2:在上线发布期间,如果开始报错,并且发布前一切正常?那什么也别管,先回滚再说,等恢复正常后再排查问题。案例3:应用已经稳定运行很长一段时间,突然开始出现进程退出的现象?则很可能是内存泄露,可采用重启大法,重启部分机器后观察看看是否止血了。

❌反例:假设在一个软件开发团队中,当遇到一个系统故障时,问题发现者花费了大量的时间去寻找故障原因,而忽略了快速止血和恢复业务的重要性。同时,团队成员在日常工作中没有制定详细的应急预案,导致在类似的故障发生时,处理过程混乱,无法迅速恢复系统功能。在这个例子中,问题发现问题发现者和团队成员过于关注故障原因的寻找,而忽视了快速止血和恢复业务的重要性。这导致了在故障发生时,处理过程效率低下,无法及时恢复系统功能,给业务带来了较大的影响。

5.看监控,看日志

1)收集和分析UMP性能指标、Logbook错误日志、MDC系统运行状态等信息,以便更准确地判断问题所在。

2)与相关团队进行沟通,共同分析问题原因,制定解决方案。在解决问题的过程中,要保持冷静和耐心,遵循故障处理的最佳实践,确保问题得到及时有效的解决。

✅正例:假设在一个生产环境中,系统突然出现性能下降的问题。作为oncall人员,在接到问题报告后,首先通过各种监控工具收集系统运行状态和性能指标等信息。然后,根据收集到的信息分析问题可能的原因,并与相关团队进行沟通和协作。最后,制定解决方案并进行实施,成功解决了系统性能下降的问题,恢复了正常的生产环境。❌反例:假设在一个生产环境中,系统突然出现故障,导致业务无法正常运行。作为oncall员,在接到问题报告后,没有先定位大体方向,也没有通过监控工具收集相关信息进行分析。而是直接尝试修复问题,但由于缺乏准确的信息和分析,很难找到问题的根本原因,导致问题得不到有效解决,影响了业务的正常运行。

6.找规律,先试验

1)通过各种监控工具,如UMP(流量、tp99、可用率)和日志分析,可以查找规律并了解系统在上线前后的表现。比如,可以对比昨天、上周的日志数据,看看是否也存在类似的问题。同时,还可以监测UMP流量的变化,以判断系统是否受到异常的影响。

2)如果发现之前也存在类似的疑问点,那么这可能意味着问题与今天的上线无关。需要继续深入研究,找出根本原因。

3)对于每一个疑问点,应该按照优先级进行试验和验证。这样可以确保首先解决最关键的问题,避免影响系统的正常运行。

4)如果在试验过程中发现问题仍然存在,应该及时调整方案并重新进行试验。这样可以帮助更快速地找到问题的根源,并采取相应的措施进行修复。

5)在整个排查过程中,应该保持沟通和协作。如果遇到困难或不确定的情况,可以与其他团队成员交流,共同解决问题。

✅正例:假设在一个生产环境中,系统突然出现性能下降的问题。作为oncall人员,通过各种监控工具收集了UMP和日志数据,并发现在昨天和上周也存在类似的问题。同时,监测到UMP流量与之前相比没有明显变化。基于这些信息,运维人员可以初步判断问题与今天的上线无关,可能是由于其他原因导致的。他们按照优先级进行试验和验证,最终发现问题是由于某个配置参数设置不正确导致的。通过调整配置并重新试验,问题得到了解决,系统性能恢复正常。

❌反例:假设在一个生产环境中,系统突然出现故障,导致业务无法正常运行。作为oncall人员,没有经过详细的监控和分析,直接尝试修复问题。然而,由于缺乏准确的信息和分析,问题得不到有效解决,甚至可能因为错误的操作而导致更严重的错误。这种情况下,oncall人员需要及时调整方案并重新进行试验,以确保问题得到正确处理。

7.看输入,看输出

1)首先,确认需要比对的输入和输出参数。这些参数可能包括请求参数、响应数据等。确保你清楚地知道需要比对的内容。在比较过程中,注意观察参数值的差异。如果发现有差异,进一步分析可能的原因,例如参数传递错误、接口逻辑问题等。

2)如果发现问题是由于接口逻辑导致的,可以尝试某N台机器回滚到之前的版本,然后再次测试接口是否正常工作。如果问题仍然存在,可能需要进一步排查并修复代码。

3)根据比对的结果和排查的过程,总结经验教训,提出改进建议,以避免类似问题再次发生。

✅正例:假设在一个生产环境中,系统突然出现性能下降的问题。作为运维人员,通过技术回滚某台机器或者引流比对,发现输入参数与预期不符,导致接口无法正确处理请求。通过仔细排查,发现是由于一个配置参数错误导致的。修复该问题后,系统性能恢复正常,业务正常运行。

❌反例:假设在一个生产环境中,系统突然出现故障,导致业务无法正常运行。作为运维人员,没有进行任何比对和排查,直接尝试修复问题。然而,由于缺乏准确的信息和分析,问题得不到有效解决,甚至可能因为错误的操作而导致更严重的错误。这种情况下,运维人员需要及时

调整方案并重新进行试验,以确保问题得到正确处理。

8. 留现场,时反馈

1)在进行故障排查和处理时,保留现状并记录已采取的措施和尝试过的解决方法是非常重要的(比如不要全部机器都重启,可保留1台现场机器)

2)详细地记录下来包括已采取的措施和尝试过的解决方法。

3)没有进展也是进展,也要及时反馈。

✅正例:假设在一个生产环境中,系统突然出现性能下降的问题,值班运维人员保留了1台机器并且摘除了流量,其他机器分批重启了,快速止血恢复了现场,同时安排其他人员去分析未重启的机器,Dump应用快照(常用的快照类型一般就是线程堆栈和堆内存映射)分析原因。

❌反例:假设在一个生产环境中,系统突然出现性能下降的问题,值班运维人员直接把机器都重启了,这样快速止血恢复了现场,但由于没有保留现场,导致现场关键信息丢失,可能无法继续排查根因

四、总结

在线上问题修复后,编写COE(Center of Excellence)复盘报告是非常重要的一步。在这个报告中,可以回顾整个问题的处理过程,思考如果当时做了哪些可以更快缩短MTTR(Mean Time To Repair)的方法。

具体来说,可以从以下几个方面入手:

分析问题出现的原因:首先需要对问题进行深入的分析,找出问题的根本原因。只有找到问题的根源,才能够采取有针对性的措施来解决问题,从而缩短MTTR。

总结经验教训:在分析问题的过程中,需要总结经验教训,并提出改进建议。这些建议可以包括优化流程、提高效率、加强培训等方面的内容,但不需要列一堆Action,根据2/8法则抓重点即可。

举一反三,杜绝下次发生类似问题:需要将本次问题的处理经验和教训应用到其他类似的问题中,避免类似问题的再次发生。

总之,通过深入分析问题、找出根本原因、总结经验教训以及举一反三,可以有效地缩短MTTR,保障系统的稳定性和可靠性。

>>>>

参考资料

SRE Google运维解密持续交付2.0

作者丨京东物流 冯志文

来源丨公众号:京东技术(ID:jingdongjishu)

dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn

0 阅读:4

指尖上的架构

简介:感谢大家的关注