亲,欢迎光临多多书院!
错缺断章、加书:站内短信
后台有人,会尽快回复!
  • 主题模式:

  • 字体大小:

    -

    18

    +
  • 恢复默认

周二早上,林泠在工位上收到了运维组发来的一封邮件。标题是“数据迁移后首次月度校验报告”,正文不长,但附件里挂了一个将近二十兆的Excel文件。他把文件下载下来打开,屏幕上展开了一张密密麻麻的数据校验表,行数超过四万条,每一行代表一个数据表的校验结果——表名、源库记录数、目标库记录数、差异量、差异率、校验时间戳、是否通过。大部分行的“是否通过”列都标着绿色的“pASS”,但他的目光直接跳到了标红的那几行上。

三张表校验未通过。差异率都不高,最高的一张只有百分之零点零三,另外两张分别是百分之零点零一和百分之零点零二。他把这三张表的表名复制到数据库客户端里,逐张打开看结构。第一张是用户行为日志表,存储的是用户在App上的点击流数据,每天增量写入量大约两百万条。第二张是订单状态变更记录表,记录每一笔订单从创建到完成的所有状态流转节点。第三张是实时推荐缓存表,存储推荐算法生成的个性化内容推送记录。

这三张表有一个共同点:都是高频写入表,数据写入峰值集中在每天晚上的八点到十点。

他把校验脚本的运行日志调出来,在屏幕上拉开。日志一共两万多行,记录了三张表从数据抽取、转换、校验到生成报告的完整过程。他没有逐行看,而是先定位了校验失败的具体时间戳。第一条失败的记录出现在晚上八点十二分,最后一条是晚上九点四十七分。全部集中在他预判的写入峰值窗口内。

接下来他花了将近一个小时排查原因。在一条条核对时间戳的过程中,他注意到一个细节——在八点十二分到九点四十七分之间,三张表的源库写入量达到了每秒将近六千条,而目标库的同步通道带宽上限是每秒五千条。写入峰值期间有将近百分之二十的数据被暂时缓存在消息队列里,等待目标库消费。校验脚本是在目标库上直接运行的,它比对的是“目标库当前已写入的数据”和“源库当前已写入的数据”,而不是“目标库应该写入的全部数据”。在写入峰值期间,目标库的同步存在一个三到五分钟的滞后,缓存队列里的数据还没有来得及写入,就被校验脚本判定为“缺失”。

这不是数据丢了,是校验窗口跟写入峰值发生了重叠。校验脚本预设的等待时间不足以覆盖同步通道在峰值负载下的延迟。他在排查文档里写了一行结论:“高频写入表的月度校验需要错开写入峰值窗口。建议将校验任务的启动时间从晚上八点调整到晚上十一点之后,或者在现有校验逻辑中增加同步延迟容差参数,允许目标库在写入峰值期间存在不超过五分钟的数据滞后。”

他把排查结果整理成一封邮件回复给运维组。

发完邮件已经快十二点了。林泠靠在椅背上转了转脖子,颈椎发出咔咔几声脆响。窗外的阳光很好,初春正午的太阳照在办公楼的玻璃幕墙上,反射出一片晃眼的白光。他站起来去茶水间接了杯水,路过小赵工位的时候被叫住了。

“林哥,”小赵举着手机,屏幕上是公司内部论坛的一个帖子页面,“你是不是又做了一次不太寻常的事?”

林泠凑过去看了一眼。帖子的标题是“数据迁移后首次月度校验,三张高频表校验失败——原因竟然是写入峰值窗口”,发帖的是运维组的一个同事,帖子详细记录了今天校验失败的排查过程,最后还特别提到了一句:“数据组的林工给出的结论是——校验窗口撞上了写入峰值,属于窗口期重叠问题。以后所有高频表的校验任务全部调整到晚上十一点之后执行。”帖子下面已经跟了十几条回复,有说“学到了”的,有说“这个思路好清楚”的,还有一条说“林工排查问题的效率也太高了,不到一个小时就定位到根因”。

林泠把手机还给小赵,说了句“就是个窗口期判断的常规操作”,端着水杯回了自己工位。窗口期这个概念对他来说已经深入骨髓了——鱼有鱼的窗口期,数据有数据的窗口期,本质上都是同一个逻辑:在正确的时间做正确的事,别在高峰期抢资源。

下午他把整个排查过程的思路整理了一下。

周五晚上,林泠没有加班,也没有准备周末出钓的装备。明天是周末,但他不打算去钓鱼。可能是累了吧!

吃过晚饭他把阳台彻底清理了一遍。冬天攒下来的枯叶灰尘被扫成一堆,那些空花盆冬天摆在角落里接了三个月的灰,盆底积了一层薄薄的灰白色水垢。他把花盆搬到水龙头下面一个接一个冲洗,陶盆的吸水孔被泥垢堵住了,他用一根旧筷子捅了半天才捅开,水从孔里咕嘟咕嘟冒出来带着泥腥味。林妈从客厅探出头看了一眼,说太阳打西边出来了,今天不钓鱼也不加班。他说开春了,给花盆换土。林妈说去年那盆茉莉被你浇死了,今年换盆君子兰吧,她说你外公以前养君子兰养得好,年年春节开花。他想了想说好,就君子兰。

周六上午他去了趟花卉市场。春天的花卉市场比冬天热闹得多,大棚里挤满了推着购物车的人,空气里弥漫着湿润泥土、腐熟有机肥和各类花卉混合的复杂气味。他在一个专卖兰花和君子兰的摊位前停下来,蹲下去挑了一盆叶片厚实、叶脉纹路清晰、叶尖没有焦黄的君子兰。摊主是个戴草帽的老头,一边用报纸包花盆一边说这盆三年苗,根系发达,回去换个大两号的盆,底肥放足,五一前后能抽箭。林泠问他底肥用什么,老头说腐熟羊粪掺骨粉,别用化肥,君子兰吃素不吃荤。林泠说好,付了钱抱着君子兰往外走。

穿过一排卖种苗的摊位时他停下了脚步。路过一个专卖各类蔬菜种苗的摊子,塑料育苗盘里密密麻麻地插着挂着水珠的嫩绿小苗,每排前面插着褪了色的黄色塑料标签。林妈昨天提到的辣椒苗就摆在他面前——茎秆粗壮,子叶肥厚,真叶已经长出了三四片,叶面油绿发亮,每一片都精神抖擞地支棱着,看着就觉得这东西恨不得明天就开始挂果。他蹲下去问摊主辣椒苗怎么卖,摊主说一块钱一棵,薄皮椒,坐果率高,阳台盆栽也能挂果。他挑了四棵根系发达、茎秆挺直的,摊主用湿报纸把根团裹好装进塑料袋。走到花卉市场门口的时候他又看到一个卖营养土的摊位,顺手买了一袋二十五升的腐殖土和一袋珍珠岩,扛在肩膀上走出了大棚。

回到家他把阳台上的空花盆全部搬到客厅,地上铺了几张旧报纸。营养土倒进大盆里,掺了三份腐殖土一份珍珠岩,又按花市摊主说的比例加了腐熟羊粪和骨粉,拿小铲子搅拌均匀。拌好的土蓬松柔软,颜色是深褐近黑的腐殖色,手指插进去能感觉到一种温润潮湿的疏松感。他把君子兰从旧盆里脱出来,抖掉根团上干结发硬的旧土,露出白胖粗壮根须的时候他仔细看了一下——根系确实发达,主根粗壮,须根密密麻麻地缠绕在一起,没有黑腐没有干瘪。换了新盆,填上新土,轻轻压实,浇了定根水。水从盆底的排水孔慢慢渗出来,滴在旧报纸上洇开一片深灰色的湿痕。四棵辣椒苗也换了单独的花盆,放在阳台靠栏杆的位置,那个角落从上午十点到下午四点都能晒到太阳。

周日他睡到自然醒,上午在家洗了堆积一周的脏衣服,中午林妈做了红烧排骨,下午他坐在书桌前打开电脑,开始整理春季窗口期追踪表。立春的数据上周已经填进去了——七十五分钟。按照春季回升斜率推算,雨水窗口期预计在八十五分钟左右,惊蛰九十到九十五分钟。他翻出去年白露的数据做了个对比——去年白露是六十分钟,立春的七十五分钟比白露多了十五分钟。两个数据属于不同的年份,不能直接做时序对比,但如果春季回升斜率跟秋季下行斜率基本对称,那么今年的雨水应该跟去年的处暑差不多,惊蛰跟去年的寒露接近。这个预测的误差范围他给自己设了个标尺——不超过百分之十。

傍晚林爸在客厅看电视,画面里在播天气预报——下周雨水,预计又有一股弱冷空气过境,但降温幅度不大,最低气温维持在八九度左右,不会像冬天那样断崖式下跌。林泠听了一耳朵,心想这场弱冷空气对窗口期的影响应该在误差范围内——水温回升的大趋势不会被打断,最多是雨水那天的实测数据比预测值低个三五分钟。

阳台上的君子兰换了新盆之后看着精神了不少,叶片在夜风里轻轻晃了晃,叶面上的水珠反射着客厅里透出来的灯光,亮晶晶的。那四棵辣椒苗在栏杆边的小花盆里安静地站着,泥土还是湿的,茎秆挺直,真叶边缘挂着几滴还没蒸发完的水珠。他蹲下去用手指轻轻戳了戳其中一片叶子,叶子弹了一下又稳稳地停住。然后站起来拍拍手上的土,转身回了屋。