在星爺的《大話西遊》中有一句非常出名的臺詞:「曾經有一份真摯的感情擺在我的面前我沒有珍惜,等我失去的時候才追悔莫及,人間最痛苦的事莫過於此,如果上天能給我一次再來一次的機會,我會對哪個女孩說三個字:我愛你,如果非要在這份愛上加一個期限,我希望是一萬年!」在我們開發人員的眼中,這個感情就和我們資料庫中的資料一樣,我們多希望他一萬年都不改變,但是往往事與願違,隨著公司的不斷髮展,業務的不斷變更,我們對資料的要求也在不斷的變化,大概有下面的幾種情況:
在實際業務開發中,我們會根據不同的情況來做出不同的遷移方案,接下來我們來討論一下到底應該怎麼遷移資料。
資料遷移其實不是一蹴而就的,每一次資料遷移都需要一段漫長的時間,有可能是一週,有可能是幾個月,通常來說我們遷移資料的過程基本都和下圖差不多:‘ 首先我們需要將我們資料庫已經存在的資料進行批次的遷移,然後需要處理新增的這部分資料,需要實時的把這部分資料在寫完原本的資料庫之後然後寫到我們的新的儲存,在這一過程中我們需要不斷的進行資料校驗。當我們校驗基本問題不大的時候,然後進行切流操作,直到完全切流之後,我們就可以不用再進行資料校驗和增量資料遷移。
首先我們來說一下存量資料遷移應該怎麼做,存量資料遷移在開源社群中搜尋了一圈發現沒有太好用的工具,目前來說阿里雲的DTS提供了存量資料遷移,DTS支援同構和異構不同資料來源之間的遷移,基本支援業界常見的資料庫比如Mysql,Orcale,SQL Server等等。DTS比較適合我們之前說的前兩個場景,一個是分庫的場景,如果使用的是阿里雲的DRDS那麼就可以直接將資料通過DTS遷移到DRDS,另外一個是資料異構的場景,無論是Redis還是ES,DTS都支援直接進行遷移。
那麼DTS的存量遷移怎麼做的呢?其實比較簡單大概就是下面幾個步驟:
select * from table_name where id > curId and id < curId + 10000;複製程式碼
3.當id大於等於maxId之後,存量資料遷移任務結束
當然我們在實際的遷移過程中可能不會去使用阿里雲,或者說在我們的第三個場景下,我們的資料庫欄位之間需要做很多轉換,DTS不支援,那麼我們就可以模仿DTS的做法,通過分段批次讀取資料的方式來遷移資料,這裡需要注意的是我們批次遷移資料的時候需要控制分段的大小,以及頻率,防止影響我們線上的正常執行。
存量資料的遷移方案比較有限,但是增量的資料遷移方法就是百花齊放了,一般來說我們有下面的幾種方法:
這麼多種方式我們應該使用哪種呢?我個人來說是比較推薦監聽binlog的做法的,監聽binlog減少開發成本,我們只需要實現consumer邏輯即可,資料能保證一致性,因為是監聽的binlog這裡不需要擔心之前雙寫的時候不是一個事務的問題。
前面所說的所有方案,雖然有很多是成熟的雲服務(dts)或者中介軟體(canal),但是他們都有可能出現一些資料丟失,出現資料丟失的情況整體來說還是比較少,但是非常難排查,有可能是dts或者canal不小心抖了一下,又或者是接收資料的時候不小心導致的丟失。既然我們沒有辦法避免我們的資料在遷移的過程中丟失,那麼我們應該通過其他手段來進行校正。
通常來說我們遷移資料的時候都會有資料校驗這一個步驟,但是在不同團隊可能會選取不同的資料校驗方案:
當然在實際開發過程中我們也需要注意下面幾點:
當我們資料校驗基本沒有報錯了之後,說明我們的遷移程式是比較穩定的了,那麼我們就可以直接使用我們新的資料了嗎?當然是不可以的,如果我們一把切換了,順利的話當然是很好的,如果出現問題了,那麼就會影響所有的使用者。
所以我們接下來就需要進行灰度,也就是切流。 對於不同的業務切流的的維度會不一樣,對於使用者維度的切流,我們通常會以userId的取模的方式去進行切流,對於租戶或者商家維度的業務,就需要按照租戶id取模的方式去切流。這個切流需要制定好一個切流計劃,在什麼時間段,放出多少的流量,並且切流的時候一定要選擇流量比較少的時候進行切流,每一次切流都需要對紀錄檔做詳細的觀察,出現問題儘早修復,流量的一個放出過程是一個由慢到快的過程,比如最開始是以1%的量去不斷疊加的,到後面的時候我們直接以10%,20%的量去快速放量。因為如果出現問題的話往往在小流量的時候就會發現,如果小流量沒有問題那麼後續就可以快速放量。
在遷移資料的過程中特別要注意的是主鍵ID,在上面雙寫的方案中也提到過主鍵ID需要雙寫的時候手動的去指定,防止ID生成順序錯誤。
如果我們是因為分庫分表而進行遷移,就需要考慮我們以後的主鍵Id就不能是自增id,需要使用分散式id,這裡比較推薦的是美團開源的leaf,他支援兩種模式一種是雪花演演算法趨勢遞增,但是所有的id都是Long型,適合於一些支援Long為id的應用。還有一種是號段模式,這種會根據你設定的一個基礎id,從這個上面不斷的增加。並且基本都走的是記憶體生成,效能也是非常的快。
當然我們還有種情況是我們需要遷移系統,之前系統的主鍵id在新系統中已經有了,那麼我們的id就需要做一些對映。如果我們在遷移系統的時候已經知道未來大概有哪些系統會遷移進來,我們就可以採用預留的方式,比如A系統現在的資料是1到1億,B系統的資料也是1到1億,我們現在需要將A,B兩個系統合併成新系統,那麼我們可以稍微預估一些Buffer,比如給A系統留1到1.5億,這樣A就不需要進行對映,B系統是1.5億到3億,那麼我們轉換成老系統Id的時候就需要減去1.5億,最後我們新系統的新的Id就從3億開始遞增。 但是如果系統中沒有做規劃的預留段怎麼辦呢?可以通過下面兩種方式:
最後簡單來總結下這個套路,其實就是四個步驟,一個注意:存量,增量,校驗,切流,最後再注意一下id。不管是多大量級的資料,基本上按照這個套路來遷移就不會出現大的問題。希望能在大家的後續遷移資料工作中,這篇文章能幫助到你。
如果大家覺得這篇文章對你有幫助,你的關注和轉發是對我最大的支援,O(∩_∩)O:
相關免費學習推薦:
以上就是萬億級資料應該遷移的方法的詳細內容,更多請關注TW511.COM其它相關文章!