聊稳定性治理的文章很多,但面对系统的“各类疾病”,到底该从哪里着手才能立竿见影,怎么才能“药到病除”?相信在看这个问题时,大家会抱着“能不能学两招回去用”的心态阅读。
「TakinTalks论道系列」第3期,我们采访了4位资深从业人员,分别从CTO、稳定性负责人、SRE架构师、研发工程师等不同视角,去了解大家经验里比较好用、能够落实的“独门秘籍”。

温馨提醒:本文约4000字,预计花费7分钟阅读;
后台回复 “交流” 进入读者交流群。
*** 全链路压测、混沌工程、质量左移 是主动预防风险最有效的三个手段**
去哪儿网整个稳定性相关的工作都由我的团队负责落地实践,从个人角度来讲,我认为去哪儿历年来在质量保障上,尤其是大规模重大活动保障上,实践出来最有效的手段主要有以下三个。
第一个是全链路压测,它对电商型的系统来说是一个绕不开的话题,只要系统存在大规模的流量波动,我认为全链路压测是必须要做的工作。
第二个是混沌工程,在抵御失控、避免不确定上,它是非常不错的技术手段。经过混沌工程一系列的保障措施之后,在过去的近三年里,我们再没有产生过任何由于中间件可靠性导致的故障了,这对我们来说是非常大的进步。另外,现阶段很多问题的排查定位速度也有了质的飞跃,已经从几十分钟降为3-5 分钟的水平。
第三个是质量左移,质量左移让去哪儿的重大故障减少了很多。前段时间我看了一组数据,质量左移(包括一些质量稳定性保障)做完后,故障数同比已经减少了三分之二,即已降到了去年同期约33%的水准。
当然,稳定性治理的动作和产出之间,最终并不一定有直接的因果性,只能说具有很强的相关性。所以,想要取得什么样的成果、计划做哪方面的投入,是需要根据企业的实际情况来评估的。
*** 无法完全预防的故障,用AIOps来自动化分析,提高解决速度**
在去哪儿的故障已经大幅减少后,我们目前正在着手提高故障处理的速度,AIOps的主动发现和智能归因我认为是性价比最高的。通过上述的三种“主动避免”形式,我们预防了大部分的故障,剩下 1/3 大多是变更型的问题,而这种变更型的问题较难预防,只能尽可能提高发现和解决速度。自动化智能分析是我们目前正在做的事。
从过去一个季度的落地效果看,利用智能分析提高主动发现率比较困难,对于没有人工设置告警的场景,只有30%左右可以通过自动分析的方式主动发现,当然这也说明了我们的分析策略还需要持续优化。但是对于已经发现问题,进行排障归因的阶段,有78%的问题是可以通过智能分析正确归因的,这主要得益于我们对大量关联数据的自动分析,涵盖了宿主机、容器、应用、中间件、事件、链路等维度。
*** 十大业务流程梳理,把有限的精力投入到最核心的“20条链路”上去**
在稳定性治理里,我觉得应该做的第一件事情就是梳理十大业务流程,其最主要的作用,就是把公司能够投出来的最核心的资源投到最核心的业务上去。大多数企业在稳定性上都不会投入太多的人力,那么有限的精力到底该投到哪里去?假设有5000个接口,难道都要搞吗?不可能的,只要保障核心的那20个接口不出问题即可。
当然,在一开始没有工具的情况下确实会耗点时间,但它仍然是投入产出比最高的办法。十年前阿里内部提出了几个大的技术战略,可用性是其中之一,在没有工具支撑的情况下,我们当时的做法就是大家都去梳理十大业务流程,把十大业务流程保住,剩下的链路不去投入太多精力,年底整体的可用性确实提升了很多。所以我觉得梳理十大业务流程应该是最有效的办法。
*** 核心业务流程做全链路压测,是活动必备的大招,确保在老板关注的大节点上不出大问题**
把十大业务流程梳理出来后,就可以去做全链路压测了。在具体做法和工具上,有很多成熟的经验可供参考,也有很多办法去落地。我认为把这两招做完后,再搞大型活动就基本不会有什么问题了,即老板关注的大节点上,有办法能够把控,做到心中有数,所以这一招我认为也是比较成熟的可以去落地的“大招”。
*** 发布之前提交变更登记,抓好变更是落实稳定性规范的核心**
我记得 《Google SRE》那本书里面也提到过,60%的故障都是变更引起的。理论上说,变更这件事情抓得越细致,出问题的风险就越小,但考虑到投入的人力、精力和落地可行性,我认为抓好一点就够了,即做好线上变更登记(可参考阿里变更管控平台ChangeFree )。
“不登记,负全责”,简单讲,就是规定做线上变更前,必须在系统平台中登记,并写下操作步骤以及如何验证。从技术上讲,它就是一个表单,实现起来并不复杂。对于提交变更,还可以对定责做约定,即如果没有提交变更单就发布变更,出了问题就由发布人担责;如果变更前提交了登记则无需担责。我们经常在讨论稳定性规范要如何落地,其实规则不能定太多,规则太多大概率会无法落地,我认为变更登记是落实稳定性规范非常核心的一点。
*** 核心业务流程不依赖非核心节点,分开部署,保证十大业务流程的机器和数据独立**
如果以上3点落实后还有余力,我认为在架构上还有一点值得投入——核心业务流程上不能依赖非核心的节点。梳理完十大业务流程后,一定要判断链路上是否有我们认为的非核心节点,如果有,那么应该把那些节点踢出去,或者把他们剥离出来,哪怕单独部署一套机器,也就是分组,其实提供的服务都一样,但是某一组机器就只给核心业务,其他机器可以由非核心业务混用,这样就能做好隔离。
以上四个办法我认为是在稳定性治理中性价比非常高的几点,如果能真正落实,我认为系统稳定性基本会有40%的提升,至少系统不会出现的大问题,也能有精力去持续优化小问题。
新的架构和业务增加后,从技术上看,无非是前端到服务端,再到存储的调用过程,在这个过程中要做的就是如何去解决其中的稳定性问题,我认为有三点比较重要。
**第一,做好监控。
第二,把所有的强弱依赖梳理出来。
第三,对所有的强弱依赖和接口,在平台上做好 trace 跟踪、链路管理、数据分析,以及每一个节点流转上的成功率、失败率、 SLA 、PCT99 等各方面的监控和预警。**
你可能认为,这些动作看上去好像和业务没有关系?实际上,上线一个新的功能,它一定是接口维度的,这个接口在平台上做户口注册,接口的QPS、SLA、PCT99等数据都可以在框架层面自动上报做统计分析,同时也会随着接口调用绘制出trace路径,并跟进trace路径得到强弱依赖,这样就完成了对接口在技术层面的所有和质量&性能相关指标的管理。
做好这些管理后,从问题发生,到快速发现问题并通知到相应的服务提供人,再到解决问题,就可以完美地闭环了,所以不管业务如何变化、变得多复杂,并没有太大的影响。这样稳定性的保障工作,就已经可以下沉到基建层面了。
浙江移动在近些年的架构演进中,一方面随着云原生行业的发展,逐步完成对核心业务系统的微服务化以及容器化改造;另一方面,面对国家对国有企业开展国产化自主可控先行先试的战略要求,也在持续进行各类国产化软硬件的替换试错,包括数据库、存储、服务器、操作系统等等。因此我们在长期的踩坑过程中也沉淀了一些稳定性保障经验。
*** SRE参与到架构设计、入网控制、测试发布、应急抢修等各个环节,建立完整的“护航体系”**
传统的研发运维边界往往处在上线交付的时间线上,而稳定性治理工作也都是作为事后的反向提升工作,需要付出大量的工程成本和重复人力投入。因此我们拓展了SRE的职责边界,将稳定性工作左移至软件生命周期的更前端,联合研发提前开展可观测性、稳定性等保障规划,建立起全局的安全生产“护航体系”。现在我们SRE团队除了常规的线上问题修复外,还会涉及上线之前的测试发布,甚至再往前涉及架构评审等的各个阶段SRE都会参加,如此可以全程参与故障的预防和控制。
*** 在应用多活的基础上,建立覆盖业务、集群、网元的多层预案体系,提高应急团队抢修效率**
架构团队现在做新的技术栈引入,或者新的架构变更等等,都有相应的架构评审或架构治理,在这种情况下,我们设了比较多规则,比如链路梳理、强弱依赖梳理、耦合点分析等等。还有更重要的是,会在多活分片的基础上看整个链路环节是否有相应的业务开关,并对每个节点做预案控制,在链路上预埋相应的预案开关,在交付到应急团队时就能根据相应的预案手段及时处理。
那么如何去评估最终的效果?核心系统架构治理后,理论上不允许再出现 G4 (浙江移动内部的故障风险等级)以上故障,即不应出现客户或者业务受审达到较强程度的故障。
*** 构建独立的应急系统,做“多活”的备份,对核心业务做兜底保障**
我们尝试构建了一个完全独立的应急系统,和所有生产平面进行解耦,不和现有生产平面处于同一个机房。比如,浙江移动的生产平面,目前是杭州+宁波两地多中心的架构,那么应急系统就在金华重新构建。同时,这个应急平面系统和生产平面系统是不一样的,在原有的多活架构中,比如杭州和宁波的机房中可能应用部署一模一样,但是在应急平面系统中,我们只保留了最低水平的服务状态。我们基于BASE理论对所有核心业务进行拆解,只把重点依赖的服务在应急系统中重新集成,并将前台受理流程极简化,而且这部分应急数据和生产的数据是不做实时同步要求的,允许有损。因为前台用户在业务受理的过程中,大多数只关心前台的业务动作是否正常。在真正面临所有生产平面不可用的极端情况下,应急系统会自动启用并引导用户进入该平面继续办理业务,而等到生产平面的能力恢复后,再自动将所有应急数据同步回生产系统保障业务数据最终一致性。

添加助理小姐姐,凭截图免费领取以上所有资料
并免费加入「TakinTalks读者交流群」

声明:本文由公众号「TakinTalks稳定性社区」联合社区专家共同原创撰写,如需转载,请后台回复“转载”获得授权。
本文由博客一文多发平台 OpenWrite 发布!
电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。 准备工作: 1、U盘一个(尽量使用8G以上的U盘)。 2、一台正常联网可使用的电脑。 3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。 4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。 U盘启动盘制作步骤: 注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
您认为可以作为插件很好地存在于您的Rails应用程序中必须实现的哪些行为?您过去曾搜索过哪些插件功能但找不到?哪些现有的Rails插件可以改进或扩展,如何改进或扩展? 最佳答案 我希望在管理界面中看到一个引擎插件,它提供了应用程序中所有模型的仪表板摘要,以及可配置的事件图表。 关于ruby-on-rails-您希望看到哪些Rails插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questio
因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实
在Ruby中,以毫秒为单位获取自纪元(1970)以来的当前系统时间的正确方法是什么?我试过了Time.now.to_i,好像不是我想要的结果。我需要结果显示毫秒并且使用long类型,而不是float或double。 最佳答案 (Time.now.to_f*1000).to_iTime.now.to_f显示包含十进制数字的时间。要获得毫秒数,只需将时间乘以1000。 关于ruby-以毫秒为单位获取当前系统时间,我们在StackOverflow上找到一个类似的问题:
关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭8年前。Improvethisquestion我们有以下(以及更多)系统,我们将数据从一个应用推送/拉取到另一个:托管CRM(InsideSales.com)Asterisk电话系统(内部)横幅广告系统(openx,我们托管)潜在客户生成系统(自行开发)电子商务商店(spree,我们托管)工作板(本土)一些工作网站抓取+入站工作提要电子邮件传送系统(如Mailchimp,自主开发)事件管理系统(如eventbrite,自主开发)仪表板系统(大量图表和
我目前有一个reddit克隆类型的网站。我正在尝试根据我的用户之前喜欢的帖子推荐帖子。看起来K最近邻或k均值是执行此操作的最佳方法。我似乎无法理解如何实际实现它。我看过一些数学公式(例如k表示维基百科页面),但它们对我来说并没有真正意义。有人可以推荐一些伪代码,或者可以查看的地方,以便我更好地了解如何执行此操作吗? 最佳答案 K最近邻(又名KNN)是一种分类算法。基本上,您采用包含N个项目的训练组并对它们进行分类。如何对它们进行分类完全取决于您的数据,以及您认为该数据的重要分类特征是什么。在您的示例中,这可能是帖子类别、谁发布了该项
是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案
我正在尝试找出一种方法来显示来自不在RAILS_ROOT下(在RedHat或Ubuntu环境中)的已安装文件系统的图像。我不想使用符号链接(symboliclink),因为这个应用程序实际上是通过Tomcat部署的,而当我关闭Tomcat时,Tomcat会尝试跟随符号链接(symboliclink)并删除挂载中的所有图像。由于这些文件的数量和大小,将图像放在public/images下也不是一种选择。我查看了send_file,但它只会显示一张图片。我需要在一个格式良好的页面中显示6个请求的图像。由于膨胀,我宁愿不使用Base64编码,但我不知道如何将图像数据与呈现的页面一起传递下去。