1. 程式人生 > >關於全量與增量 的思考

關於全量與增量 的思考

1.背景

資料如果保留多份,就會存在一致性問題,就需要同步,同步分為兩大類:全量和增量

2. 概述

資料如果要保留副本,要麼同時寫(就是多寫),或者進行復制:非同步寫(即從主資料拷貝到副本);

同時寫(多寫),引出一個問題,寫多少節點算成功(場景:分散式系統)?全部寫成功才算成功,還是寫大多數成功算成功,還是寫指定幾個節點算成功?

非同步寫的話,如果採用非同步複製,那麼實時性需要考量的話,就需要採用效能優先的架構。

3.同步方式

 資料同步一般分為兩種方式:全量和增量。

3.1  全量

全量,這個很好理解。就是每天定時(避開業務高峰期)或者週期性全量把資料從一個地方拷貝到另外一個地方;

全量的話,可以採用直接全部覆蓋(使用“新”資料覆蓋“舊”資料);或者走更新邏輯(覆蓋前判斷下,如果新舊不一致,就更新);

這裡面有一個隱藏的問題:如果採用非同步寫,主資料物理刪除了,怎麼直接通過全量資料同步?這就需要藉助一些中間操作日誌檔案,或者其他手段,把這些“看不到”的資料記錄起來。

3.2 增量

增量的基礎是全量,就是你要使用某種方式先把全量資料拷貝過來,然後再採用增量方式同步更新。

增量的話,就是指抓取某個時刻(更新時間)或者檢查點(checkpoint)以後的資料來同步,不是無規律的全量同步。這裡引入一個關鍵性的前提:副本一端要記錄或者知道(通過查詢更新日誌或者訂閱更新)哪些更新了。

3.2.1 確定更新點

採用更新時間戳、有的採用checkpoint等來標識和記錄更新點。

二、能用全量別用增量

兩個系統之間需要同步資料,同步的方法可以分為全量和增量兩種形式。多年的經驗告訴我,能用全量就別用增量。增量有三個問題

  1. 資料提供方,很難製作增量包,事無鉅細都要記錄,稍微記錯就全完了
  1. 資料接收方,理解並且實施增量包的邏輯比較複雜
  1. 中間過程一旦出了問題,很難定位

這裡為了方便討論,假設有兩個系統,其中系統A擁有全深圳所有納稅人的當月工資,系統B需要從系統A同步這個資料。對於系統A來說,它的資料在不停的變化,但是可以分成三類

  1. 新增,比如說有畢業生來深圳打工
  1. 刪除,比如說有人離職離開深圳了
  1. 變化,比如說有人漲工資了

這個時候,同步資料的方法很難決策,全量同步不合適,資料量太大而且還不值當,畢竟變化的部分比較少。增量同步又怕麻煩,一旦某次同步出問題,很難倒查故障和恢復。

其實,可以有一種折中方案,上不了檯面,但是值得嘗試。為了方便理解,還是以上面的例子來討論。

我們知道所有人都有身份證號碼,其中有一部分為年月日,表示生日。我們按照生日,在系統A將資料進行分組,這個分組是邏輯上的,不是真實的。如果有個人,工資漲了,生日為1999.9.1,那麼系統A就記錄分組1999.9.1的資料發生了變化。假設兩個系統之間的同步週期是每天同步一次,那麼系統A只需要整理這段時間那些分組發生了變化,但是不用記錄變化的實際內容。系統B就老老實實將發生變化的分組資料刪掉,然後全量同步這些分組的資料。

這個方案,就是賭每天發生變更的資料不會那麼巧,波及所有分組,只會有很小的一部分分組發生變化。這樣從整體看,只是同步了部分資料,從分組看又是簡單的全量同步。這個方案的巧妙之處就是選擇合適的分組標準,既要分的足夠細,又要足夠直接,方便程式處理。

資料同步在垮產品或者垮系統之間是經常用到的,且經常是不得不用的;這種地方是最容易產生

問題的地方,一般也是最噁心的地方;資料同步有兩種方式,一種是增量的同步,一種是全量的同步;兩種方式各個各的好處,也各個各的問題;增量同步,主要是生產方和接收方生成和處理資料邏輯都不會很簡單,時間一長,很容易造成資料的不一致;全量同步一般不會造成資料的不一致情況,但隨著資料量的增大,全量資料到最後往往會非常大造成生成和處理都有點不太可能;上述這幾條在資料同步中基本都考慮到了,也遇到過n次,也不得不容忍,修正之類的;但前些天發生的一件事情使我對“全量資料同步”這一方法產生了極大的恐懼感;全量資料同步的好處是生產方和消費方邏輯都比較簡單,就是每天在某固定時刻重新生成所有的資料不像增量那樣要處理有可能非常複雜的增量邏輯;但是:正因為是重新生成,所以全量資料的準確性特別是全面性變得非常非常重要,說白了就是全量資料如果因為某種原因導致丟失了部分甚至大部分資料,造成的後果是非常嚴重非常嚴重的;比如:白名單問題,如果白名單是以全量資料過去的,假設某天這一同步出了問題,產生了一個空的白名單,完蛋了,消費方看到了一個空白名單...資料同步其實是非常容易出問題的,比如:生產方和消費方的時間點問題,rsync問題等等;如果又剛好採用全量同步,一旦某天出問題,導致的結果有可能是災難性的!!怎麼防止或者監控呢?需要生產方特別是消費方對全量資料進行一個檢驗,如果發現全量資料異常最好立即停下處理,然後發郵件報警,然後人工干預處理;至於怎樣的檢測,最簡單的檢測方法就是:檢查資料的數量,如果發現數量明顯異常(太少或者太多)之類...謹記!!!!