天天看點

一次做資料報表的踩坑經曆,讓我領略了資料同步增量和全量的差別

一次做資料報表的踩坑經曆,讓我領略了資料同步增量和全量的差別

嗨喽,大家好,我是創作新人,新時代新的農民工小趙,在今年的七月結束了大學生活,目前在一家大資料公司做開發。對于初入職場的同學來說,在實際的工作開發中會遇到各種各樣問題,将問題沉澱、輸出、總結,才會讓後面的路走的越來越輕松。那麼,接下來我會通過以下幾個方面進行分享。

一、背景介紹

首先來說一下此次問題的一個背景,我是在去年的12月已經進入公司進行實習了,剛進入公司避免不了各種各樣的學習,學習公司産品、技術、體系架構、企業文化......。進行了兩個月的學習後,我迎來了第一個公司内部的項目,和同僚一起搭建維護一個内部使用的工單系統。換句話說,就是優化各個職能崗位做事流程的一個系統,可以在每個流程節點看到對應同學的一些動作。今年3月底試運作,5月底正式上線。

随着内部同學的推廣、系統的不斷優化、各個同學的配合,在工單系統試運作一段時間後,使用的同學就越來越多。上司有一天突然找我說:”小趙啊,工單系統做的不錯,值得表揚啊,嗯。。。斯。。,現在想讓你基于工單系統再做一個工單報表系統怎麼樣呀“。我說:”好。。好的上司“。話音剛落,我就百度了一下”什麼是報表系統?“,百度是這樣說的:”将計算機技術與會計報表編制方法相結合設計出專門用于報表資料處理的軟體。報表系統是用于統計報表制作及報表及資料填報的企業級報表分析軟體“。當時看完我就明白了,哦,原來是這樣,開始搞!!!

一次做資料報表的踩坑經曆,讓我領略了資料同步增量和全量的差別

二、問題概述

介紹完背景後,接下來回顧分析一下當時出現的問題。

首先,因為工單報表系統是基于工單系統來做的,是以報表系統接的資料源是工單系統的,所有的資料儲存在MYSQL資料庫中。那麼,第一步就是将工單的資料接入到報表系統中,此步操作放到了前端視圖中,隻需要在頁面上對MYSQL資訊進行配置,中繼資料就可以加載進來。配置完資料源後,緊接着有一步操作就是配置資料是全量更新導入或者增量更新導入,當然也可配置按時間周期性,比如:每天的淩晨兩點刷一次資料。換句話說,就是設定一個時間節點去泡一個定時任務。當時我是第一次接觸到這兩個技術名詞,我詢問了周圍的同學。經過一番強有力的交流之後,我所悟到:

  • 全量導入:定時的将所有資料更新一次,然後重新進行導入。如果資料量不大的話,這種方案就适合,但是考慮到,如果以後資料量龐大的話,這種方案效率不高。
  • 增量導入:資料庫中的每張表都會有一個更新時間的字段,如果資料有更新,隻需要根據更新時間的字段,将最新的一條資料拉過來,然後覆寫掉之前的資料,這樣的好處就是,資料量不會變得很大,不會有備援的髒資料産生,感覺效率挺不錯的。

當然,以上隻是我自己的了解,對比下來,如果長遠的看待的話,覺得增量導入會比較好,然後我就根據自己的感覺,勾選了增量導入。

就這樣,報表系統平穩的運作了幾天後,在某一天的上午,小王同學看完報表統計資料後找到我說:“小趙啊,你們做的工單系統聽牛X的,都提了兩千多個單子了,大佬,強的很!!”。當時聽完自己心裡還竊喜了一下,還真覺得自己牛X。冷靜下來思考一分鐘覺得不對勁,這玩意兒是給我們内部使用的,難道這玩意兒這麼好用,突然這麼多同學都開始用啦?懷着既開心又心慌的心情,上到報表系統的資料庫查了一下,如下圖所示,果真,兩千九百條資料!!!現在回想起隻記得那天上午,陽光特别明媚,笑容如此的燦爛。

一次做資料報表的踩坑經曆,讓我領略了資料同步增量和全量的差別

到了那天下午,工作群有個哥們工單群裡面回報出現了一個bug,上司在群裡@我讓我迅速處理一下。當即給群裡回複了一句“交給我,你放心”。然後我二話沒說,三下五除二就把bug給解決了,不知道為何,那天下午的陽光更加的明媚起來了,笑容也更加燦爛。解決完後,閑着沒事就去工單系統的資料庫溜達一下,

隻見我熟練的在編輯器中敲下那行代碼,,

select count(*) from xxx ;      

自信的點選運作,結果如圖所示,oh my god!顯示隻有八百多條資料,不知為何,那天下午的天起逐漸下起了小雨,笑容逐漸退卻,留下的隻有碩大的眼睛和長大的嘴巴。重複執行了幾次後,我悟了,資料同步出問題了,報表系統資料備援,産生了髒資料。

一次做資料報表的踩坑經曆,讓我領略了資料同步增量和全量的差別

經過反複的推理,驗證,最後我從工單系統中拉出一條資料,在報表系統中單查這一條資料,結果如下圖,一條資料在庫中重複出現了七次,總共八條資料。刹那間,突然想起來,報表系統同步工單資料從開始到那天剛好八天,也就是說,這條資料每天都同步了一次且沒有被覆寫。緊接着回想起當初進行資料同步時,使用的增量導入,當時的了解是:如果資料有更新,根據更新字段,每天定時将最新的資料同步,然後覆寫掉舊的資料。

一次做資料報表的踩坑經曆,讓我領略了資料同步增量和全量的差別

 結果猜測:

增量導入資料,如果資料有更新,就會定時将新的資料進行同步且舊的資料依然存在,不會被覆寫。

真正的結論到底是什麼?增量導入資料是如何同步的呢?與全量導入的差別到是什麼?接下來就聊聊全量和增量。

三、聊聊全量和增量

在了解全量和增量之前,我們先聊聊什麼資料同步?

  • 資料如果保留多份或者多處使用,就會存在一緻性問題,解決一緻性問題就需要同步,
  • 同步分為兩大類:全量和增量換句話說,就是如果一個資料源需要被多個系統所使用,或者需要備份在多個機器中,在使用或者儲存的過程中資料有可能發生後變化,是以會導緻資料不一緻的問題,這時就需要進行資料同步,確定資料的一緻性

那什麼是全量?

  • 每天定時(避開業務高峰期)或者周期性,全量把資料從一個地方拷貝到另外一個地方;
  • 采用直接全部覆寫(使用“新”資料覆寫“舊”資料);或者更新邏輯(覆寫前判斷下,如果新舊不一緻,就更新。

什麼是增量?

  • 增量的基礎是全量,就是要使用某種方式先把全量資料拷貝過來,然後再采用增量方式同步更新;
  • 抓取某個時刻(更新時間)或者檢查點(checkpoint)以後的資料來同步,不是無規律的全量同步。

他們之間有什麼差別呢?

  • 全量是有規律的、周期性的;增量是無規則、無規律的;
  • 增量的基礎是全量;
  • 全量會讓新的資料覆寫掉舊的資料,而增量無法覆寫舊資料;

回想一下之前對增量的了解:如果資料有更新,根據更新字段,每天定時将最新的資料同步,然後覆寫掉舊的資料。顯而易見,全量才會覆寫掉舊的資料,增量做不到,這就導緻了資料從工單系統同步到報表系統後,随着工單系統資料更新,報表中資料原來越多。

知道了問題的根本原因後,當機立斷切掉資料源,使用全量重新進行同步,資料恢複正常!

四、總結

繼續閱讀