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