全量压测定在周四晚八点。这是政务云的老规矩:汛期一过,趁着业务低峰,把三倍于日常的流量灌进内核集群,看看极限之下还剩多少余量。窗口全长三个半小时,从晚八点到十一点半;压测方案、灌流脚本、判停条件,提前一周就走了变更流程,编号、审批人、回退方案,一样不缺。
压测不在机房里偷偷做。通知上的说法是「公开透明,接受监督「:指挥大厅的监控大屏前公开做,甲方分管领导到场,各委办局的运维负责人到场,两家同行厂商的代表也请来观摩。落到每个人头上,这就是一场谁都别想糊弄的当面验货。
七点二十,林默提前到了。例行组的主操们在主控台做最后一遍预检。清单打印出来钉在操作台边,一条一条打钩;主操姓佟,口令念得又慢又清楚,每运行一步,都等对面机房的值守复诵一遍才落下一个字。空调和机房送风的低频混在一起,待久了后颈发僵。一整面墙的拼接大屏亮着待机画面,日光灯白得发青,把每张脸都照得少了两分血色。
林默照例缩在角落。桌面上摆着三样东西:笔记本,笔,还有那只磕了边的保温杯——去年搬家磕的,没换,顺手。杯里的茶是下午泡的,早凉透了。
座位格局早就排定了。甲方分管领导坐正中,转椅,杯子搁在扶手上;委办局的运维头儿们沿长桌排开,社保口那位进门前还在走廊里打电话,安排明早窗口的排班;靠门一排是两家厂商的代表,西装袖口露出一截表带,抱着胳膊,神情松弛——来看成色的松弛。
陈志远坐在林默斜前方,跟相邻的科长低声交换名片,名片夹开合的动作比平时快了半拍。二期在即,今晚这种场合,他一半是来陪同,一半是来记人。
小赵今晚在机房值守,出发前给林默发了条消息:「默哥,大屏要是绿到底,明早豆浆我请。「林默回了个「好「,把手机扣回桌面。年轻人盼着安稳,这是好事。
林默给自己划的线跟往常一样:能躲在陈志远影子后头就绝不往前站;能推给设备的绝不认到自己头上;公开场合能不开口就不开口。这套分寸他守了一年多,从「临时搭把手的「守到「救火专业户「,越守越熟。
耳后那阵熟悉的微热安安静静的。出门前他照例扫过一遍池子的底帐:四十一台边缘设备在线,薄设备的标志位正常,冷频段上没有新的动静。都稳。这份稳他没有对任何人提过——今晚他是来陪绑的,陪绑的人不该带着自己的帐本进场。
他比平时多看了一眼大屏右上角的时钟。二十点整,压测准时开闸。灌流从阶梯起步,一档一档往上加。大屏上的曲线跟着爬,绿的,稳的。头二十分钟波澜不惊:走廊里有人外卖到了,被工作人员拦在门外;两位厂商代表交换了几个眼神,其中一个在平板上记了两个数;领导端起杯子喝了口水,又搁回扶手上。
大厅里的期待各有各的版本。领导等的是「余量充足「四个字,好往上报;运维头儿们等的是早点散会;厂商代表等的东西说不出口——最好是平稳,平稳里最好再带一点小小的、不伤筋骨的磕绊,好让他们回去有东西可写。
林默没参与任何一种期待。他盯着的是灌流阶梯的第三档——按方案,那一档会把内核集群推到日常负载的两倍,是整个窗口里最陡的一段。曲线爬到那儿的时候要是还能平着走,今晚就真的只剩散会一件事了。
一切都在剧本之内。今晚这场压测的剧本本来就简单:平稳灌满三小时,曲线画得漂亮,各回各家。剧本在二十点二十六分翻页。
二十点二十五分,例行组运行压测前的最后一道工序:全量预推——把压测参数顺着配置信道推给全链路,让每个节点带着新参数进入受压状态。这道工序做过十几次,从没出过事。问题出在这批配置包里。
混进去的那串字段,不是一眼假的垃圾数据。它长得规规矩矩:格式合法,编码合法,校验和都对。唯独长度卡在边界上——旧版协议定义的字段上限,恰好比新版校验规则认定的安全上限宽出半个身位。校验逻辑按新规则放行,调度器按旧语义解析,两边都按各自的规矩办事,谁都没做错,错就错在这串字段两头不靠。
它顺着依赖链往下走。先带歪一个节点,再咬住相邻的三个;被咬的节点把畸形字段原样转发给下家,一传二,二传四。
症状比来源更麻烦。它没有把服务打死——它让调度器在「切还是不切「之间反复横跳。脏流量混在正常的配置同步里,分不出你我;调度器想把脏的那部分甩掉,每甩一次,正常的同步就断一角;断角触发补偿,补偿把脏数据又往前推一轮。震荡就这么滚起来了,越滚越快。
二十点三十一分,值班运维发现异常,手动触发降级。降级脚本刚一运行,就撞上另一堵墙:调度器此刻已进入震荡保护态,拒绝一切变更指令,报错停在半路。降,降不下去;回,回不回来。链路在两种姿势之间悬着,每一秒都在往坏里走。
大屏上的颜色从绿到黄用了四十秒,从黄到红,二十秒。对讲机里的声音乱了。
「降级失败——调度器自锁了!「
「备用链路!切备用!「
「切了!切不动——配置信道是同一条,脏数据还在里面滚!「
「手工摘节点!快摘!「
几个运维扑在键盘上,命令一行一行往里灌,报错一行一行往外吐。手工摘除的每一条路径,此刻都撞在同一道自锁上——保护机制本来是防误操作的,现在反过来把救援的手也锁在了门外。
又有两路命令灌进去,又两路报错退出来。有人喊了句「重启节点「,被带班的当场按住——重启等于把震荡从头再滚一遍,这个责没人敢担。
指挥大厅里几十号人。甲方领导站了起来;委办局的头儿们从椅子上探出身子;靠门那排厂商代表把抱着的胳膊放下来了。大屏上那片红不是慢慢晕开的,是一寸一寸啃过来,谁都看得出要淹,谁都伸手去堵,堵不住。耳后,天枢的震颤收紧。
【来源查到了半程。】它的声音快而低,【畸形字段混在预推批量里。中转节点上,签发标识一栏是空的——按规程,那里必须有一个签发人签名。空签名字段,规程上不该存在。】
林默的视线扫过大屏右上角的时间戳。这笔帐他算得很快:压测窗口还剩不到三个小时;按眼下震荡扩散的斜率,内核集群撑不过十点。而明早八点,政务大厅开门,全市的窗口等着这套系统。今晚要是当着这一屋子的人崩了,崩的就不只是集群。
【人工摘除的全部路径都撞在自锁上。】天枢把结论推过来,【除非先把震荡根因剥掉。否则,谁的脚本都进不去。】
没有人应声。这间大厅里,能接住这句话的人,此刻只剩一个。林默放下保温杯,杯底在桌面上轻轻一顿。站起来之前,他给自己三秒钟。胸口的皮夹里,那张便签还在——五行激活条件:只借闲余,不碰数据,天亮归位,全程记录,留后手。便签底下压着的另一个问题,是他两个星期前亲手写下的:这一网,值不值得被看见。
今晚这笔帐,清算得很快。不开:三个小时内内核集群当众崩掉,全城政务云在几十双眼睛面前停摆,这口锅没有任何一家乙方接得住——志远数科当场出局,二期归零,连大数据局力挺他们时那张脸,都要一并按进地里。
开:这张网从未在这种场合亮过相。今晚一亮,「志远数科那个林工手里有点东西「这句话,会写进在场每一个人的备忘录,再由他们各自带进更远的屋子。甲方、同行、更高处——每一条线都会比昨天粗一圈。
两头都疼。一头疼在帐上,一头疼在命上。他还扫了一眼这间屋子的退路:侧门两处,监控全覆盖,出门就是走廊;要是十分钟内接管失败,他备了一套说辞——预置编排运行超时,人工中止,责任在流程不在人。说辞是留给自己垫背的,他希望用不上。
天枢把他脑子里的后半截说完了:【开。这种场合的开,不叫暴露,叫担责。担责的人,比躲事的人难动。】
他站起身。起步那几步,离他最近的厂商代表先偏了下头——同行对「谁突然动了「最敏感。这半寸偏头被余光收进去,随即传开:陈志远直起了背,甲方领导的目光转了过来,长桌尽头几个运维从屏幕上擡起了脸。
