最近有個項(xiàng)目需要遷移舊系統(tǒng)的數(shù)據(jù)受神,原來以為確定好數(shù)據(jù)口徑剖膳,寫個程序跑一遍就完事了魏颓。程序邏輯也比較簡單,讀舊庫遍歷需要的數(shù)據(jù)吱晒,寫入新庫甸饱,加上并發(fā)執(zhí)行的邏輯。然而現(xiàn)實(shí)卻是問題多多仑濒,頻頻返工修改程序叹话。最終還被扣了分哎。反思了整個過程墩瞳,總結(jié)了以下幾點(diǎn)驼壶,避免以后犯同樣的問題。
1. 捋清數(shù)據(jù)遷移的口徑
此次項(xiàng)目我初次接手矗烛,業(yè)務(wù)邏輯不熟悉辅柴,由另外一個同事提供遷移數(shù)據(jù)的口徑,原始問題也源于此:同事告知的數(shù)據(jù)的口徑有誤瞭吃,遷移完后才發(fā)現(xiàn)缺少一部分?jǐn)?shù)據(jù)碌嘀。雖然很無奈但也沒辦法,接著修改下程序又再跑一遍歪架。這都算了股冗,最離譜是上線后,又被告知遷移的數(shù)據(jù)仍有缺漏和蚪,上司又告訴我以另一個口徑全量跑一遍止状,真是崩潰。
事后我琢磨著從自身角度如何能盡量避免這個事發(fā)生攒霹,可能能夠去做的就是在確定數(shù)據(jù)口徑時怯疤,應(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ù)據(jù)庫性能高蜂。
這個問題屬于低級錯誤聪黎,修改程序時應(yīng)該時刻注意著讀取語句的性能問題。出現(xiàn)問題备恤,不但影響原業(yè)務(wù)稿饰,也會導(dǎo)致遷移程序的效率低下。
3. 腳本執(zhí)行可斷點(diǎn)續(xù)跑
執(zhí)行程序過程中烘跺,由于各種原因(比如:并發(fā)太高湘纵,數(shù)據(jù)庫壓力過大)脂崔,導(dǎo)致程序被迫停止滤淳。但程序被迫停止以后,重新執(zhí)行又要從頭開始執(zhí)行砌左。
回想處理線上問題時脖咐,情緒比較緊張,總是很急于快點(diǎn)改好程序汇歹,就開始執(zhí)行屁擅,也由于最初設(shè)計(jì)腳本時,遷移數(shù)據(jù)口徑清晰产弹,并沒有考慮要反復(fù)去跑的可能派歌,所以設(shè)計(jì)上沒有加入可以斷點(diǎn)續(xù)跑。如果程序需要執(zhí)行數(shù)小時痰哨,這一點(diǎn)很關(guān)鍵胶果,多花一些時間去支持它,你就會在意外中斷發(fā)生時斤斧,保持從容早抠。
4. 腳本執(zhí)行的冪等性
由于遷移設(shè)計(jì)沒有考慮斷點(diǎn)續(xù)跑,程序被迫中斷以后撬讽,不得不重頭開始跑蕊连,所以程序上要支持重復(fù)執(zhí)行的冪等性∮沃纾基本做法就是寫入之前判斷是否已經(jīng)寫入過啦甘苍,這一點(diǎn)非常重要,萬一重復(fù)寫入了烘豌,很有可能引發(fā)其他的數(shù)據(jù)問題载庭。
5. 腳本執(zhí)行進(jìn)度可監(jiān)測
從發(fā)現(xiàn)問題到遷移程序執(zhí)行完畢,整個過程都要時不時回復(fù)業(yè)務(wù)方或者上司的靈魂拷問:「跑完了嗎?跑了多少昧捷?進(jìn)度如何闲昭?」。由于這次實(shí)現(xiàn)的程序只記錄了插入信息的日志靡挥,而且數(shù)據(jù)源是分表分庫多實(shí)例的架構(gòu)序矩,無法通過SQL語句來查詢對比分析出遷移進(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ù)小時的話贾富,建議要考慮整體進(jìn)度的監(jiān)測,這樣不用每次被問到都只能支支吾吾地回復(fù):還在跑牺六,沒那么快颤枪。
6. 選擇合適的腳本語言
這一次用了Python實(shí)現(xiàn)遷移程序,整體數(shù)據(jù)量預(yù)估有接近10億淑际,在跑數(shù)據(jù)時也懷疑過是不是用go寫這個程序可以跑的快一點(diǎn)畏纲。但仔細(xì)分析瓶頸其實(shí)在于數(shù)據(jù)庫,不能把并發(fā)提到太高春缕,所以選擇合適的語言時盗胀,語言性能不是最重要的,更重要是:個人熟悉程度淡溯、友好的并發(fā)支持读整。
7. 總結(jié)
上面描述過程的問題,可能有些情緒咱娶,畢竟背鍋了米间,但自覺不是全部是個人的問題。也不想回頭調(diào)整文字了膘侮,就這樣吧屈糊。自己整體做的也不是很好,核心問題是對遷移數(shù)據(jù)的事情經(jīng)驗(yàn)不足琼了,遇事不夠冷靜逻锐。不怪別人夫晌,下次爭取做的更好吧。