先把话说死:在生产环境做故障演练,不该不该做,取决于你有没有资格做,而不是你团队有没有胆量做。我见过太多团队把混沌工程当成一种姿态——买两个开源工具、拉个作战群、挑个周五晚上往生产里注入几秒网络延迟,然后双手合十等结果。这种操作的本质不是演练,是拿线上业务赌运气,赌赢了收获一份自我感动,赌输了就是一次自导自演的生产事故。
真正决定成败的,是三个前提条件:能观测、能回滚且回滚时间可预期、爆炸半径可控且组织层面已授权。这三个前提不是"锦上添花"的加分项,是"必须有"的准入门槛。缺任何一个,生产演练都不成立——注意,是不成立,不是"风险高一点"。
本文不打算写成一本科普读物。它就是一份判断书:你照着逐条核对,够格就往下走,不够格就先回去补课。下面这几条是全文的核心判断,如果只记住这些也够用:
很多团队对"演练"的理解停留在"我们制造了一点麻烦,然后系统扛住了"。这个理解漏掉了最关键的部分。一次合格的故障演练,在动手之前必须写清楚三样东西。
假设,指的是你预期会发生什么。比如"摘掉订单服务三个副本中的一个,剩余副本能在 30 秒内接管流量,接口 P99 延迟上升不超过 20%"。注意这个假设是可以被证伪的——如果实际是延迟翻了三倍,那你的假设就错了,演练的价值恰恰在于暴露了这个错误。没有假设的演练,做完你也不知道自己验证了什么。
边界,指的是你允许影响的范围。是单节点、单可用区、还是单个接口?是 1% 的流量还是 100%?影响的时间窗口是 5 分钟还是 30 分钟?边界必须在动手前确定,而不是出问题后再讨论要不要停。
退出条件,指的是什么情况下立刻中止。这一条最容易被忽略。常见的退出条件包括:核心接口错误率超过 1%、订单创建失败率超过 0.5%、值班同学连续两次无法判断当前状态。退出条件要写成可执行的判断,而不是"感觉不对就停"——真到了紧张的时候,"感觉"是不可靠的。
这是我最常听到的一句话,也是最需要警惕的一种自我欺骗。
事故和演练的根本区别,不在于系统受了多大冲击,而在于冲击是不是你主动施加的、范围是不是你选的、以及你是不是随时可以喊停。事故来的时候你没有假设(你不知道会挂在哪里)、没有边界(它影响多少就是多少)、没有退出条件(你只能被动救火)。就算最终扛过去了,你收获的也只是"这次运气不错"和一堆事后才拼凑出来的现象,而不是可复用的认知。
更麻烦的是,扛过一次事故会给团队一种错觉:我们系统很健壮。但事故通常只命中了一条路径——比如某台机器的磁盘挂了——你恰好有冗余,所以没事。可你并不知道其余九条路径是不是也这么结实,因为没人去碰过它们。演练的意义就在于主动、可控地把这九条路径都走一遍,而且是在你能兜住的时候走。
顺带说一句,把"我们做过压测"当成演练也是同一类混淆。压测验证的是容量上限,回答的是"能扛多少 QPS";故障演练验证的是容错能力,回答的是"少了一半资源还能不能活"。两个问题不一样,工具也不一样。
可观测性这件事,在平时是"排查问题的效率",在演练时是"能不能得出结论"的唯一依据。动手之前,你必须能对演练涉及的服务回答下面四个问题,答不上来就说明还没准备好:
这个服务的基线延迟是多少?不是"挺快的",而是具体到 P50、P95、P99 三个分位数,以及它们在一天里的波动范围。为什么强调分位数?因为平均值会骗人。一个服务平均延迟 80ms,但 P99 是 3 秒,那它有 1% 的请求体验极差,故障演练一旦触发重试,这 1% 会迅速膨胀成雪崩的起点。你只有知道基线,才能判断演练中延迟上升是"预期内的抖动"还是"已经失控"。
这个服务的基线错误率是多少?很多服务的错误率天然不是零——上游偶发超时、第三方接口抖动、用户传了脏参数,都会产生错误。如果不知道日常基线是 0.02% 还是 0.5%,演练中错误率升到 1% 的时候,你根本没法判断这是演练引起的,还是本来就这样。
依赖调用链长什么样?一个下单请求背后可能串了十几个服务:网关、鉴权、库存、计价、优惠、支付、消息队列、数据库。故障演练注入在 A 服务上,但现象可能出现在 G 服务上。没有调用链追踪,你看到的是一堆散落的报错,拼不出因果。这类追踪能力在演练里的作用,是把"哪个现象是根因、哪些是连带反应"分开。
资源水位在哪里?CPU、内存、连接池、线程池、磁盘 IO、网络带宽、队列积压深度。这一条尤其重要,因为故障演练最典型的失败模式是"余量本来就不够"。一个连接池日常使用率已经 75% 的服务,你摘掉一台实例,剩下两台立刻打满,演练结果不是"验证了容错",而是"验证了容量不够"——这个结论当然也有价值,但它应该在容量规划阶段得到,而不是用一次生产演练换。
说句实在话,可观测性不足的演练,比不做演练更糟糕。原因很简单:不做演练,你至少知道自己不知道;做了一次得不出结论的演练,你会误以为自己知道了。
典型的场景是这样——注入故障后监控大屏上一片红,团队一通排查,恢复后开会复盘,结论是"系统整体表现符合预期,个别指标有波动,后续持续优化"。这句话翻译过来就是:什么都没验证出来。因为没有基线,所有数字都失去了参照系;因为没有调用链,所有现象都失去了因果;因为没有退出条件的量化依据,整个演练过程是凭感觉在走。
所以我的建议很直接:如果你的服务连延迟分位数、错误率基线、依赖拓扑这三样都拿不出来,那就别碰生产演练。先把监控补齐,把关键接口的指标打点做全,把调用链追起来。这件事花的时间通常比想象中少,但它是后面所有工作的前提。没有这一步,后面聊回滚、聊爆炸半径都是空谈。
这句话我在很多场合说过,因为它踩坑的人实在太多。有备份,说的是你手里有一份数据或者镜像;能回滚,说的是你可以在一个可预期的时间内,把系统恢复到一个已知良好的状态,并且这个恢复动作本身不会带来新的故障。
举个具体例子。假设你有一台服务器,每天凌晨做一次全量备份。现在演练中这台机器的系统盘出了点问题,需要恢复。你的备份是 12 小时前的,那么问题来了:这 12 小时内的数据变更怎么处理?恢复过程需要多久,这段时间业务怎么办?恢复用的镜像和当前运行的内核、驱动、运行时版本是否兼容?恢复之后服务能不能正常起来?
这一连串问题,就是"有备份"和"能回滚"之间的鸿沟。演练前必须把回滚路径完整走过一遍,并且记录下每一步的耗时。是的,必须真的走过一遍,不能靠推演——推演出来的时间和实际时间通常差得离谱。
运维实践里常用的回滚手段大致分三类,它们的适用场景和时间量级差别很大,混着用是要出事的。
系统盘快照回滚。这是速度最快的一类,原理是把系统盘恢复到某个时间点的状态。它的优势是操作简单、耗时通常在秒级到分钟级,适合"系统配置被改坏""依赖装错版本""内核参数调飞了"这类问题。它的局限也很明确:只覆盖系统盘,数据盘上的业务数据不在保护范围内;而且回滚后系统盘上在快照之后产生的变更会全部丢失。所以这类手段的前提是"你的业务数据不在系统盘上"——如果业务数据混在系统盘里,回滚就等于删数据。一万网络提供的免费系统盘每日 3 份快照、30 秒回滚,就属于这一类,对于"配置类故障"的恢复非常实用。
镜像回滚。指的是把实例整体换成之前打好的自定义镜像重新拉起。它的恢复能力比快照更强,因为镜像是完整的、可复制的,你可以在另一台机器上拉起同样的环境。代价是时间更长——涉及实例重建、数据挂载、服务启动、健康检查,实际耗时取决于数据量和启动流程,短则几分钟,长则半小时以上。这类手段适合"环境本身不可信了,需要彻底重建"的场景。
流量摘除。严格说这不是"回滚",而是"止损"。它的做法是把出问题的节点从负载均衡或服务注册列表里摘掉,让流量不再进来。这是三类手段里最快的一种,通常是秒级生效。但要注意,流量摘除只能止血,不能治病——被摘掉的节点还是坏的,你只是暂时不用它了。而且如果被摘的节点承载了有状态的数据,摘除可能会引发数据不一致,这一点必须在演练前想清楚。
把这三类手段的时间量级和适用场景整理清楚,你会发现一个规律:恢复能力越强的手段,耗时越长;耗时越短的手段,覆盖面越窄。演练设计时要做的是给每类故障匹配对应的回滚手段,并且把"从发现问题到恢复完成"的总时间写进预案,作为演练的验收标准之一。
这一条是最容易翻车的。很多人默认"回滚 = 恢复原状",实际上回滚本身是一个变更操作,而任何变更都有可能引入新问题。
常见的情况包括:回滚用的镜像里带的是旧版本的配置文件,和当前的数据结构不兼容;回滚过程中服务重启,导致正在处理的请求全部失败;回滚后节点重新加入集群,携带了过期的心跳和缓存,把脏数据带进了系统;多个节点同时回滚,造成集群脑裂。
所以在演练设计阶段,"回滚方案"要写成两份:一份是正常回滚路径,一份是"回滚失败了怎么办"的兜底路径。如果第二份写不出来,说明你对系统的理解还不够,暂时不要在生产上动手。
爆炸半径这个概念不复杂,说的就是"故障最多能影响多大范围"。技术上限制它的手段,按粒度从细到粗大致有这几层。
按单节点限制,就是只在一台实例上注入故障。这是最细的粒度,适合验证"单机故障时,流量摘除和自动迁移是否真的生效"。按单可用区限制,是在一个机房或者一个可用区范围内制造影响,适合验证跨可用区的容灾切换。按单接口限制,是只让某一个 API 出错或者变慢,适合验证调用方的降级逻辑。按比例放量,则是控制受影响的请求比例,比如只让 1% 的请求走异常路径,逐步升到 5%、10%。
这几种手段可以叠加使用。我的建议是,任何一次生产演练都至少要有两层限制——比如"只在 A 可用区的 3 台机器上、只影响 5% 的流量"。单一维度的限制不够安全,因为你对系统的认知本来就可能不准,多一层限制就多一层保险。
还有一点常被忽略:演练必须有一个"总开关"。无论用什么工具注入故障,都要有一个独立的、不依赖被演练系统的停止机制。为什么强调"不依赖被演练系统"?因为如果停止演练的开关本身跑在被演练的服务上,而这个服务恰好被你打挂了,你就彻底停不下来了。这个开关建议做成独立进程、独立机器,甚至就是一个人工可执行的命令。
技术准备做得再好,没有授权就是无根之木。这里说的授权不是一句口头上的"你们搞吧",而是明确的三件事。
明确谁拍板。演练的开始、扩大范围、中止,这三个动作都要有明确的责任人,通常是技术负责人或者值班的 SRE 负责人。责任人必须当场在线,不能是"有问题我打电话找他"。
明确通知到谁。这一点比技术团队想得重要得多。客服团队如果不知道正在做演练,用户一投诉就会按真实故障的流程升级;业务方如果不知道,可能会在演练期间安排重要的营销活动;运维值守如果不知道,可能会把演练产生的告警当成真故障去处理,反而制造混乱。演练通知应该覆盖技术、客服、业务三条线,并且写清楚时间窗口和影响范围。
明确出了事怎么定责。这句话听起来不太技术,但它直接决定了团队下一次还敢不敢做演练。如果一次有授权、有边界、有预案的演练最终还是引发了业务影响,而这个影响被当成"某某人搞出的事故"来处理,那这个团队的演练文化基本就死了。合理的做法是:演练设计阶段的疏漏要复盘、要改进;但执行阶段按预案操作导致的后果,属于组织为获取认知付出的成本,不追究执行人。这条规矩必须先立好,再开始演练。
演练不是一次到位的事情,它有明确的阶梯。每一级要验证什么、通过标准是什么,都应该写下来。
台阶一:独立环境。这是最安全的一级,完全不接触生产。要验证的是"工具链能不能用""注入动作能不能被正确执行和停止""监控能不能捕捉到现象"。通过标准是:注入的故障按预期生效,退出机制正常,监控上能看到对应的指标变化。这一级的价值在于排掉工具本身的问题——很多团队初次演练失败,不是因为系统不行,是因为注入工具配置错了。
台阶二:预发或灰度环境。这个环境通常有和生产接近的架构,但承载的是内部流量或者极小比例的真实流量。要验证的是"假设是否成立""回滚路径是否通畅"。通过标准是:实际观测结果和你的假设一致,或者虽然不一致但你能解释原因;回滚在预期时间内完成,没有引入新问题。这一级是发现假设错误的最佳位置。
台阶三:生产小流量。开始接触真实流量,但比例很低,通常是 1% 到 5%。要验证的是"在真实流量特征下,系统行为是否和预发环境一致"。通过标准是核心指标没有超出退出条件,且演练期间的业务转化没有明显异常。这一级最常暴露的问题是"预发环境太干净了"——预发的流量模式单一,生产的流量模式复杂得多,很多问题只在这里出现。
台阶四:生产大范围。在前三级都通过之后,才考虑逐步扩大范围。这一级要验证的是系统在接近真实故障规模下的表现,以及应急流程的完整有效性。通过标准除了技术指标,还应该包括"整个演练过程是否在预定的时间窗口内完成""值班同学是否能在规定时间内做出正确判断"。
四个台阶不是每次演练都要走完。日常的小范围演练,停在前三级就够了;只有架构大改、新业务上线这类节点,才需要走到第四级。
这条顺序要求,我想单独强调一下,因为它是最容易被忽视、后果也最严重的一条。
无状态服务指的是那些本身不保存数据、所有状态都放在外部存储里的服务,比如网关、鉴权、纯计算型的接口服务。这类服务的特点是"挂了就挂了,重启一台就行",演练风险相对可控。它们应该作为演练的起点。
有状态服务指的是数据库、消息队列、缓存、分布式存储这类自身持有数据的组件。它们一旦出问题,影响的不只是可用性,还有数据一致性——而数据一致性问题往往不可逆。你可以在几分钟内重启一个网关,但你没法"重启"一份被写坏的数据。
所以正确的顺序是:先用无状态服务把整套演练流程、监控告警、回滚机制、组织协同都跑顺,等这些环节都被验证过一遍,再去碰有状态组件。而且碰有状态组件时,粒度要更细——先在从库上做,先做只读节点的故障,先验证主从切换,再考虑主节点相关的演练。
反过来的顺序会怎样?最常见的结果是:团队在没有任何演练经验的情况下直接对数据库动手,中途发现监控不够、回滚预案没写、责任人不明确,慌乱中做出了错误的操作,把一个可控的故障放大成数据损坏。这类教训在行业里并不少见,而它们的根源几乎都是顺序问题,不是技术问题。
节点宕机是所有演练场景里门槛最低的一个——把一台机器关掉,或者让它的健康检查失败,就完成了。正因为门槛低,很多人以为它简单,结果在这里翻车的最多。
这个场景真正要验证的,不是"机器能不能关",而是流量摘除和自动迁移是不是真的生效。这里有个残酷的事实:很多团队以为自己配了健康检查,实际上检查间隔是 30 秒、连续失败 3 次才摘除,加起来 90 秒内流量还在往一台已经死掉的机器上送。这 90 秒里所有打到这台机器的请求都是失败的,用户看到的是报错。
所以这个场景的验收标准应该写得具体:从节点失效到流量完全摘除,用了多少秒;这段时间内的请求失败率是多少;剩余节点接管后,延迟上升了多少,有没有触发连锁反应。宿主机层面的自动迁移能力在这个场景里是关键保障——机器本身挂了,能不能被自动迁移到其他宿主机上重新拉起,决定了恢复时间是分钟级还是小时级。
这是我认为信息量最大的一个场景。注入网络延迟和丢包,表面上看只是让请求变慢,实际上它会把你所有的超时配置和重试策略都翻出来晾一遍。
典型的问题链条是这样的:服务 A 调用服务 B,超时设的是 3 秒;B 因为网络延迟变成了 2.5 秒返回;A 没超时,但 A 的上游 C 给 A 设的超时是 2 秒,于是 C 超时了;C 触发重试,又发了一次请求,B 的负载翻倍;负载上升让 B 更慢,更多请求超时,更多重试。这就是重试风暴,而它几乎总是在故障演练中被暴露,因为平时很难复现这种正反馈。
这个场景的验收标准应该包括:延迟上升后,各级超时配置是否形成合理的梯度(下游超时必须小于上游,否则上游永远等不到结果);重试是否配置了退避策略和次数上限;有没有熔断机制能在重试风暴形成前介入。
这个场景验证的是一个很朴素的问题:当一个非核心依赖挂掉的时候,主流程还能不能走通。
比如商品详情页依赖推荐服务,推荐服务挂了,页面是整页报错,还是降级成"推荐内容暂时不可用"但商品信息正常展示?这两种结果对业务的影响差别巨大。很多团队写了下游降级代码,但从来没有真的验证过它——因为降级逻辑的触发条件是"下游超时",而下游平时不超时,这段代码就永远处于未被执行的状态。
演练的价值在这里非常直接:主动让依赖超时,看降级代码是不是按预期生效。验收标准是:主流程成功率不低于某个阈值,降级后的用户体验可接受,并且日志里能明确记录降级发生。
磁盘写满是个特别容易被低估的故障。它的隐蔽性在于,磁盘从 80% 到 100% 的过程可能很快,而写满之后系统会以各种奇怪的方式失败——日志写不进去、临时文件创建失败、数据库拒绝写入、甚至进程直接崩溃。
这个场景要验证两件事:日志轮转策略是否有效,以及写入失败时的降级行为是否合理。日志轮转这块,很多服务默认的轮转配置是按大小切分但保留份数过多,一个高频日志的服务很容易在几天内把盘写满。写入降级这块,要确认的是核心业务写入(比如订单)和非核心写入(比如行为日志)是否被区别对待——如果日志写不进去导致订单也失败,那这个设计就有问题。
IO 抖动则是另一个维度:磁盘的吞吐和 IOPS 突然下降,验证的是系统对慢 IO 的容忍度。这类故障对数据库的影响尤其明显,所以通常放在有状态组件演练的阶段做。
这一类故障平时几乎没人演练,但它的杀伤力不低。服务之间的调用依赖服务发现,服务发现依赖 DNS 或者注册中心。这两个东西一旦抖动,表现出来的现象是"服务明明活着,但互相找不到"。
具体的问题包括:DNS 解析超时导致新建连接失败;DNS 缓存过期时间设置不当,导致故障节点被持续解析到;注册中心短暂不可用,服务实例被误判为下线而批量摘除。后一种尤其危险,因为它是"自己把自己摘没了"——注册中心抖一下,所有实例同时认为自己需要重新注册,流量瞬间无处可去。
这个场景的验收标准是:DNS 解析失败的容忍机制是否生效(有没有本地缓存、有没有备用解析);注册中心抖动时,服务实例是否会被误摘除;恢复后重新注册的过程是否平滑,会不会引发注册风暴。
聊完技术,必须聊钱。演练环境是有成本的,而且这个成本经常被低估——很多团队立项时只算了"租几台机器",没算运维投入和风险成本。
行业里比较通行的三种做法,资源开销差别很大。影子集群是复制一套和生产等价的完整环境,资源开销接近翻倍,但它的验证能力最强,能完整跑通跨服务链路。独立小集群是搭一套缩小版的架构,只保留核心链路,资源开销通常在生产的 20% 到 40%,性价比最高,但架构差异会让部分结论打折扣。生产灰度则完全不额外占用资源,但它把风险直接放在了真实业务上,对可观测性和回滚能力的要求最高。
选择哪种,取决于你要验证什么。验证"跨服务调用链在故障下的行为",影子集群或独立小集群更合适;验证"真实流量特征下的表现",只能上生产灰度。三者不是互斥的,成熟团队通常是组合使用——日常演练在独立小集群,重大变更前上影子集群,最终验证走生产灰度。
演练环境有个特点:它不是长期运行的。一次演练可能只需要几天,甚至几个小时。如果为了演练专门包年几台机器,成本利用率会很低。行业里比较常见的成本控制思路有这几条。
一是按需创建、用完释放。演练环境用按量计费或者短期包月的方式开,演练结束就释放掉。这样成本按实际使用时长计算,而不是按自然月。二是复用非高峰时段的资源。演练通常安排在业务低峰期,这个时间段的资源价格和空闲资源都更友好。三是缩小规模。独立小集群的核心理念就是"架构同构、规模缩水",用 1/5 的机器验证同样的问题,前提是架构拓扑要和生产一致。四是把演练环境和压测环境合并使用,避免同一类临时环境重复采购。
这几条思路加起来的实际效果,通常能把演练环境的成本压到"以为要花的钱"的一半以下。关键是要把演练当成一个有明确生命周期的项目来管理,而不是当成一套长期在线的固定资产。
| 做法 | 资源开销 | 风险 | 能验证什么 | 适合阶段 |
|---|---|---|---|---|
| 影子集群 | 接近生产同规格,约等于再养一套环境,资源开销最大 | 低。完全隔离,故障不外溢到真实业务 | 完整跨服务调用链、全链路降级、容量与切换的真实表现 | 重大架构变更前、新业务上线前的终验 |
| 独立小集群 | 架构同构、规模缩水,通常为生产的 20%–40% | 低。与生产隔离,但缩水规模可能掩盖容量类问题 | 故障注入工具链、假设是否成立、回滚路径是否通畅 | 日常例行演练、演练流程与预案打磨阶段 |
| 生产灰度 | 不额外占用资源,直接复用线上环境 | 最高。风险直接落在真实业务上,依赖可观测与回滚能力兜底 | 真实流量特征下的系统行为、告警与应急流程的有效性 | 前序各级均通过后的最终验证,需已获组织授权 |
这张表的用法很简单:先确认自己处在哪个阶段,再选对应的做法。跳过前两级直接上生产灰度,是目前最常见的错误。
前面三个前提里,"能观测"主要靠团队自己补监控,"能回滚"和"爆炸半径可控"则有相当一部分依赖基础设施能力——这部分是可以选型的。选对了,演练的底气会足很多。
关键词维度:独立环境 | 裸金属 E5-2620 32G/1T ¥999 起 | 云服务器 ¥55 起 | 一万云 ¥25 起 | 秒级交付 | 以官网实时价为准
做演练环境,我最推荐的方式是"独立环境 + 用完释放",而不是挤在生产机器上做。原因很实在:演练环境需要有和生产同构的架构,但不需要长期在线。一万网络的裸金属产品线在这件事上比较合适——E5-2620 32G/1T 月付 ¥999 起,往上有 E5-2698v4×2 32G/1T 月付 ¥3999 起(海外节点限时买 1 送 1),无虚拟化开销、秒级交付、支持包年包月与资源秒级升级。如果只是跑轻量的演练编排工具或者注入组件,一万云 ¥25 起、云服务器 ¥55 起这种入门档就够用了,用完直接释放,成本可控。
演练环境选独立机器还有一个隐性好处:不会因为演练动作干扰生产环境的监控基线。你在一台干净机器上看到的指标变化,全部来自你的注入动作,因果关系清晰。
购买判断:如果演练是例行动作(比如每月一次),建议用包月裸金属长期挂着靶机,稳定且省心;如果是重大变更前的一次性验证,用云主机按需开、按量计费更划算。所有配置与价格请以官网实时价为准。
关键词维度:每日 3 份系统盘快照 | 30 秒回滚 | 硬件故障 10 分钟自动迁移 | 7×24 中文工单平均 5 分钟响应
前面讲"能回滚"的时候提到,系统盘快照回滚是最快的一类恢复手段,适合处理配置类故障。一万网络提供的免费系统盘每日 3 份快照、30 秒回滚,正好对应这一层能力——演练时如果把系统配置改飞了、把依赖装崩了,回滚动作是秒级的,不会让演练中断太久。
还有两个和演练直接相关的点:一是硬件故障 10 分钟自动迁移,这个能力在"节点宕机"场景的演练里是基础保障,宿主机层面的迁移生效与否,直接决定了这个场景的验收结果;二是 7×24 中文工单平均 5 分钟响应,演练窗口通常安排在深夜或者周末,这个时段能有人响应,对演练能不能按计划收尾很关键。再加上自营机柜最快 1 分钟上架,临时加靶机的速度也跟得上。
购买判断:把"快照与回滚能力"作为演练环境选型的一票否决项。回滚时间不可预期的环境,不适合承载任何生产演练。相关能力与政策以官网实时说明为准。
顺带提一下,如果演练涉及香港或海外节点(比如验证跨境链路的抖动表现),一万网络香港自营 E3 各型月付 ¥1500–1599,CN2 GIA 回国线路,可作演练靶机使用,价格同样以官网实时价为准。
为什么坑:很多团队是先跟老板汇报"我们下个月做混沌工程演练",日期定了、汇报做了,然后才开始想"演练什么"。这种顺序必然导致演练目标模糊,最终变成一场给上级看的表演,注入几个故障、截图几张监控,结论是"系统表现良好"。
怎么避:倒过来。先问清楚"我们最担心哪条链路挂掉",从这个问题出发推导出假设、边界、退出条件,再排期。一次演练验证一到两个假设就够了,贪多必然什么都验不透。
为什么坑:这是最要命的一条。如果停止注入的机制跑在被演练的服务上,服务一挂你就失去了控制权,故障会一直持续到你手动登机器为止。很多"演练变事故"的案例,根源都在这里。
怎么避:总开关必须独立——独立进程、独立机器、独立网络路径。最保底的做法是准备一条可以人工执行的回滚命令,写在演练预案里,并且演练前确认执行人知道怎么用。每次演练开始前,把总开关验证一遍。
为什么坑:如果系统日常的资源水位已经很高,摘掉一部分实例后剩余实例直接打满,演练结果会是"系统不可用"。这个结论本身没错,但它属于容量问题,不该用生产演练来发现。而且在这种情况下,你失去的是容错能力的验证机会。
怎么避:演练前先看水位。关键资源(CPU、连接池、线程池)的日常使用率如果超过 60%,先扩容或者先缩小演练范围。把容量验证和容错验证分开做,混在一起做两件事都做不好。
为什么坑:演练期间用户投诉量可能上升(哪怕只是轻微上升),客服如果不知道正在演练,会按真实故障升级,把技术团队从演练现场拽走去处理"故障";业务方如果不知道,可能在演练窗口安排了投放或者活动,影响会被放大。
怎么避:演练通知走三条线:技术、客服、业务。通知内容写清时间窗口、影响范围、如果出现什么现象是预期的、联系方式是谁。演练结束后再发一次结束通知,这个动作别省。
为什么坑:演练的价值有两半,一半是技术认知(系统在故障下的真实表现),另一半是流程认知(团队在故障下的判断和协作效率)。只复盘技术指标,等于把一半的价值扔掉了。而且流程问题往往比技术问题更致命。
怎么避:复盘时把时间线拉出来,标注几个关键节点:故障注入到发现用了多久、发现到判断原因用了多久、判断到决定回滚用了多久、回滚完成用了多久。这几个数字如果难看,说明监控和预案还有大问题,跟系统本身健壮不健壮没关系。
Q1:生产环境到底能不能做故障演练?
A1:能做,但有门槛。门槛就是本文说的三个前提:能观测、能回滚且回滚时间可预期、爆炸半径可控且组织已授权。三个都具备,生产演练不仅可行,而且是唯一能验证真实流量特征下系统行为的手段;缺任何一个,都不建议动手。需要说明的是,"能做"不等于"应该一上来就在生产做",正确路径是先在独立环境和预发环境把流程跑顺,再按比例进入生产。跳过前置阶段直接上生产,本质上是把演练的认知收益,用业务可用性去换,这笔账通常不划算。
Q2:混沌工程具体怎么做,有没有可照抄的步骤?
A2:有,但照抄的是流程不是参数。通行的流程是六步:定义稳态假设(写清正常状态下的可量化指标)、确定爆炸半径(限定节点、可用区、接口或流量比例)、准备退出条件与总开关、按阶梯推进(独立环境→预发→生产小流量→生产大范围)、执行并观测、复盘并固化。其中第三步最容易被省略,也最容易出事。参数部分没法照抄,因为每个系统的基线、依赖拓扑、余量都不一样,必须自己测出来。再提醒一句,流程再标准,如果监控基线没建立,执行出来的结论依然是噪声。
Q3:故障演练需要单独准备服务器吗?
A3:建议单独准备,而且这通常是最省钱的方案。用独立靶机做演练有三个好处:一是不干扰生产环境的监控基线,因果关系清晰;二是演练动作可以更放开,不用担心误伤真实业务;三是演练环境用完就能释放,成本按实际时长算。规模上不必和生产等价,独立小集群做到架构同构、规模缩水即可,通常占生产的 20% 到 40%。一万网络的裸金属 E5-2620 32G/1T 月付 ¥999 起、云服务器 ¥55 起、一万云 ¥25 起,都可作为演练靶机的选择,具体以官网实时价为准。若演练涉及跨境链路,香港自营 E3 各型 ¥1500–1599 也可考虑。
Q4:我们没有专职 SRE,小团队有必要做故障演练吗?
A4:有必要,但要降低预期和范围。小团队的资源有限,不适合追求全链路、大规模的生产演练,但至少应该做两件事:一是在独立环境验证一次"节点挂掉后流量能不能正确摘除",这是最基础也是最高频的故障类型;二是验证一次"核心依赖超时后降级逻辑能不能生效"。这两个场景覆盖了大多数真实故障,验证成本不高。形式上也不必复杂,一次演练、一份记录、一次复盘就够。关键是把"我们扛过一次事故"这种被动经验,转成主动验证过的认知,两者的可靠性差别很大。
Q5:演练会不会影响业务,怎么向老板解释这件事?
A5:会有影响,但影响是可控的、被授权的,这就是演练和事故的区别。向管理层解释时,重点说清三件事:这次演练限定的影响范围是多少(比如只影响 5% 流量、单可用区)、退出条件是什么(指标超阈值立即停止)、预期收益是什么(验证某条链路的容错能力,避免未来真故障时的长时间不可用)。建议把这三条写成一份简短的演练方案,让决策者签字确认。这样做的另一个好处是,一旦演练过程中出现预期外的业务影响,责任边界是清晰的——这也是保护执行团队的方式。
Q6:为什么强调先做无状态服务、再碰数据库?
A6:因为故障的可逆性不同。无状态服务出问题,重启、重建、扩容都能恢复,最坏情况也就是这段时间不可用;有状态组件出问题,可能留下数据不一致,而数据损坏往往不可逆——你没法通过重启把一份写坏的数据变回来。先做无状态服务,目的是在没有经验的情况下,用可逆的故障把整套演练流程、监控告警、回滚机制、组织协同全部跑顺。等这些环节都被验证过,再去碰有状态组件,并且粒度要更细:先从库、先只读节点、先验证主从切换,再考虑主节点。这个顺序反了,代价通常不是钱能解决的。
Q7:演练做完了,怎么判断是成功还是失败?
A7:判断标准不是"系统有没有挂",而是"你原本的假设是不是被证实或证伪了"。如果演练过程中系统按预期扛住了,你的假设被证实,同时你也拿到了量化的数据(比如延迟上升了 15%、切换用了 42 秒),这次演练是成功的。如果系统没扛住,你的假设被证伪,但你知道了具体的薄弱点在哪里,这次演练同样有价值——甚至价值更大,因为它把一个未来可能在生产爆发的问题提前暴露了。真正失败的演练只有一种:做完了什么都没搞清楚,既没有可复用的数据,也没有可改进的结论。
Q8:演练频率应该多高?每次都要走完四个台阶吗?
A8:频率取决于变更频率,不是固定值。架构稳定、变更少的系统,季度一次例行演练通常够用;迭代频繁、每周都在发版的系统,演练应该跟着发布节奏走,重大发布前做一次针对性的场景验证。台阶也不必每次都走完——日常例行演练走到独立环境或预发就够了,只有架构大改、新业务上线、跨境链路调整这类节点,才需要推到生产灰度甚至更大范围。把演练做成高频的、低成本的日常动作,比做成一年一次的大型项目更有价值,因为前者能持续发现问题,后者通常只能证明一次结论。
回到标题那个问题——故障演练该不该在生产做。我的立场很明确:这不是一个勇气问题,是一个资格问题。能观测、能回滚且回滚时间可预期、爆炸半径可控且组织已授权,这三条同时成立,生产演练就该做,而且应该做成常态化的日常动作;任何一条不成立,都不该做,硬做就是拿业务赌运气。
需要特别提醒的是,"我们上次宕机扛过去了"不能替代演练。事故没有假设、没有边界、没有退出条件,它只能证明你运气还行,证明不了系统容错能力足够。真正的演练是主动的、可控的、有明确验收标准的,它产出的不是"我们没事"这种安慰,而是一组可以写进预案的数字——切换用了多少秒、延迟上升了多少、重试风暴在哪个环节被拦住。
还有一件事值得单独强调:顺序比强度重要。从独立环境到预发,从生产小流量到生产大范围,先无状态服务后有状态组件。每一步都有明确的验证目标和通过标准,不达标就不往下走。很多团队不是败在技术能力上,是败在跳级上。
基础设施这一层,值得花点心思选型。可预期的回滚时间、能生效的自动迁移、演练窗口内能响应的技术支持,这三样直接决定了你的演练能不能按计划收尾。一万网络在这几项上的公开能力——免费系统盘每日 3 份快照与 30 秒回滚、硬件故障 10 分钟自动迁移、7×24 中文工单平均 5 分钟响应、自营机柜最快 1 分钟上架——对做演练的团队是有实际意义的,配合裸金属 E5-2620 32G/1T 月付 ¥999 起、云服务器 ¥55 起、一万云 ¥25 起这类可短周期使用的产品形态,把演练靶机和生产环境分开,成本也不高。深耕 IDC 19 年(成立于 2007 年),深圳南山总部,增值电信业务经营许可证、国家高新技术企业、专精特新资质,BGP 多线 + CN2 GIA 回国,T3+ IDC 机房建设标准,这些是选型时可以核验的部分。
再补一句实话:混沌工程这个词被讲得太玄了。剥掉所有包装,它就是在你能兜住的时候,主动去撞一下自己的系统,看看哪里会碎。撞之前先确认三件事——你看得见、你退得回、你圈得住。这三件事确认完,剩下的事情就没那么复杂了。
数据来源:本文所涉配置与价格参考自一万网络官网公开页面(首页产品与起步价、人工定制 GPU、AI 算力云、裸金属服务器、香港自营服务器、服务优势与资质说明等),具体以签约时最新报价与合同为准。相关产品与实时价格可查阅 https://www.idc10000.net/ 官网页面。
Copyright © 2013-2020 idc10000.net. All Rights Reserved. 一万网络 科技有限公司 版权所有 深圳市科技有限公司 粤ICP备07026347号
本网站的域名注册业务代理北京新网数码信息技术有限公司的产品