11 月 5 日,在 2022 杭州 · 云栖大会上,数字化安全生产平台 DPS 重磅发布,助力传统运维向 SRE 转型,在数字化安全生产平台 DPS 重磅发布中提到了 DPS 诞生的背景,希望解决的企业问题以及核心的功能点,其中提到了 DPS 目前的两大业务场景:"1-5-10"故障快恢和"变更三板斧"故障预防,本文将阐述 “1-5-10”故障快恢场景的背后的设计与实现。
1-5-10 对应故障的“1 分钟发现-5 分钟响应-10 分钟恢复”,是定义故障处理的时效性目标。在阿里巴巴内部经过多年的实践,1-5-10 早已成为各个业务稳定性、基础设施稳定性以及大促保障的重要牵引指标,目的是缩短故障恢复时长(MTTR),降低故障影响。DPS 通过将阿里云高可用产品体系与阿里巴巴安全生产理论体系相结合,实现了 1-5-10 的产品化落地。
下图是 1-5-10 的产品架构图:

1-5-10 场景包括事前稳定性分析,事中应急处理,事后持续运营三个步骤。
以上是 1-5-10 场景的整体产品能力介绍,下面展开介绍 1 分钟发现,5 分钟响应以及 10 分钟快恢是如何设计与落地。
要做到故障的一分钟发现,首先需要有完善的监控/告警体系,其次需要有明确的故障结构化定义。在实际应用中,会遇到如下的一些问题:
一个生产业务监控,涵盖了各式各样的指标,从业务层面、应用层面、服务层面、系统层面,基础设施层面等等,比如下面:
当故障发生的时候,可能上述任何一层的指标都会出现异常,如果不能对指标进行合理的分层和针对性的建设,就会被淹没在一堆指标告警监控里面,不但可能忽略真正的问题,还有可能使得运维人员难以应付。
什么是故障? 在日常运营中,无论什么原因导致服务中断、服务品质下降或用户服务体验下降的现象,称为故障。只有清楚定义业务故障,并且将故障监控进行关联才能做到真正故障的快速发现。然而在生产业务中,往往只聚焦于监控治理,而忽略了故障定义的重要性。
可以将指标能否直接反馈业务功能是否可用,将指标分为如下类别:


以上要求 DPS 不但需要支持不同类型数据采集,还需要针对数据根据应用维度、业务维度分类处理。
发现体系建设的对象是故障, 怎么去快速发现已经发生的故障以及潜在可能变成故障的风险,因此对于能够直接反映系统功能是否可用的指标要重点建设, 所以监控指标的处理优先级就是:核心指标监控 → 非核心监控(业务,服务)→ 系统监控(环境指标)。
核心指标监控就是能够直接反馈功能是否可用,核心指标的下跌或者其他异常一定会导致不同程度的故障,因此对于核心指标要通过故障场景的方式来定义应急平台上,所谓的故障场景包含了以下几个方面:
比如对于交易下单业务下跌这一应急场景来说,可以有如下例子:

这里重点是故障等级怎么来定义? 故障等级定义可以考虑影响点以及影响面联合来定义:
以上要求 DPS 不但需要确立故障模型,以便故障的结构化定义,还需要基于监控数据的故障定级以及通告能力。
DPS 在发现体系产品化上具备全链路监控、故障场景结构化,以及智能告警三个能力。

通过与阿里云可观测体系深度集成,DPS 实现了从用户体验端到基础设施端的全链路监控,包括业务日志监控、APM 监控、前端监控、基础设施监控等。
监控数据本身不具备业务含义,以单条 Trace 调用链路为例,能够知晓它经过了哪些应用和接口,但是无法了解代表的业务,很难做到业务维度的精准监控。
当事件/故障产生以后,需要通过告警触达到处理人员。在一个重大业务故障的持续时间内,不光已有的告警事件会继续发送,由于爆炸半径的不断扩大也会产生新的告警事件,DPS 会对告警事件进行过滤,降噪聚合等操作,根据事件的时间,影响面,业务特征等归纳到相同的故障下,避免告警的持续通告。
要做到故障的 5 分钟响应,首先需要有一套标准的应急响应流程,其次需要能够快速定位问题,作出恢复决策。在实际应用中,会遇到如下的一些问题:
导致故障产生的原因有很多,比如流量问题、网络问题、编码问题、依赖服务问题,基础设置问题,还有配置变更问题,牵一发而动全身,在复杂的系统架构和业务链路下,如何能够有效地查询到故障的上下文信息,快速定位问题?
可以将故障处理流程中的人员角色分为三类: 负责协调的技术支持人员,负责应急的处理人员以及负责决策的指挥人员。
技术支持在应集中起到了非常关键的作用,对内,要有效组织直接处理人员的集中和协作;对外,负责对接业务部门同步信息,同时屏蔽各方对技术团队和故障处理人员的干扰。当出现一个严重故障后,技术支持通常要做如下关键事项:
处理人员由一线研发负责,要遵循“先签到,再止血,后恢复”的原则,即在技术支持进行故障通告后,研发在处理前需要进行签到通告,以防止多人处理引发的冲突问题。在处理中要优先止血,防止故障影响面的扩大,这就需要能够快速判断故障的初因以及执行合理的预案。最后是故障的彻底恢复,包括根因定位以及影响面的消除。
指挥人员用于重大故障恢复时候的决策,当严重故障涉及到了多个业务影响面,无法由研发人员独立做出决策,就需要上升。
以上要求 DPS 不但需要将应急流程通过平台流程来驱动,并且需要为不同的角色人员提供特定的功能以帮助其更好地进行故障处理。
在进行故障定位需要从初因和根因两个方面来处理。初因即导致故障的直接因素,需要能够快速给出结论,以便于故障的快速止血,根因即导致故障的根本原因,在复杂的系统中要彻底定位问题往往耗费许久,因此根因定位一般用于故障的恢复以及复盘改进。
初因定位包括全局变更诊断,比如故障发生前的发布变更,配置变更或者是数据变更,像在阿里有 80%的故障是由于变更导致,因此需要能够快速的收集并且查询到指定时间的变更操作,对可疑变更进行回滚操作。此外也可从业务链路维度进行初因定位,查看当前故障业务的上下游业务是否异常,如果是因为上下游业务影响导致,则需要对上下游业务进行降级之类的处理。
根因定位包括代码 BUG 类定位,进程内资源不足,基础设施异常等方面。
DPS 在响应体系上包含了故障单,ChatOps 以及智能定位三块能力。
当故障产生以后,便会自动生成故障单,故障单上规定了故障的处理流程,并且自动绑定当前故障的技术支持人员,应急处理人员,相关人员只需要通过 DPS 按照流程进行故障处理即可。
ChatOps 能够给故障处理流程带来更好的透明度,实现信息共享的同时提升应急效率和便捷性。像钉钉,企业微信都是作为 ChatOps 承载平台的好选择,基于这些平台的开放能力,DPS 打造了一个应急机器人,通过应急机器人可以直接在手机端进行故障处理,包括签到,进展更新,快恢执行等,获取和 PC 控制台一样的使用体验。
DPS 在定位上能力包括:

1-5-10 场景的核心是快恢,发现体系和响应体系建设都是为了快速的恢复故障。要建设快恢体系首先需要建立起快恢能力,其次要针对故障特征合理使用快恢能力。
DPS 在快恢体系建设上包括快恢能力标准化定义,云原生化的快恢产品接入以及快恢预案三块能力。
通过对阿里快恢的数据分析,DPS 将快恢分为重启,回滚,扩容,切流,限流以及降级六板斧六个类别,并且已经完成重启和切流的快恢能力模型设计。拿切流举例,切流本质上是将流经某个地址的流量进行再分配的过程,因此 DPS 设计切流模型时分为流量地址,流量筛选以及流量路由三个部分,对于网关组件(ApiSix、Ingress...)等,流量地址即入口域名,流量筛选即根据 Http、Tcp 等方式对流量进行筛选,流量路由即不同地址的流量分配。数据库的主备切换也可以抽象成写流量的调度,主变成备的过程,即写流量从主 100%,备 0% 到主 0%,备 100% 的过程。
需要注意的是 DPS 定位故障快恢,在模型定义要简易清晰,因此只抽象出不同快恢产品的通用模型,不会去兼容快恢产品的所有配置规则。
DPS 定义了快恢产品的 CRD 模型,在 CRD 里面针对不同快恢能力做了模型规范,开发者只需提供快恢产品的 CR,就可完成快恢系统的接入,流程如下图所示:

其中 CR 里面包含了快恢执行的镜像,镜像由开发者实现,镜像的创建,扩容以及版本管理都由 DPS 平台负责。容器镜像需暴露一下接口:
快恢能力要通过快恢预案来执行,快恢预案定义了快恢能力的执行策略,主要包括以下内容:
数字化转型下如何保证业务连续性?1. 首先思想观念要转变,从被动运维向主动运维再到持续改。2. 协作方式的转变,必须要有业务思维,从业务场景出发,打破团队边界,让普通业务人员也参与到安全生产的运维保障中。3. 技术方式的转变,要不断提升自动化运维水平,通过打造一体化平台,为业务保障人员提供统一的工作界面和空间,统一能力标准,统一实现接口,实现能力复用和组合,并且加强数据化运营。
1-5-10 场景作为 DPS 推出的首个业务场景,在阿里安全生产最佳实践的基础上,结合外部企业客户诉求持续性的改进优化 ,以帮助企业更好建设故障应急响应机制,提升业务连续性。受限于篇幅,本文中还存在很多未展开的讨论细节,后续也会陆续更新。
作者:银桑
本文为阿里云原创内容,未经允许不得转载。
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只