最近有個(gè)項(xiàng)目需要遷移舊系統(tǒng)的數(shù)據(jù),原來以為確定好數(shù)據(jù)口徑,寫個(gè)程序跑一遍就完事了。程序邏輯也比較簡(jiǎn)單,讀舊庫(kù)遍歷需要的數(shù)據(jù),寫入新庫(kù),加上并發(fā)執(zhí)行的邏輯。然而現(xiàn)實(shí)卻是問題多多,頻頻返工修改程序。最終還被扣了分哎。反思了整個(gè)過程,總結(jié)了以下幾點(diǎn),避免以后犯同樣的問題。
1. 捋清數(shù)據(jù)遷移的口徑
此次項(xiàng)目我初次接手,業(yè)務(wù)邏輯不熟悉,由另外一個(gè)同事提供遷移數(shù)據(jù)的口徑,原始問題也源于此:同事告知的數(shù)據(jù)的口徑有誤,遷移完后才發(fā)現(xiàn)缺少一部分?jǐn)?shù)據(jù)。雖然很無奈但也沒辦法,接著修改下程序又再跑一遍。這都算了,最離譜是上線后,又被告知遷移的數(shù)據(jù)仍有缺漏,上司又告訴我以另一個(gè)口徑全量跑一遍,真是崩潰。
事后我琢磨著從自身角度如何能盡量避免這個(gè)事發(fā)生,可能能夠去做的就是在確定數(shù)據(jù)口徑時(shí),應(yīng)該首先跟熟悉業(yè)務(wù)的同事確定好,隨后在小組群里@上司同步一下結(jié)論,進(jìn)行二次確認(rèn)。這樣的話無論結(jié)果如何,此環(huán)節(jié)也已盡到了工具人的責(zé)任了。(┓( ′?` )┏ )
2. 注意讀取舊數(shù)據(jù)的性能
發(fā)現(xiàn)第一步的問題后,立即修改讀取數(shù)據(jù)的SQL語句,改著改著語句條件出現(xiàn)了慢查詢的問題,導(dǎo)致跑起來的時(shí)候影響到數(shù)據(jù)庫(kù)性能。
這個(gè)問題屬于低級(jí)錯(cuò)誤,修改程序時(shí)應(yīng)該時(shí)刻注意著讀取語句的性能問題。出現(xiàn)問題,不但影響原業(yè)務(wù),也會(huì)導(dǎo)致遷移程序的效率低下。
3. 腳本執(zhí)行可斷點(diǎn)續(xù)跑
執(zhí)行程序過程中,由于各種原因(比如:并發(fā)太高,數(shù)據(jù)庫(kù)壓力過大),導(dǎo)致程序被迫停止。但程序被迫停止以后,重新執(zhí)行又要從頭開始執(zhí)行。
回想處理線上問題時(shí),情緒比較緊張,總是很急于快點(diǎn)改好程序,就開始執(zhí)行,也由于最初設(shè)計(jì)腳本時(shí),遷移數(shù)據(jù)口徑清晰,并沒有考慮要反復(fù)去跑的可能,所以設(shè)計(jì)上沒有加入可以斷點(diǎn)續(xù)跑。如果程序需要執(zhí)行數(shù)小時(shí),這一點(diǎn)很關(guān)鍵,多花一些時(shí)間去支持它,你就會(huì)在意外中斷發(fā)生時(shí),保持從容。
4. 腳本執(zhí)行的冪等性
由于遷移設(shè)計(jì)沒有考慮斷點(diǎn)續(xù)跑,程序被迫中斷以后,不得不重頭開始跑,所以程序上要支持重復(fù)執(zhí)行的冪等性。基本做法就是寫入之前判斷是否已經(jīng)寫入過啦,這一點(diǎn)非常重要,萬一重復(fù)寫入了,很有可能引發(fā)其他的數(shù)據(jù)問題。
5. 腳本執(zhí)行進(jìn)度可監(jiān)測(cè)
從發(fā)現(xiàn)問題到遷移程序執(zhí)行完畢,整個(gè)過程都要時(shí)不時(shí)回復(fù)業(yè)務(wù)方或者上司的靈魂拷問:「跑完了嗎?跑了多少?進(jìn)度如何?」。由于這次實(shí)現(xiàn)的程序只記錄了插入信息的日志,而且數(shù)據(jù)源是分表分庫(kù)多實(shí)例的架構(gòu),無法通過SQL語句來查詢對(duì)比分析出遷移進(jìn)度,每次的問都沒法準(zhǔn)確回復(fù),讓我越發(fā)焦躁。
因此在程序真正開始跑之前,需要考慮記錄哪些關(guān)鍵信息,其實(shí)統(tǒng)計(jì)進(jìn)度的維度不一定要細(xì)到記錄的粒度,也可按照表的粒度來統(tǒng)計(jì),粗略估算出整體進(jìn)度即可。
當(dāng)然,數(shù)據(jù)量如果不大,自己預(yù)計(jì)能在幾十分鐘能執(zhí)行完的可不用考慮這一點(diǎn)。但如果預(yù)計(jì)要跑數(shù)小時(shí)的話,建議要考慮整體進(jìn)度的監(jiān)測(cè),這樣不用每次被問到都只能支支吾吾地回復(fù):還在跑,沒那么快。
6. 選擇合適的腳本語言
這一次用了Python實(shí)現(xiàn)遷移程序,整體數(shù)據(jù)量預(yù)估有接近10億,在跑數(shù)據(jù)時(shí)也懷疑過是不是用go寫這個(gè)程序可以跑的快一點(diǎn)。但仔細(xì)分析瓶頸其實(shí)在于數(shù)據(jù)庫(kù),不能把并發(fā)提到太高,所以選擇合適的語言時(shí),語言性能不是最重要的,更重要是:個(gè)人熟悉程度、友好的并發(fā)支持。
7. 總結(jié)
上面描述過程的問題,可能有些情緒,畢竟背鍋了,但自覺不是全部是個(gè)人的問題。也不想回頭調(diào)整文字了,就這樣吧。自己整體做的也不是很好,核心問題是對(duì)遷移數(shù)據(jù)的事情經(jīng)驗(yàn)不足,遇事不夠冷靜。不怪別人,下次爭(zhēng)取做的更好吧。