——第1集:慶功宴驚魂)
一、讓人扒層皮的紅頭文件老牛第一次見(jiàn)到那張紙是在去年初春的周一早上。它躺在馬總的辦公桌上A4大小紅頭黑字標(biāo)題印著關(guān)于推進(jìn)核心系統(tǒng)自主可控改造的通知。老牛當(dāng)時(shí)正端著一杯奶茶吸管咬得稀爛目光掃過(guò)文件右下角那個(gè)鮮紅的公章吸管啪地一聲斷了。核心賬務(wù)系統(tǒng)老牛把斷掉的吸管吐進(jìn)垃圾桶“要換國(guó)產(chǎn)數(shù)據(jù)庫(kù)”馬總點(diǎn)點(diǎn)頭臉色鐵青“上面定的。這套系統(tǒng)跑了十五年承載十億級(jí)賬戶(hù)日交易量過(guò)億筆一秒鐘都不能停?,F(xiàn)在要求必須實(shí)現(xiàn)自主可控核心技術(shù)握在自己手里?!崩吓2铧c(diǎn)被奶茶嗆到。他太清楚這套系統(tǒng)的分量了——不是普通的報(bào)表庫(kù)是核心賬務(wù)是銀行的心臟。十五年前上線從單節(jié)點(diǎn)到集群從本地到兩地三中心它像一臺(tái)跑了十五年的老服務(wù)器風(fēng)扇還能轉(zhuǎn)但每一個(gè)電容都牽著無(wú)數(shù)人的身家性命?!皶r(shí)間呢”明年一季度必須上線。馬總把文件往前推了推“選型你牽頭組織幾家國(guó)產(chǎn)數(shù)據(jù)庫(kù)做POC測(cè)試定了就切不能比原來(lái)差?!崩吓6⒅菑埣埜杏X(jué)它像一道死刑判決只不過(guò)被判刑的不是系統(tǒng)是他自己。走出馬總辦公室老牛在走廊里站了五分鐘。窗外是北京的深秋銀杏葉黃得像告警燈。他掏出手機(jī)在群里發(fā)了條消息“兄弟們接到個(gè)活兒核心賬務(wù)系統(tǒng)換國(guó)產(chǎn)數(shù)據(jù)庫(kù)。有誰(shuí)干過(guò)”群里靜了十分鐘。然后老朱回復(fù)“達(dá)夢(mèng)我試過(guò)兼容性是國(guó)產(chǎn)里數(shù)一數(shù)二的存儲(chǔ)過(guò)程語(yǔ)法差異不算大但核心賬務(wù)這種級(jí)別的遷移業(yè)務(wù)邏輯重寫(xiě)還是大頭你得做好扒層皮的準(zhǔn)備?!崩涎蚋艘痪洹拔疫@邊銀行核心也在評(píng)估達(dá)夢(mèng)高可用架構(gòu)挺穩(wěn)生態(tài)也成熟。但核心系統(tǒng)容不得半點(diǎn)閃失?!崩吓J掌鹗謾C(jī)深吸一口氣。他年近五十眼角的皺紋里藏著和生產(chǎn)系統(tǒng)打交道的漫長(zhǎng)歲月肚子上的贅肉里藏著三千個(gè)凌晨的告警。他以為這輩子就守著這套老系統(tǒng)到退休了沒(méi)想到臨了臨了還要打一場(chǎng)硬仗。扒層皮就扒層皮吧。他自言自語(yǔ)把空奶茶杯捏扁扔進(jìn)垃圾桶“誰(shuí)叫這是核心系統(tǒng)呢?!苯酉聛?lái)兩個(gè)月老牛帶著團(tuán)隊(duì)把入圍的幾家國(guó)產(chǎn)數(shù)據(jù)庫(kù)測(cè)了個(gè)遍。兼容性、高可用、生態(tài)成熟度一項(xiàng)一項(xiàng)過(guò)。最后達(dá)夢(mèng)勝出——存儲(chǔ)過(guò)程遷移率最高團(tuán)隊(duì)上手最快高可用架構(gòu)也最穩(wěn)。老牛在評(píng)審會(huì)上簽了字就它老牛接下了。但他不知道這張紅頭文件不僅改寫(xiě)了系統(tǒng)的命運(yùn)也改寫(xiě)了他的命運(yùn)。二、雙軌驗(yàn)證與回退通道此后老牛的生活變成了單線程模式。早上七點(diǎn)到公司凌晨一點(diǎn)后走周末泡在機(jī)房。他的辦公桌上漸漸堆起三座小山國(guó)產(chǎn)數(shù)據(jù)庫(kù)官方手冊(cè)、原系統(tǒng)的業(yè)務(wù)邏輯文檔還有空掉的能量飲料罐。真正的難題從第一天就擺在了桌面上。第一座大山數(shù)據(jù)一致性。 核心賬務(wù)系統(tǒng)存的是真金白銀。遷移過(guò)程中哪怕丟一分錢(qián)都是生產(chǎn)事故。老牛團(tuán)隊(duì)做了雙軌并行——原系統(tǒng)繼續(xù)跑新系統(tǒng)同步復(fù)制兩邊數(shù)據(jù)逐筆比對(duì)逐日對(duì)賬。整整一個(gè)月每天對(duì)賬報(bào)告上的差異項(xiàng)必須為零才能進(jìn)入下一階段。第二座大山性能差異。 兩種數(shù)據(jù)庫(kù)底層模式不同有的業(yè)務(wù)場(chǎng)景在原環(huán)境上跑得飛快到達(dá)夢(mèng)里反而慢了有的場(chǎng)景則相反。這不是誰(shuí)好誰(shuí)壞的問(wèn)題是特性差異。老牛帶著團(tuán)隊(duì)做了大量調(diào)優(yōu)重寫(xiě)部分業(yè)務(wù)邏輯調(diào)整數(shù)據(jù)分布策略把不穩(wěn)定的查詢(xún)逐一打磨。沒(méi)有魔法就是反復(fù)測(cè)、反復(fù)改。第三座大山回退方案。 這是最耗心血的部分。上線不是開(kāi)弓沒(méi)有回頭箭而是必須留好一條隨時(shí)能切回去的路。老牛設(shè)計(jì)了并行運(yùn)行方案前兩個(gè)月百分之十的流量切到達(dá)夢(mèng)百分之九十留在原系統(tǒng)第三個(gè)月逐步提升到百分之五十、百分之八十。每個(gè)階段都有明確的回退閾值——一旦達(dá)夢(mèng)響應(yīng)時(shí)間超標(biāo)、錯(cuò)誤率上升立刻切回原系統(tǒng)保證業(yè)務(wù)不中斷。準(zhǔn)備的再充分驚心動(dòng)魄的故事也時(shí)有發(fā)生。比如一周前的凌晨監(jiān)控大屏上數(shù)據(jù)庫(kù)主備同步延遲突然飆高從毫秒級(jí)跳到秒級(jí)。值班經(jīng)理電話(huà)炸了喊著要立刻執(zhí)行回退。老牛盯著曲線眼睛血紅——他知道這一退數(shù)月的心血就白扔了信創(chuàng)進(jìn)度也要延后。駐場(chǎng)工程師被他一個(gè)電話(huà)從睡夢(mèng)中薅起來(lái)眾人圍著屏幕查了許久最后定位是機(jī)房網(wǎng)絡(luò)鏈路抖動(dòng)不是數(shù)據(jù)庫(kù)本身的問(wèn)題。老牛拍板修網(wǎng)絡(luò)不回退。天亮前延遲壓回毫秒級(jí)數(shù)據(jù)零丟失。核心系統(tǒng)遷移不是搬家是換心臟。老牛在內(nèi)部復(fù)盤(pán)會(huì)上說(shuō)“換心臟的時(shí)候體外循環(huán)機(jī)不能停。但更重要的是——主刀醫(yī)生不能慌?!边@數(shù)月里團(tuán)隊(duì)做了七輪全量壓力測(cè)試三輪災(zāi)備切換演練二十四小時(shí)監(jiān)控大屏從未熄滅。老牛盯著那些曲線眼中帶血絲嘴角起泡藥不離口。他的血壓和系統(tǒng)日志一起飆升但他沒(méi)空看自己的指標(biāo)——他只關(guān)心新系統(tǒng)的指標(biāo)是否平穩(wěn)。師父小李遞過(guò)來(lái)一杯溫水“您平均每天睡四小時(shí)再這樣下去……”老牛擺擺手別咒我我身體好著呢。他站起身把椅子推進(jìn)桌底又從褲兜里摸出一片藥塞進(jìn)嘴里。第二天早上老牛是被生物鐘叫醒的。凌晨?jī)牲c(diǎn)睡、早上六點(diǎn)起近期身體已經(jīng)養(yǎng)成的肌肉記憶到點(diǎn)就執(zhí)行。他照鏡子發(fā)現(xiàn)頭發(fā)又白了幾根眼角的血絲從紅色變成了暗紫色像一臺(tái)跑了許久沒(méi)關(guān)機(jī)的服務(wù)器終于走到了宕機(jī)的邊緣。他下意識(shí)地按了按胸口有點(diǎn)悶像壓了一塊輕飄飄的棉花。今晚有慶功宴。他對(duì)著鏡子里的自己說(shuō)“參加完明天就休息真的休息?!比?、慶功宴上的碎杯聲當(dāng)晚老牛推開(kāi)酒店宴會(huì)廳的門(mén)。里面已經(jīng)坐了三桌人冷盤(pán)剛上馬總正在主桌旁跟人碰杯看到他進(jìn)來(lái)笑著招手“老牛這邊主角得坐主桌?!崩吓W哌^(guò)去坐下肚子上的肉把椅子擠得有點(diǎn)緊。他順手從褲兜里摸出個(gè)白色小藥片塞進(jìn)嘴里端起桌上的茶水灌了一口。旁邊同事眼尖“牛工吃的啥”胃藥老牛淡淡的說(shuō)道“老毛病了?!瘪R總站起身敲了敲酒杯全場(chǎng)安靜下來(lái)“各位今天咱們慶功宴的主角到了。三個(gè)月安全運(yùn)行自主可控改造圓滿(mǎn)完成。來(lái)讓老牛給大家說(shuō)兩句”掌聲中老牛起身。第三顆襯衫扣子已經(jīng)崩飛了在紅毯上滾了兩圈鉆進(jìn)了桌底。沒(méi)人去撿。所有人的目光都釘在他身上。一年前老牛的聲音啞得像砂紙擦過(guò)玻璃“這套核心賬務(wù)系統(tǒng)還在老環(huán)境上跑每逢月末結(jié)算就告警高峰期IO直接打滿(mǎn)。不是數(shù)據(jù)庫(kù)不行是十五年積累下來(lái)的業(yè)務(wù)邏輯太復(fù)雜老環(huán)境也被拖得氣喘吁吁。上面要求自主可控核心技術(shù)必須握在自己手里我們接了這個(gè)活兒?!迸_(tái)下馬總點(diǎn)點(diǎn)頭。后排幾個(gè)年輕的開(kāi)發(fā)抻著脖子像聽(tīng)評(píng)書(shū)。遷移的難度不在搬家在改造。老牛舉著酒杯“我們做了三個(gè)月的雙軌并行。原系統(tǒng)和達(dá)夢(mèng)同時(shí)跑數(shù)據(jù)逐筆比對(duì)每天對(duì)賬差異必須為零。七輪全量壓力測(cè)試三輪災(zāi)備切換演練主庫(kù)掛了備庫(kù)三十秒內(nèi)接管數(shù)據(jù)零丟失。三個(gè)月零故障零回退零數(shù)據(jù)差錯(cuò)。”他越說(shuō)越興奮臉漲得通紅額頭上的汗珠順著太陽(yáng)穴往下滑。“這次改造讓我最驚喜的一點(diǎn)是——達(dá)夢(mèng)跟原系統(tǒng)高度相似。 開(kāi)發(fā)團(tuán)隊(duì)幾乎不用改習(xí)慣語(yǔ)法、邏輯、調(diào)用方式上手極快。我們擔(dān)心的’學(xué)習(xí)成本’‘重寫(xiě)成本’幾乎沒(méi)有出現(xiàn)。團(tuán)隊(duì)開(kāi)發(fā)效率沒(méi)受影響這是最大的底氣?!彼D了頓酒杯往桌上一磕“性能方面經(jīng)過(guò)大半年調(diào)優(yōu)整體吞吐量提升百分之四十復(fù)雜查詢(xún)響應(yīng)時(shí)間降低百分之六十。有的場(chǎng)景在原環(huán)境快有的達(dá)夢(mèng)快我們針對(duì)差異做了專(zhuān)項(xiàng)優(yōu)化。說(shuō)到底這是整體架構(gòu)升級(jí)的結(jié)果——存儲(chǔ)過(guò)程重寫(xiě)、連接池調(diào)優(yōu)、網(wǎng)絡(luò)鏈路優(yōu)化全棧一起動(dòng)效果才能出來(lái)。”臺(tái)下掌聲響起。馬總站了起來(lái)端著酒杯走到臺(tái)前“老牛這段時(shí)間的辛苦證明了一件事自主可控這條路咱們走通了。來(lái)走一個(gè)”老牛接過(guò)酒杯一仰脖干了。嗆得他齜牙咧嘴。他下意識(shí)地按了按胸口那塊棉花好像變重了一點(diǎn)但他沒(méi)在意。我知道你們?cè)谙胧裁础嬗心敲瓷袷遣皇谴蹬@吓6酥站票抗鈷哌^(guò)全場(chǎng)。年輕開(kāi)發(fā)眼里閃著光像在看一個(gè)江湖傳說(shuō)?!拔医o你們看一組數(shù)據(jù)。遷移前系統(tǒng)峰值響應(yīng)時(shí)間經(jīng)常飆高穩(wěn)定性靠堆硬件硬撐。遷移后經(jīng)過(guò)業(yè)務(wù)邏輯優(yōu)化和架構(gòu)重構(gòu)曲線穩(wěn)得像一條直線。三個(gè)月來(lái)沒(méi)有一次計(jì)劃外停機(jī)沒(méi)有一次數(shù)據(jù)差錯(cuò)沒(méi)有一次回退操作。什么叫健壯性這就叫健壯性”“怎么做到的除了國(guó)產(chǎn)數(shù)據(jù)庫(kù)給力外更為關(guān)鍵是——你得懂你的業(yè)務(wù)你得根據(jù)業(yè)務(wù)場(chǎng)景做各種改造優(yōu)化。此外咱們還得肯做測(cè)試得留好回退的路。 核心系統(tǒng)遷移膽子要大心要細(xì)。有長(zhǎng)期的并行驗(yàn)證有多輪的壓力測(cè)試有隨時(shí)能切回去的回退通道咱們就有底氣?!迸_(tái)下靜了兩秒然后掌聲雷動(dòng)。年輕開(kāi)發(fā)眼里閃著光“牛工您這功力簡(jiǎn)直是數(shù)據(jù)庫(kù)界的神醫(yī)”什么神醫(yī)老牛擺擺手“我就是個(gè)DBA。數(shù)據(jù)庫(kù)慢了我能一眼看出是索引壞了還是SQL寫(xiě)蠢了。但你問(wèn)我血壓多少血脂多少——不知道沒(méi)查過(guò)沒(méi)空查我還有好多數(shù)據(jù)庫(kù)優(yōu)化策略還沒(méi)實(shí)施啊。”眾人笑了。有人喊“牛工您得給自己的個(gè)人健康指標(biāo)裝個(gè)監(jiān)控大盤(pán)啊”老牛扯了扯嘴角想笑但胸口那塊棉花好像又重了一點(diǎn)。他沒(méi)接話(huà)只是擺了擺手。馬總給大家滿(mǎn)上酒“老牛今天你是主角再走一個(gè)”老牛也不推辭第二杯酒下肚話(huà)更稠了?!霸蹅冏黾夹g(shù)的眼里得有數(shù)。吞吐量、延遲、連接數(shù)、緩存命中率這些指標(biāo)變了你就知道系統(tǒng)出問(wèn)題了。但很多人呢只看表面不挖根因。系統(tǒng)慢了他加機(jī)器連接滿(mǎn)了他擴(kuò)帶寬日志爆了他買(mǎi)磁盤(pán)。這叫什么這叫——”他突然停住了。右手按在胸口這次不是輕按是死死按住。左手去抓桌沿沒(méi)抓住。酒杯從指間滑落在地板上砸出一聲脆響碎成了一地。同時(shí)老牛的身體像一堵失去支撐的墻栽倒在地。全場(chǎng)死寂。三秒后有人喊“老牛”然后是椅子翻倒的聲音腳步聲尖叫聲馬總的聲音在喊打120有人去掐老牛的人中有人手忙腳亂地翻他的口袋找藥。老牛躺在地上眼睛半睜著視線里只剩下天花板上那盞白熾燈像監(jiān)控大屏上永不熄滅的光標(biāo)。他嘴唇動(dòng)了動(dòng)似乎想說(shuō)什么但只吐出一口帶著酒氣的白沫。那杯沒(méi)喝完的酒在白色桌布上漫開(kāi)像一條金色的、無(wú)聲的告警日志。未完待續(xù)…主庫(kù)——第2集根因分析系列回顧“大白話(huà)人工智能” 系列“數(shù)據(jù)庫(kù)拍案驚奇” 系列“世事洞明皆學(xué)問(wèn)” 系列