本文根据洪鹏老师在〖deeplus直播:B站面向故障的应急响应体系建设〗线上分享演讲内容整理而成。
分享概要
一、稳定性保障困局
二、应急响应中心建设思路
三、ERC平台化能力
随着业务规模的不断扩大和日常需求的快速迭代,即使是最优秀的业务架构也无法确保系统100%的可用性,故障在生产环境中是不可避免的。本次围绕故障分享下我们做的一些稳定性保障工作,具体内容如下:
一、稳定性保障困局
1.过去一年发生的故障
回顾我们过去一年发生的各种大小故障,可以将其分为以下几类:
通过对历史故障处理过程的分析总结,我们在故障发现、故障处理和故障恢复这三个阶段发现了许多问题。这些问题导致故障无法快速恢复,且重复根因的故障多次发生。
接下来,我们将从故障发现、故障处理、故障恢复这三方面进行深度挖掘和分析。
2.稳定性保障困局之故障发现
1)监控告警
故障最有效的发现方式是通过告警。为了尽可能提高告警的覆盖率,大家会添加许多不同类型的告警规则,包括:
这带来了一个问题:每天会有大量告警,SRE需要在海量告警中人工识别出哪些告警可能导致故障,并优先处理。这使得工作效率极低,日常on call的同事几乎全都在处理告警,无法顾及其他稳定性相关的问题。
2)客服反馈
另一种故障发现的渠道是客服反馈。我们有一个全站的问题反馈群,客服会在群里同步客诉。由于消息非常多,容易遗漏一些核心功能的客诉。在定位问题时,研发需要与客服进行大量沟通,比如了解进线用户是否集中在某个地域、使用的APP版本等,需要讨论很多细节,协同效率非常低。
3)网络舆情
最后一种是在监控缺失的情况下通过网络舆情发现问题。这部分问题占比非常小。通过网络舆情发现故障后,研发和SRE会介入处理,但此时影响面已经非常大了。
3.稳定性保障困局之故障处理中
4.稳定性保障困局之故障结束后
避免同类根因的故障再次发生的一个有效措施,就是通过复盘。但通常组织一场有效的复盘对SRE来说挑战很大。
基于上述的这些痛点,应急响应中心的建设迫在眉睫。
二、应急响应中心建设思路
1.故障生命周期
我们先来看下整个故障的生命周期包括:发生、发现、响应、定界、定位、止损、恢复。
我们内部对整个故障的处理,希望做到1分钟发现问题,3分钟响应,5分钟定界定位,10分钟恢复。
故障处理过程中,发生、发现和响应比较容易理解,我重点介绍下定界、定位,止损、恢复这几个阶段。
1)定界和定位
这里有个例子:某应用做了一次常规的迭代变更,导致可用率下跌。
很明显这个case我们通过快速回滚能迅速恢复,而不用等研发改代码、提mr、重新构建发版。
2)止损和恢复
这里也有个例子帮助大家更好的理解:app上的首页推荐模块异常。
2.ERC
ERC(Emergency Response Center)主要围绕整个故障生命周期,从故障发现、故障处置、故障恢复来设计,目标就是能快速恢复不能预防的问题,降低MTTR(平均故障恢复时间),不再重复已发生的问题。MTTR进一步拆分为以下四个阶段:
通过对这四个阶段的优化,我们可以更加精准地评估和提高整个故障处理过程的效率,降低故障影响。
3.故障发现
围绕这个目标,首先要考虑更高效的故障发现方式。
我们先来看下什么是故障,这样才能帮助我们更高效的发现。简单来说,故障就是产品体验受损,无法按照预期提供服务。
那么之前加的那些原因类指标是不是就没这么重要了?
原因类指标是无穷无尽的,并且某些指标对整个分布式系统的影响微乎其微,例如一台机器的异常宕机,cpu打满,也不一定对整个系统产生明显影响,除非所有实例全部异常。这种情况最终会反映到我们的结果指标上。因此,我们应该更多地关注结果类指标,结果类指标是可枚举的。
那么什么是结果类指标呢?我们可以分为技术指标和业务指标:
这类结果类指标异常,一定表示线上发生了故障。
故障发现后,接下来就是对故障的处置阶段。
4.故障处置
在故障处理过程中,确保信息同步至关重要,不同的群体关注的内容不同:
所以通告信息要包含大家关注的内容,在一些大群只做故障首通和故障完结通知,故障协同群内会进行故障的进展更新。
在协同上要保持高效,通过合理的手段保证负责人第一时间响应,同时明确故障处理时人员的角色分工。
此外,可观测能力也至关重要,因为可以帮助我们快速定界定位问题。在快速恢复阶段,要及时决策,同时必须确保预案可执行。
5.故障恢复
故障恢复之后要进行有效的复盘,复盘内容结构化,对根因深挖,有效的复盘总结能避免同类故障再次发生。
复盘里还有一个很重要的点,就是改进措施,改进措施需要遵循smart原则:
三、ERC平台化能力
上面介绍了这么多方法论,接下来看下我们内部是如何落地的,我们踩过的坑以及如何解决。
1.故障发现
1)客服
①人工驱动
对于客服类的故障,传统流程依赖人工驱动:
整个流程高度依赖研发,效率较低。
②平台驱动
为了提高效率,我们设计了新的平台驱动流程,将客服系统和应急响应中心直接对接:
新流程显著提高了客服类故障的发现和处理效率。
③注意事项
需要注意的是,客服分类和服务树节点不完全一致。为了解决这个问题,我们做了以下工作:
2)SLO
客服收到大量用户反馈时,通常影响面已经非常大,用户处于无法容忍状态,对线上故障的发现,客服来源只能作为辅助。
有没有更高效的发现方式呢,最常见的做法就是基于SLO升级,SLO是用来度量业务稳定性的,基于错误预算做升级故障,能准确判断故障是否发生。
①覆盖范围
之前我们覆盖了线上L0、L1的应用,发现很多底层服务的抖动由于业务网关的重试和降级逻辑对用户无影响,这类问题通过告警处理更合适,没必要升级为故障。
②降噪
在实施过程中,我们还遇到了基础设施或基础组件异常导致大量业务受影响,同时拉起大量应急协同群,形成故障风暴。为了解决这个问题,需要采用一些抑制手段:
3)业务指标
技术指标只能发现服务所有不可用问题,一些业务逻辑类的异常,需要业务指标去补位。例如:用户频繁掉登录、用户充值失败这些case通过SLO是发现不了的。
选择业务指标的标准一样要选择能描述业务稳定性的指标,指标异常,一定表示功能有损。
①业务摸排
覆盖业务指标的实时流程前置工作需要SRE同学对各业务进行深入摸排,和业务方共同选择指标。业务摸排完成后,对指标类型进行了分类:
②平台集成
前置的梳理工作完成后,接下来就是平台能力的建设,需要支持指标的定义,在定义指标时支持多基础值组合,以及不同类型组合来进行降噪。
③生产案例
稿件业务的视频人审指标 同环比异常上涨、下跌都认为是故障。
4)内部反馈&告警
除了自动召回故障之外,平台还优化了人工录入故障的交互逻辑。并且提供了openAPI供第三方系统对接,减少信息的割裂。
解决API滥用的问题
一些同学可能会担心API被滥用,有些明明不是故障,就是一个简单的告警。为了解决这一问题,我们采取了以下措施:
通过上述的几种故障发现,我们目前的故障自动召回率和故障有效率都达到了80%以上。
2.协同处置
1)基础能力
2)协同流程
对于自动触发的故障,erc会自动拉群,一个故障对应一个应急协同群。如果某些业务有专门的故障处理群,系统也会将故障信息直接同步到这些固定群里。
在协同群中,第一条推送文案就是TC(技术委员会)制定的故障标准处理流程,旨在加强团队成员的止损意识。故障的首通通告、进展更新、故障完结都会在协同群中同步。
关联的错误分析也会第一时间推送到群里,包括当前受影响的可用区,具体的path code及错误数,可观测链接,以帮助SRE和研发快速判断决策。
3)应急角色
在整个故障的应急协同中,我们设定了两种角色:故障指挥官和一线处理人员。
明确角色分工后,在故障处理过程中,大家才能各司其职,更高效的协同处理
4)应急升级
因为我们是没有7*24小时的NOC团队,很多时候故障都是发生在非工作时间,所以为了提高非工作时间的响应效率,我们完善了应急升级机制:
5)移动端
上面也提到了我们没有专门的NOC团队,SRE没办法保证24小时在电脑旁,如果是上下班路上,出差时遇到故障,拿电脑,连vpn,很不方便。针对这些痛点,我们丰富了移动端办公的能力,再也不会被时间、地点限制我们的故障处置。
①移动端优势
3.故障处置
1)定界定位
故障处理人员上线后,第一时间就是定界定位问题,这块就依赖可观测能力的建设,在处理故障时,我们通常关注以下数据:
aiops通过上述指标以及trace去层级下钻,最终给出故障推荐原因。
2)故障止损
在定界定位到问题后,接下来就是止损恢复。最常见的就是止损三板斧:
还是其他的手段例如:
这些都是故障发生时止损恢复的利器,能够帮助我们在故障发生后快速止损恢复。通过不断优化和演练,我们可以提高故障应对能力。
4.故障恢复后
1)复盘
故障恢复之后的复盘需要包含以下内容:
上图展示了生产的一个实际的复盘案例。之前我们的复盘信息缺少和故障的关联,用户填写成本比较高,为了解决这些问题,我们对复盘流程进行了优化。
复盘流程优化
2)数据运营
最后看一下平台的数据运营,运营数据统计中关于1-3-5-10,有两种统计方式:
①累加统计,总时长10min
优势:统计方便
劣势:每个阶段的耗时统计不直观,不利于持续跟进优化
②分段统计,总时长19min
优劣:清晰明了,利于每个阶段的持续跟进优化
劣势:各阶段时长统计复杂
我们目前使用的是分段统计的方式,有助于针对性的推动每一段改进工作的开展。
确定了统计方式,就可以进行1-3-5-10的统计,包括:
同时对故障数量,我们也关注:
以上就是我们针对故障做的一些稳定性保障工作,面向故障建立一个高效的应急响应中心,通过数据驱动的方式去持续运营,不断优化,提升故障恢复时间,降低同类故障再次发生,提高线上业务稳定性。
dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn