事务体系中心方针是挣钱,体系稳定性建造中心是防止丢钱(丢钱逻辑如下图所示),站在公司的视点看,产品功能建造和体系稳定性是平等重要。
前段时刻写了《 稳定性管理结构 》,该文章在稳定性建造的理论和实践基础上,笼统出稳定性管理的结构,期望建立一个稳定性管理的标准动作、最佳实践。但从读者的反应上看,有过相似经验的同学深同感受,经验不足的同学没啥感觉,导致这个成果的原因,我反思了一下,以为:概念太粗,落地简单变形。于是,想写一篇文章,把稳定性最重要的东西写出来,于是有了这篇文章。
通常,导致线上事端的最大诱因是“改变”,“可灰度、可监控、可回滚”的办法论,方针就是下降改变引发的线上事端,其逻辑是:首要,经过灰度手段让改变可控,从0%的影响逐渐放量到100%影响;其次,经过监控手段观察改变是否精确,假如精确了,灰度放量才干持续;最终,假如呈现不可控的状况,能够马上回滚,马上止损,防止长期影响客户。
一、可灰度
可灰度是指线上改变能够支撑灰度发布,百度百科对对灰度发布的定义是:灰度发布又名金丝雀发布,指在黑与白之间,能够平滑过渡的一种发布办法。 在其上能够进行A/B testing,即让一部分用户持续用产品特性A,一部分用户开始用产品特性B,假如用户对B没有什么反对定见,那么逐渐扩大范围,把所有用户都迁移到B上面来。
各大厂常用的灰度发布种类有:机器灰度、AB灰度、链路灰度、沙箱灰度等,下面展开讲解:
•机器灰度
一个运用一般会布置多台机器,流量大的运用机器乃至50台以上,先上一台观察是否正常,验证经过后再上其他机器,这个进程叫机器灰度。这种灰度的优下风如下:
| 优势 | 下风 |
|---|---|
| 简略,几乎没有开发本钱和学习本钱。 | ①验证莫非大,难以将验证进程的恳求打到“新上线的机器”上; ②存在小规模毛病风险,“新上线的机器”假如有bug,会小规模影响线上事务。 |
•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;
}
优下风分析:
| 优势 | 下风 |
|---|---|
| ①比较简略,5分钟就能够学会。 ②能够指定用户验证,先验证测验账户,再验证小流量商户,再逐渐放量,可防止线上毛病。 | ①难以应对复杂需求,假定一个需求改动100个办法,经过AB灰度操控就显得很乱了; ②需求上2次线,第一个加灰度操控,第2次去灰度操控。 |
其他重要阐明:
AB灰度一定要操控好放量的节奏,而且每次放量都需求经历“自测”和“线上高峰期”验证,放量节奏的最佳实践是:测验商家 -> 1个商家 -> n个商家 -> 1% -> 5% -> 10% -> 30% -> 100%。
•全链路灰度
线上的代码是默许链路,新代码是灰度链路,给小部分流量染色,让染色流量走到灰度链路,这个进程叫全链路灰度。全链路灰度的示意图如下:
优下风分析:
| 优势 | 下风 |
|---|---|
| ①简单验证,by功能的灰度验证进程,研制能够很方便去验证是否符合预期;②代码侵入少,相对AB放量代码要简洁许多,也无需二次上线。 | ①需求依赖公司的基建能力,小团队难以搞定,比方关于京东,需求JSF渠道、JMQ渠道分别支撑流量染色能力,以支撑同步和异步调用。 |
其他重要阐明:
在研制、测验进程中,常常发现环境不够用的状况,链路灰度的乐意运用到测验环境上,叫做“泳道环境”。举个比方:一个体系有100个运用,假如要布置5套环境,至少需求1005=500台机器,利用泳道环境,仅需求布置一套骨干环境,用到100台机器,假定每个新环境仅改动到2个运用,那总机器数是100+24=108,大大下降机器本钱和时刻本钱。
•沙箱灰度
沙箱的概念在杀毒软件上用的比较多,杀毒软件会搞一个虚拟环境(相似虚拟机),然后将可疑文件放到虚拟环境中运转,然后分析是否有不安全的特征,帮忙判别是否是病毒、木马。
在互联网的运用上,改变是导致线上毛病的元凶,因而,期望有个相似沙箱的环境,将线上流量引入到该环境进行验证(又不对线上形成影响),验证没问题后,再执行上线。
在百川体系上,我们做的AB比照,实际上就是沙箱环境,搭建了一个沙箱环境成为A环境,线上环境成为B环境,流量A环境、B环境运转的成果做比照,比照成果精确,才执行上线。
二、可监控
监控很重要,它是研制了解线上运用的窗口,其重要性可比眼睛对人的重要性。当体系监控不完善,研制就不能先于客户发现问题,研制的专业度就表现不出来,其实是一种羞耻。
对互联网公司来讲,监控不仅仅是机器监控,而是包含机器监控、链路监控、网络监控、事务监控等全方位监控,我们可根据运用的重要性配备上不同的监控体系,以便及时发现和处理线上毛病。下表总结了京东在每个方向上存在的监控体系:
| 分类 | 阐明 | 监控渠道&官网 | 引荐 |
|---|---|---|---|
| 主机监控 | 针对机器的监控,包含cpu、内存、网络等 | mdc 、统一管控渠道、brolly操控台、火眼 | mdc |
| 进程监控 | 监控jvm进行,比方CPU、FullGC、yongGC等 | ump、pfinder、sgm | ump |
| 功能监控 | 监控rpc功能,比方tp99、sla、调用量等 | ump、pfinder、sgm、thor | ump |
| 链路跟踪 | 根据tranceId查询到一个恳求链路的所有节点,包含rpc调用,db等中间件调用等。 | pfinder、sgm、cat | pfinder |
| 日志监控 | 监控运用运转进程的日志 | logbook、 digger | logbook |
| 网络监控 | 针对网络的监控 | NP、DNP网络监控 | NP |
| 数据库监控 | 针对数据库的监控,包含cpu、load、磁盘利用率等方针 | 易维、CleverDB、noah渠道、myops、DBS、数据库智能诊断体系、火眼 | 易维 |
| 中间件 | 针对redis、mq等中间件渠道的监控,默许都需求敞开并运用。 | JSF 、JMQ2、JMQ4、蜂巢、dap、clove、物流网关 | 每个中间件渠道的监控,都需求运用 |
| 事务监控 | 针对事务的监控,比方能够监控订单的同比、订单未闭环、对账场景等。 | 前哨 | 前哨 |
| 安全监控 | 针对安全的监控 | 神盾 | 神盾 |
| web端监控 | 针对web端的监控,比方监控办法的端到端功能、比方埋点等 | DEEPLOG 、子午线、烛龙、Watchtower、sgm-console-web、奇点 | deeplog、子午线 |
| app端监控 | 针对app端的监控,包含功能监控、crash监控等 | SGM(移动端)、子午线、shooter、鹰眼 crash、奇点、烛龙 | SGM(移动端)、子午线 |
| 大数据 | 针对大数据的运用和监控渠道 | dp、bdp、烽火台、imonet、京东动力 | dp |
关于监控来讲,中心方针是“漏报率”和“误报率”,而这2个方针是相互限制的,当把“漏报率”搞得极致则“误报率”会高,引发“狼来了”的现象,当把“误报率”搞到极致则“漏报率”会高,因而,需求平衡好这两个方针,能够这么定方针:误报率小于20%,漏报率小于20%。
三、可回滚
可回滚是兜底,谁也不能保证代码100%无bug,当线上呈现问题时,“先止损,后查问题”是最佳实践,最快的止损办法是:灰度放量回滚,能够做到秒级恢复。但是,假如灰度放量回滚无法解决,那就需求触发兜底动作:回滚。
从个人情感视点出发,研制同学是不期望回滚的,但从客户视点出发,是不能接受线上长期不可用,因而,可回滚是必须的,对线上的每一次改变,假如不能做到“可回滚”,是不能够上线的。
可回滚,肯定不是简简略单的操作运用回滚,而是要从多个视点评价是否可回滚、回滚后需求做什么,包含:
•运用回滚
运用是否能够操作回滚,假如涉及多个运用,回滚的次序是什么等。
•数据库DDL回滚
数据库表的DDL是否需求回滚,假如需求,回滚时长多久、回滚期间会不会形成更大影响等。
•数据回滚
新逻辑产生的数据,回滚后是否兼容,是否需求修复数据,修数据的计划是什么等。
•其他
回滚还需求考虑哪些个性化的影响。


