写点什么

稳定性方法论:可灰度 & 可监控 & 可回滚

  • 2024-03-22
    北京
  • 本文字数:2501 字

    阅读完需:约 8 分钟

业务系统核心目标是挣钱,系统稳定性建设核心是防止丢钱(丢钱逻辑如下图所示),站在公司的角度看,产品功能建设和系统稳定性是同等重要。



前段时间写了《 稳定性治理框架 》,该文章在稳定性建设的理论和实践基础上,抽象出稳定性治理的框架,希望建立一个稳定性治理的标准动作、最佳实践。但从读者的反馈上看,有过类似经验的同学深同感触,经验不足的同学没啥感觉,导致这个结果的原因,我反思了一下,认为:概念太粗,落地容易变形。于是,想写一篇文章,把稳定性最重要的东西写出来,于是有了这篇文章。


通常,导致线上事故的最大诱因是“变更”,“可灰度、可监控、可回滚”的方法论,目标就是降低变更引发的线上事故,其逻辑是:首先,通过灰度手段让变更可控,从 0%的影响逐渐放量到 100%影响;其次,通过监控手段观察变更是否准确,如果准确了,灰度放量才能继续;最后,如果出现不可控的情况,能够立刻回滚,立刻止损,避免长时间影响客户。

一、可灰度

可灰度是指线上变更能够支持灰度发布,百度百科对对灰度发布的定义是:灰度发布又名金丝雀发布,指在黑与白之间,能够平滑过渡的一种发布方式。 在其上可以进行 A/B testing,即让一部分用户继续用产品特性 A,一部分用户开始用产品特性 B,如果用户对 B 没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到 B 上面来。


各大厂常用的灰度发布种类有:机器灰度、AB 灰度、链路灰度、沙箱灰度等,下面展开讲解:


机器灰度


一个应用一般会部署多台机器,流量大的应用机器甚至 50 台以上,先上一台观察是否正常,验证通过后再上其他机器,这个过程叫机器灰度。这种灰度的优劣势如下:



AB 灰度


线上的代码成为 A 分支,待上线的代码成为 B 分支,通过请求中的某个参数(如用户 ID 等)与配置中心(如 DUCC 等)的配置进行比对,命中则走 B 分支,不命中则走 A 分支,这种灰度叫 AB 灰度。


伪代码如下:


………………………………………………………………………………………………………………………………………………原代码…………………………………………………………………………………………………………………………………………………void function(long userId){    /**     新需求,此处要求修改逻辑    */    call methodA();      do something;}void methodsA(){    do something}………………………………………………………………………………………………………………………………………………新代码…………………………………………………………………………………………………………………………………………………private List<Long> config = new ArrayList();void function(long userId){    /**     灰度控制,仅指定的用户进入新逻辑    */    if(config.contains(userId)){         call methodA_new();    }else{        call methodA();    }    do something;}void methodsA(){     do something; }void methodsA_new(){     do something;}
复制代码


优劣势分析:



其他重要说明:


AB 灰度一定要控制好放量的节奏,而且每次放量都需要经历“自测”和“线上高峰期”验证,放量节奏的最佳实践是:测试商家 -> 1 个商家 -> n 个商家 -> 1% -> 5% -> 10% -> 30% -> 100%。


全链路灰度


线上的代码是默认链路,新代码是灰度链路,给小部分流量染色,让染色流量走到灰度链路,这个过程叫全链路灰度。全链路灰度的示意图如下:



优劣势分析:



其他重要说明:


在研发、测试过程中,经常发现环境不够用的情况,链路灰度的愿意应用到测试环境上,叫做“泳道环境”。举个例子:一个系统有 100 个应用,如果要部署 5 套环境,至少需要 1005=500 台机器,利用泳道环境,仅需要部署一套主干环境,用到 100 台机器,假设每个新环境仅改动到 2 个应用,那总机器数是 100+24=108,大大降低机器成本和时间成本。


沙箱灰度


沙箱的概念在杀毒软件上用的比较多,杀毒软件会搞一个虚拟环境(类似虚拟机),然后将可疑文件放到虚拟环境中运行,然后分析是否有不安全的特征,协助判断是否是病毒、木马。


在互联网的应用上,变更是导致线上故障的元凶,因此,希望有个类似沙箱的环境,将线上流量引入到该环境进行验证(又不对线上造成影响),验证没问题后,再执行上线。


在百川系统上,大家做的 AB 对比,实际上就是沙箱环境,搭建了一个沙箱环境成为 A 环境,线上环境成为 B 环境,流量 A 环境、B 环境运行的结果做对比,对比结果准确,才执行上线。

二、可监控

监控很重要,它是研发了解线上应用的窗口,其重要性可比眼睛对人的重要性。当系统监控不完善,研发就不能先于客户发现问题,研发的专业度就体现不出来,其实是一种耻辱。


对互联网公司来讲,监控不仅仅是机器监控,而是包括机器监控、链路监控、网络监控、业务监控等全方位监控,我们可根据应用的重要性配备上不同的监控系统,以便及时发现和处理线上故障。下表总结了京东在每个方向上存在的监控系统:



对于监控来讲,核心指标是“漏报率”和“误报率”,而这 2 个指标是相互制约的,当把“漏报率”搞得极致则“误报率”会高,引发“狼来了”的现象,当把“误报率”搞到极致则“漏报率”会高,因此,需要平衡好这两个指标,可以这么定目标:误报率小于 20%,漏报率小于 20%。

三、可回滚

可回滚是兜底,谁也不能保障代码 100%无 bug,当线上出现问题时,“先止损,后查问题”是最佳实践,最快的止损方法是:灰度放量回滚,能够做到秒级恢复。但是,如果灰度放量回滚无法解决,那就需要触发兜底动作:回滚。


从个人情感角度出发,研发同学是不希望回滚的,但从客户角度出发,是不能接受线上长时间不可用,因此,可回滚是必须的,对线上的每一次变更,如果不能做到“可回滚”,是不可以上线的。


可回滚,绝对不是简简单单的操作应用回滚,而是要从多个角度评估是否可回滚、回滚后需要做什么,包括:


•应用回滚


应用是否可以操作回滚,如果涉及多个应用,回滚的顺序是什么等。


•数据库 DDL 回滚


数据库表的 DDL 是否需要回滚,如果需要,回滚时长多久、回滚期间会不会造成更大影响等。


•数据回滚


新逻辑产生的数据,回滚后是否兼容,是否需要修复数据,修数据的方案是什么等。


•其他


回滚还需要考虑哪些个性化的影响。

发布于: 3 小时前阅读数: 6
用户头像

拥抱技术,与开发者携手创造未来! 2018-11-20 加入

我们将持续为人工智能、大数据、云计算、物联网等相关领域的开发者,提供技术干货、行业技术内容、技术落地实践等文章内容。京东云开发者社区官方网站【https://developer.jdcloud.com/】,欢迎大家来玩

评论

发布
暂无评论
稳定性方法论:可灰度 & 可监控 & 可回滚_京东科技开发者_InfoQ写作社区