"混沌工程不就是随机关掉几台服务看会不会崩吗"——这句话在日常讨论里出现频率很高,但照这个理解去做的演练,绝大多数既没证伪什么,也没人敢在业务窗口里跑第二次。屏幕上的指标抖了一下又平回去,群里发一句"看起来没问题",复盘文档里写一句"系统具备容错能力",这次活动就算收工了。可如果当场追问一句:这一轮到底证明了什么、下次能不能照着复用?多数时候答不上来。更常见的是第二次再做同样动作时,换了一台机器、赶上另一个流量形态,结果完全对不上,于是团队对这类演练的信心反而更低。
真正决定一次实验能不能重复的,其实是开始之前写下来的那三条定义:用什么指标判断"还算正常"、允许这次动作影响到多大范围、出现什么信号就无条件停止。这三条写不出来,注入再多种类的故障也只是把随机事件搬进了生产,拿到的是运气而不是结论;这三条写得出来,哪怕只让一个下游依赖的响应变慢,也能得到一条能对外讲、能被下一次复用的判断。混沌实验的分水岭不在于注入了多少种故障,而在于这三个前置定义有没有先落地。
随机关掉一台服务,最大的问题不是危险,而是它没有对照组、没有先验判断。你事先没说清"应该发生什么",所以事后的任何结果都能被解释得通:指标没动,说明冗余做得好;指标动了,说明这一层本来就脆弱;恢复快,是自愈机制生效;恢复慢,是这次赶巧。一个什么样的结果都无法反驳的活动,信息量就是零。
公开倡导的做法里有四条原则经常被引用:围绕稳态行为建立假设、在真实环境中进行实验、让实验持续自动化运行、把爆炸半径压到最小。这四条里没有一条叫"随机关",也没有一条暗示"注得越多越好"。它们共同指向的是同一件事——实验必须是一个可重复、可证伪、可收敛的过程。
选择偏差是第二个坑:人天然会挑大家都相信冗余的那个组件下手,也挑自己最熟悉、出问题最能兜住的那个,结果真正没被验证过的路径一直没被验证。第三个坑更隐蔽——样本量等于一,区分不了"接管真的成功"和"当时恰好没有流量走那条路径",而这两者的差距恰恰是你要搞清楚的东西。
稳态指的是系统在正常状态下可以被持续测量的输出特征。实验的全部判据都挂在这个东西上,它选错,后面做得多规范都没用。常见错法有三类。
第一类是选了离注入点太近的指标。用容器重启次数、进程存活数、宿主机负载去判断"系统还算正常",只能证明你的注入确实生效了,证明不了用户有没有被影响。注入生效这件事不需要一次实验来告诉你,脚本返回码就够了。
第二类是选了会被平均值抹平的指标。分钟级平均值、全站聚合量,会把局部劣化稀释到看不出来。反过来也一样:整体指标在抖动,可能只是别处的无关流量在涨,与你这次注入无关。区分两者靠时间上的对齐——注入那一刻指标序列上要有对应折点,同时需要一个本不该动的对照指标。
第三类最容易被忽略:指标的分母在实验期间自己变了。故障发生后,部分请求被重试、丢弃、限流或转移到别的节点,活下来的才是被统计的那批,分母缩小会让指标反而变好,这是典型的幸存者偏差;同理,慢请求若已超时断连,剩下的延迟样本也会偏快。所以稳态定义里必须同时写清分子分母口径:是否包含重试、是否剔除客户端主动取消、是否按请求来源分组。
三个候选各有适用场景,也各有陷阱。
成功率最直观,但它高度依赖分母定义,而且容易被客户端重试掩盖——服务端失败一次,客户端重试成功,用户侧看到的成功率依旧很高,但延迟和资源消耗已经翻倍。所以单独看成功率会漏掉"变慢但仍成功"这一类损伤。
延迟分位(例如 P99、P999)能看到尾部行为,也更能反映被甩在后面的那批用户体验。但分位有两个前提:一是样本量要够,流量低谷时分位本身波动剧烈,容易把噪声判成故障;二是聚合方式要对,把多个实例各自算出的 P99 再平均一次在数学上是没有意义的,要么按全局分布重算,要么专门盯最差的那个实例。另外,分位对"少量请求明显变慢"敏感,而这恰恰可能是这次实验唯一值得看的信号。
业务口径最接近真实损失:单位时间内有效完成的单数、回调回填的成功比例、队列积压深度、对账差异笔数。它的价值在于能回答"到底伤到了多少业务",缺点在于滞后——这些数字往往要几十分钟甚至更久才稳定下来,不适合做实时叫停依据。
比较稳的做法是把稳态定义成一个三层集合而不是一个数字:实时层用成功率和延迟分位做即时判据;派生层用重试放大倍数、队列深度、连接池占用率做中继印证;业务层用业务完成量做最终核对,并把核对窗口拉到远长于实验本身。一句话,先保证坏事能被及时看见,再保证损伤能被最终核算。每层阈值取多少,以你自己的系统与业务窗口为准,需自行验证。
还有一个小动作值得固定下来:每次挑一到两个本次不应该发生变化的指标作为对照组写进实验单。对照组不动,你才有底气说观测到的变化来自注入。
爆炸半径不是一句"控制影响面"就够了,它至少有三个独立的闸门,每一个都必须单独写上界。
第一个闸门是实例数。首次不该从"关掉一半"起步,应该从一个实例、一个副本、一台宿主机上的单个入口开始,并且明确"最多同时影响多少个"。这里要提前算的不是实例数本身,而是剩余容量能不能承接被摘掉那部分流量。注意承接往往不是均匀的:长连接不会自动迁走、会话保持会把用户钉在原实例上、连接池里已有的连接不会因为健康检查结果变化立刻失效,这些都会让流量转移到少数节点上造成二次过载。把这些非均匀性算进去,才是真实的上界。
第二个闸门是流量比例。只有在灰度子集或带标记的流量上实验时,这个闸门才真正可控。要注意比例和用户数不是一回事:如果路由按用户标识哈希,百分之一的流量很可能长期落在同一批固定的大客户身上;如果按地域划分,小比例也可能意味着整个某个地区全量受损。所以比例的划分维度要写清楚:按请求随机、按用户分区、还是按地域或业务线。
第三个闸门是持续时长,也是最容易被低估的一个。往下要长到足以跑完完整的"检测—决策—接管—预热"链路,把健康检查探测间隔、连续失败阈值、重试退避、新实例慢启动预热、缓存重建这些耗时全部加进去,否则你会在接管完成之前就把实验撤了,得到一个"没有影响"的假结论。往上要短到失控之前收得住,首次建议按台阶逐步加长,而不是一次性拉满。
三个闸门之间是乘法关系,总的影响面是它们叠加的结果,任何一个放宽都会放大另外两个的影响。此外还有两件容易被漏掉的事:一是恢复过程本身也要设闸,雪崩、缓存击穿、连接池瞬间打满往往发生在恢复那一刻;二是空间维度要单独记一笔——限定在某个可用区、某个机柜、某个机房、某个依赖实例的哪一分子集,写清楚才谈得上"可控"。
靠人叫停有三个绕不开的问题:反应慢、"再等等看能不能自己恢复"的心理、以及联席群里没人愿意承担叫停的责任。等讨论出结论,窗口早就过了。所以终止条件必须是机器判定、机器执行,人的职责是确认它真的执行了。
终止信号建议按三类来写。第一类是稳态越界:指定的稳态指标越过某个界限,并且连续若干个采集周期都保持越界状态。"连续若干个周期"这个限定很重要,单次采集点抖动就中止,会让实验永远跑不完。第二类是兜底资源触及:剩余可用容量低于某个比例、队列长度超过某个值、下游重试倍数超过某个数,这类信号比用户侧指标更早出现,适合作为提前中止的前哨。第三类是环境信号:窗口时间到、依赖方正在做变更、值班联系人失联、或者出现了与本次实验无关的告警——只要出现就无条件撤。
阈值判定还有一个容易吵起来的细节:开闭区间怎么写。取"严格劣于"判定时,恰好等于阈值的点算正常,不会因为边界附近的固有抖动频繁中止;取"含等于"判定则相反,会把压线状态算作越界。两种写法本身没有对错,关键是与你在定义稳态指标时采用的统计口径保持一致——若阈值本就取自稳态区间的边界值,再用含等于判定失败,等于给自己制造误中止。具体取哪种口径以你自己的系统为准,需自行验证。
中止动作的粒度也要预先排好顺序:优先回滚本次注入,其次摘掉受影响流量,最后才是更大范围的熔断或降级。另外一件必须先做的事:真正注入之前单独验证一次中止路径本身,确认它立刻生效并留下记录。没验证过的中止按钮,不算中止条件。
假设可以套一个固定句式:在【限定范围】内对【具体组件】注入【具体故障行为】,【稳态指标】在【多长观测窗口】内应保持在【明确阈值】之内,因为【已知的接管或兜底机制】会生效。
拿它去比对常见的写法就很清楚。"关掉一台应用实例后服务不受影响"这一句看着像假设,其实是四个边界全缺:哪一台、对哪部分流量、用什么指标衡量、观察多久。补完整之后大致是:在灰度子集内的任意一个应用实例上杀死进程,成功率与 P99 延迟在约定的观测窗口内保持在既定阈值之内,因为上层健康检查会在约定时间内完成摘除,剩余实例能够承接这部分流量。这一句才是能用来做实验的东西。
三条硬性要求。其一,一次实验只承载一条假设,多个假设同时验证等于同时改变多个变量,出了结果无法归因。其二,假设必须在实验开始前记录落盘,实验结束后不允许回头修改——这是防止事后合理化最关键的一条规矩。其三,假设必须绑定一个说得出名字的机制;如果你讲不清预期由什么来兜住,那就不是实验,是抽奖。
最后一点心态上的事:假设被证伪,实验是成功的,因为你拿到了一条确定的、可行动的缺陷;反过来,得到了你想要的答案但设计不严谨,才是真正的风险,因为它会转化成一种没人去核实的信心。
把注入点分层不是为了列清单,而是因为每一层成本和能验证的东西完全不同。
第一层是进程与容器:杀进程、容器被驱逐、内存超限被回收、CPU 配额被打满、线程池耗尽、磁盘或 inode 写满、时钟偏移。这一层的优点是隔离性好、恢复快、可以在常态化流水线里跑,缺点也很明确——它验证的大多是编排层的重启与调度是否生效,验证不到业务链路真正做了接管没有。
第二层是主机与机房:单台宿主失联、单个机架断电、单个可用区不可用、乃至控制面本身失效。控制面失效这一项值得单列,因为一旦编排层的控制面出问题,前面所有依赖它的自愈能力都会同时消失,很多团队从没练过这种场景。这一层最接近真实的区域失效,恢复也最慢,物理前提往往要向外部确认。
第三层是网络与依赖:丢包、往返延迟增加、域名解析失败、连接池被耗尽、证书过期、下游依赖返回特定错误码或明显变慢、消息队列积压、缓存层失效。这一层的最大好处是能精确塑形——你可以只对某一条依赖、某一类请求生效,而不是整台机器整体消失。对大多数团队来说,它是收益最高、代价最小的一枪。
此外还有一个容易被漏掉的元层:可观测性与自动化本身失效。监控链路断了、告警通道不通、中止按钮不可用——这一层不影响业务,却决定了前三层实验是不是在盲飞。它的测试成本极低,优先级其实应该排在很前面。选择原则只有一句:注入点必须能被描述成"哪个组件、产生什么行为、持续多久",描述不清的先别注。
排序的第一个理由是塑形精度。主机宕机是二进制的、显式的,健康检查和编排层天然会处理,验证的多是已经比较成熟的能力;而依赖失效是渐进的、灰度的,超时与重试配置在哪里没配好,往往只有在依赖夯住时才第一次暴露。第二个理由是波及范围更容易限定——你可以只影响某一条链路,而不是整台机器上的所有服务。
具体到首次排序,建议按三步走。第一步,挑一条冗余清晰、兜底机制明确、你自己最笃定的依赖,用它来验证整套方法:注入能否生效、中止能否生效、观测能不能立刻看出变化。这一步的目的不是找缺陷,而是把流程跑通,所以不要挑最难的那个。第二步,转向历史上真的出过问题、或者你心里最没底的那条依赖,这时候流程已经顺了,可以集中精力看结论。第三步,才轮到区域级失效,比如整个可用区或整个机架。
区域级放在最后,是因为它的物理前提最多、外部协调成本最高、恢复最慢,一旦这一步出了偏差,代价远高于软件层注入。还有一条贯穿始终的纪律:宁可把同一个注入点用不同参数做上好几轮,也不要一次同时打开好几个注入点。多个变量同时动,得到的结果是没法拆开看的。
预发或准生产环境的作用是验证实验本身而非系统:注入脚本能否执行、中止能否立刻生效、观测面板能否覆盖关键信号。要注意预发与生产在流量形态、数据量级、缓存命中率、依赖真实性上的差异会削弱结论的外推能力——预发通过只代表这场实验具备开跑条件。
第二阶段是灰度子集或带标记的流量,它同时具备真实环境和影响面可控两个属性,通常最值得投入。使用前必须先查清一件事:这条链路会不会真的写入真实数据、产生不可逆副作用。这一点只能靠核查确认,不能默认没有。
第三阶段才是限定的生产窗口,前提是明确的业务低峰、有值班人员在岗、有已验证的回滚路径、窗口内变更冻结,且窗口时间写死,到点就撤。需要澄清的是,"在真实环境中进行"不能被理解成第一步就上生产,它说的是结论必须在真实环境中取得才有效——所以路径是在受限的真实子集上拿到结论,再决定是否扩大。
人员安排只要写清四个角色就够了。实验负责人全场唯一决策人,从头盯到尾;中止执行者,可以是现场任何一个人,且不需要任何审批——这条要以明文写进实验单,因为默认状态下人是会犹豫的;相关依赖的值班联系人,保证能立刻拉到人;业务方知情代表,负责对影响范围做最终确认。还需要一条兜底:负责人失联时,由谁接管,这条路径必须提前演练过。
时间窗口除了避开业务高峰,还要避开依赖方的维护窗口、批处理与结算窗口、已知的大促活动,以及团队实际上没人盯的时段。另外要给监控和告警做好区分标记:不打标,一次实验会引发一串真实告警,消耗团队对告警的注意力;但如果打标方式是把告警整体屏蔽,真实故障会被一并吞掉,两者都不可取。
通知范围宁宽勿窄:受影响的业务方、值班与监控中心、可能接到异常问询的一线,都应提前知道时间窗、影响面、预期表现和联系通道。一条硬性要求是,不要让告警成为别人第一次得知这场实验的方式。
开跑之前必须先做一次观测自检:注入发生的那一刻,你的面板能不能在几秒内看出变化。看不出就先修观测,不要急着注故障。这一条能省掉大量"实验结果无法解读"的返工。
采样周期要显著短于实验持续时长。如果指标是三十秒或六十秒聚合一次,而实验只跑二十秒,那么整个故障窗口可能完全落在两个数据点之间,看上去毫无变化。采集分辨率至少要保证在整个实验窗口内能采到足够密集的数据点,具体取多少以你自己的采集链路与成本为准,需自行验证。
日志方面,实验窗口内的日志要单独打标并延长保留期,避免被滚动策略删掉,保证事后还能回答这条请求当时走了哪条路径。链路追踪建议在实验期间提高采样率甚至短时全采,否则最值得看的尾部行为恰恰是采不到的那一批;由此带来的存储与性能开销要提前评估。
还有一件基础但常被跳过的事:所有数据源必须有时钟同步保证。跨主机、跨机房的数据如果对不上时间轴,归因从一开始就失败,而且这种错误在复盘时极难发现。最后,实验记录要留全:注入点、参数、起止时间戳、指标序列、是否中止、中止原因、当时的变更与发布记录。没有这些元数据,复盘就只能变成回忆比赛。
第一条产出是一条被明确处理过的假设:这次验证或证伪了什么,以及这个结论在什么样的边界内才成立。写边界很重要,因为在灰度子集上验证过的东西,不能顺手推广到全站。
第二条产出是一个排序后排在首位的缺陷。注意是"一个",不是"一份清单"。把发现的问题全部列上去,通常等于一个都不修。而且这个缺陷要能落到某个具体机制或某项具体配置上,落到"需要加强监控"这类表述是没有后续的。
第三条产出是一次具体的变更:修复这个缺陷的那一次改动,附带验证方式和验证时间安排。没有变更的复盘基本等同于没复盘。
归档环节做两件事就够了:把实验记录整理成下一个值班的人能找到、能照着复现的形式;再想办法把它变成可重复执行的实验,回归到流水线或定期任务里,这既对应"让实验持续自动化运行"那条原则,也防止修好的东西在几个月后悄悄失效。反面素材也很典型:复盘文档里只有"运行平稳、本次演练成功"这类结论式句子,信息量为零。
四类系统建议先放到一边。第一类是有状态服务:状态复制与选主行为复杂,一次注入可能触发大规模数据重同步,恢复时长不可预测。第二类是强一致或涉及资金、账务、结算的系统:错误窗口内的业务副作用难以撤销,事后对账成本高,往往不抵演练收益。
第三类是没有回滚路径的那一层:不可逆的数据迁移、一次性硬件动作、外部依赖的单向操作,注入之后无法拉回原状,只能靠设计阶段的冗余保障。第四类是观测没覆盖到的组件,补齐观测之前不做实验。此外还有一种临时性排除:系统正在变更或发布期间,叠加注入会让任何异常都无法归因。
以上都不是永久排除,而是前置条件:把观测补上、把回滚路径做出来并验证过、把影响面压到可接受,就可以回来做。
按注入点性质可归成三类,适用边界差别很大。第一类是单进程或单实例类,成本低、可逆快、组织阻力小,适合放进流水线做常态化回归,但能验证的东西有限。第二类是依赖塑形类,给某条依赖加延迟、注入错误码、模拟丢包,精度高、影响面可控,是首次定型阶段性价比最高的选择,也最适合验证超时重试与降级策略。第三类是区域与物理层类,比如整机柜、整个可用区、整个机房的失效,它最能回答"部署到底分散没有"这类真问题,但前提依赖外部确认、恢复慢、组织成本高,建议放在前两类积累出经验之后再安排。
一万网络深耕 IDC 行业 19 年(成立于 2007 年),在华南、华东、华北及中国香港、海外多地整合自营节点与 BGP 多线资源,提供服务器租用、机柜托管与带宽接入的一体化交付;具体机型、带宽与报价以官网实时信息或咨询确认为准。实验里有一类假设最终会落到物理层——主机是否会同时宕、机位或机房是不是真的分散,这类前提往往要和资源提供方确认。
这类前提之所以特别麻烦,是因为你能读到的通常是拓扑描述,而不是真实的部署清单。可行的做法是把问题写成一份逐条确认清单:是否共用同一路供电、是否共用同一组网络设备、是否落在同一台物理机上、机位或机房是否真的跨开,然后向资源提供方逐条确认,并把答复内容与答复时间一并留档,作为实验假设的前置条件。切记两头都不能想当然:既不能因为文档写着分散就认定分散,也不必反过来默认一定扎堆。
准备第一次故障时最常被追问的几个问题
问题一:多大的流量比例算安全起点?没有通用答案。稳妥做法是从你能精确定向的最小子集开始——某个内部租户、某个离线批次、某个灰度标记里的极少量用户,先证明失控时能立刻收敛再往上一级加。起点取决于剩余容量、止损速度和受影响业务的权重,以你自己的系统为准,需自行验证。
问题二:要不要提前告诉业务方?要。公开倡导的做法是受控实验而非突袭,受控的核心就是让相关方提前知道时间窗、影响面和联系人。通知不会降低实验价值,真正降低价值的是提前把系统临时改造到位,这两件事要区分开。
问题三:没有跨可用区条件还能不能练?能,而且更应该练。依赖塑形类实验不依赖多可用区条件,冗余度越低,超时与降级配置的正确性就越关键。区域级失效等条件具备后再做即可。
问题四:判定阈值时,为什么有时候取"严格劣于"而不取"含等于"?要不要把恰好压线的点算作越界,取决于你的稳态阈值是怎么取出来的。若阈值本身取自正常波动的边界值,含等于判定会把固有抖动判成故障,造成频繁误中止;若阈值是明确的容忍底线,含等于反而更合理。选定一种口径后保持中途不变即可。
问题五:一次只注入一个点,是不是效率太低?从单次看慢,从累积看更快。多变量同时注入的复合结果无法拆分,通常还得重做,而逐个注入留下的结论可以累积成一张可信的可靠性地图。
问题六:实验后稳态指标毫无变化,是不是白做了?未必。先确认注入是否真的生效、观测分辨率能否覆盖实验窗口、指标分母有没有在实验期间缩小。三者都没问题仍然没有变化,那就是一条有效结论,写清边界后归档。
问题七:第一次由谁来主持?建议由既熟悉这一层架构、又能直接操作中止的人主持,且不必向任何人请示即可叫停;纯粹的技术旁观者担任主持人会拖长决策链条。
多大的流量比例才算安全起点?起点应该取“稳态指标还能被清楚观测到”的那一档,而不是取一个看起来很小的整数;具体取多少,按你自己的指标灵敏度与业务容忍度确定,需自行验证。
演练要不要提前告诉业务方?要。窗口、叫停人、通知链路和回滚动作四项都要写进方案,临时通知会让“叫停权限”这件事落空。
没有多机房条件能不能练?能。先从进程与容器层、以及依赖失效练起,机房级与区域级的故障可以先做桌面推演,把假设、观测点与处置动作先定下来,等条件具备再补实。
终止条件能不能只靠人盯?不建议。触发条件应写成可以被系统自动执行的信号,人的判断留给“是否需要扩大或提前结束”这类二次决策。
实验把系统打挂了,是不是说明系统不行?说明假设被证伪,这正是实验的价值。复盘产出应当收敛成一条被修正的假设、一个具体缺陷、或一次明确的变更,而不是一份感想。
多久练一次合适?没有通用周期。以你的变更频率、依赖变化速度与发布节奏为准,通常配合重大架构变更或版本节奏安排,需自行确定。
先划清本文的边界:这里讨论的是实验设计方法,不比较任何具体工具或平台的功能,也不提供任何性能数值、可用性数字或压强参数。凡是涉及具体参数取值的地方,都以你自己的系统与业务窗口为准,需自行验证。下面这张表把六个要素的常见错法、推荐做法与留给你自行确认的部分并列出来。
| 实验要素 | 常见错误做法 | 推荐做法 | 为什么这么定 | 实验前要写进方案的内容 |
|---|---|---|---|---|
| 稳态指标的选择 | 用容器存活数、主机负载这类靠近注入点的指标,或直接用分钟级平均值判断"正常" | 按实时层、派生层、业务层组成三层集合,写清每层分子分母口径,并固定一到两个不应变化的对照组指标 | 单一指标既躲不开幸存者偏差,也区分不了损伤与噪声,三层集合才能同时兼顾及时发现与最终核算 | 各层阈值取值、业务层核对窗口长度,以及故障期间分母是否会变化,需按你的业务自行验证 |
| 爆炸半径的划定 | 关掉一半实例,或只写一句"控制影响面" | 实例数、流量比例、持续时长三个闸门分别写上界,空间范围单独注明 | 三个闸门是乘法关系,任一放宽都会放大另外两个的影响 | 剩余容量能否承接、长连接与会话保持带来的非均匀转移程度 |
| 终止条件的设定 | 写成"发现异常就由负责人决定停止",依赖人的现场判断 | 写成机器可判定的三类信号:稳态越界且连续若干周期、兜底资源触及、环境类信号出现即撤 | 人的反应速度与决策意愿都不可控,只有机器判定能在窗口内真正收敛 | 越界的判定开闭区间、连续周期数,以及中止动作的执行顺序,需与你的稳态口径保持一致 |
| 实验假设的写法 | 写成"关掉一台后服务不受影响"这类没有边界的判断,事后允许修改 | 一句话写全限定范围、故障行为、稳态指标、观测窗口、预期机制,开始前落盘,结束后不改 | 边界缺失的假设什么事后面都能自圆其说,信息量为零;事后可改则等于取消了可证伪性 | 预期生效的那个兜底机制是否存在、其实际耗时是否在窗口内,需自行核查 |
| 注入点的顺序 | 多个注入点同时开启,或首选最没把握的那一层 | 先从单个依赖塑形做起,一次只动一个变量;先拿最稳的组件跑通流程,区域级放最后 | 多变量同时变化无法归因;流程不熟时挑战最难组件,会把方法问题与系统问题混在一起 | 区域级实验涉及的物理部署前提(供电、网络设备、物理机、机位分布),需逐条向资源提供方确认 |
| 观测与留存窗口 | 六十秒聚合的指标去观察二十秒的实验,日志按常规策略滚动清理 | 采集分辨率保证窗口内有密集数据点,实验期日志打标并延长留存,短时提高链路追踪采样率,所有数据源时钟同步 | 采样粒度粗于实验时长会让整个窗口落在两格之间;没有元数据就无法在复盘时重建过程 | 提高追踪采样带来的存储与性能开销、日志保留时长,需结合自身成本自行评估 |
表格之外,还有几件必须你自己跑一遍才敢写进实验单的事:中止按钮按下去到底几秒内生效;健康检查探测间隔、失败阈值、重试退避、慢启动预热这几段耗时加起来有没有超出你的容忍窗口;灰度或标记流量会不会真的写脏数据;以及你所依赖的物理层前提是不是只对得上文档描述。这几项如果只凭印象填,出问题时往往就出在这里。
能不能做这场实验,不看有没有趁手的工具,看三件套有没有写下来——稳态指标、爆炸半径、终止条件,缺一项就不开工。第二条,稳态必须是用户侧能感知的输出,而且一定是一个集合不是一个数。第三条,首次永远从最小开始,每一个台阶前先验证中止路径依然有效。
第四条,一次只动一个变量,多个简单结论胜过一次复合结论。第五条,透明度优先于惊喜:提前通知是受控实验的一部分,但提前把系统加固到比平时更结实,等于取消了实验的意义。第六条,假设被证伪要当成实验成功,真正该警惕的是得到了想要的答案却说不清设计边界。
第七条,用最稳的组件练流程,用最不稳的组件换收益。第八条,观测看不到的地方不做实验。最后一句给整套方法定调:缺了这三件套,所谓演练只是把随机故障搬进了生产;有了这三件套,哪怕只做一次很小的注入,也能换来一条可以复用的结论。
本文的方法骨架引用的是混沌工程领域公开倡导的几条原则——围绕稳态行为建立假设、在真实环境中进行实验、让实验持续自动化运行、把爆炸半径压到最小,这几条仅作为方法论层面的引用,不指向任何具体企业或厂商,也不引用任何一家的具体数据。
全文不提供任何实测数据、跑分结果、可用性数字或压强参数,不比较任何具体工具或平台的功能,也不涉及具体数据库产品的配置细节;文中出现的所有范围、比例、时长、阈值类表述,均为设计方法上的说明,具体取值一律以你自己的系统、容量状况与业务窗口为准,需自行验证后方可写入实验单。
一万网络深耕 IDC 行业 19 年(成立于 2007 年),在华南、华东、华北及中国香港、海外多地整合自营节点与 BGP 多线资源,提供服务器租用、机柜托管与带宽接入的一体化交付;具体机型、带宽与报价以官网实时信息或咨询确认为准。涉及具体的机型、机柜位置、带宽与报价,仍需以官方实时信息或咨询确认为准。
如果你的团队正处在"主备或多可用区已经搭好、监控也有,但从没验证过接管是否真的生效"这个阶段,最省力的起手式不是去挑更多场景,而是先把一次最小实验的这三项定义写出来,跑通流程,再谈扩大。
Copyright © 2013-2020 idc10000.net. All Rights Reserved. 一万网络 科技有限公司 版权所有 深圳市科技有限公司 粤ICP备07026347号
本网站的域名注册业务代理北京新网数码信息技术有限公司的产品