編寫遷移數(shù)據(jù)程序的幾點(diǎn)反思

最近有個(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)取做的更好吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 大數(shù)據(jù)集群遷移這件事,不知道有多少同學(xué)做過。我說的不是把一個(gè)集群的數(shù)據(jù)備份到另一個(gè)集群上。我指的是整個(gè)數(shù)據(jù)平臺(tái)與大...
    彩色螞蟻閱讀 2,118評(píng)論 0 5
  • feisky云計(jì)算、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 4,323評(píng)論 0 5
  • 在“數(shù)據(jù)庫(kù)優(yōu)化方案(二):寫入數(shù)據(jù)量增加時(shí),如何實(shí)現(xiàn)分庫(kù)分表?”中我曾經(jīng)提到,由于 MySQL 不像 MongoD...
    逗逼程序員閱讀 400評(píng)論 0 2
  • 今天學(xué)習(xí)課文《項(xiàng)鏈》,昨晚已經(jīng)布置預(yù)習(xí),要求把課文讀熟。 今天揭題完畢,帶領(lǐng)孩子們齊讀“項(xiàng)鏈”兩個(gè)字。然后問孩子們...
    江南丹橘閱讀 920評(píng)論 0 0
  • 綜合教程 1.我從本篇文章中學(xué)到的一個(gè)重要概念: 別看一個(gè)成功的作家是多么的輝煌,其實(shí)他們經(jīng)歷過你所沒有過的困難與...
    應(yīng)數(shù)二班王秀磊閱讀 278評(píng)論 2 0

友情鏈接更多精彩內(nèi)容