設計乙個資料遷移的方案,需要實現以下目標
遷移速度
qps 需要達到1k,這樣能保證1億的資料能夠在1~2天內跑完
遷移qps可控
遷移有可能對線上服務有影響,需要可動態調整qps
資料完整,不丟失
不能遺漏資料,雖然事後我們有資料校驗的過程,但是設計資料遷移方案時,需要盡可能的包裝資料不丟失。
進度可控
遷移過程可中斷,可重試。比如先遷移10分之一的資料,再繼續來
資料遷移任務大致分為3個步驟,如下圖所示
因為有遷移速度的要求,我們將每個步驟進行分解,確保每個部分可以非同步化,併發處理。這樣可以提公升速度。
完整遍歷老的資料庫。不同的資料庫有不同的方法,比如對於mysql,可以利用現成的binlog,其中就有全量的資料。
對於其他資料庫,通常有兩種方案
單執行緒游標遍歷
單向遍歷,這樣不用進行執行緒之間的資料同步管理,實現比較簡單。為什麼不直接查資料記錄呢,因為相比較於游標,查資料記錄資料量比較大,網路開銷大。游標一次可以拉取1000個數,而只占用很小的資料大小,然後在記憶體中分配。單個值獲取耗時遠小於1ms,所以即使是單執行緒,遍歷資料這塊的qps也能輕鬆達到1k以上。
同時因為是順序遍歷,所以可以保證資料不會丟。可以可以將成功遍歷完,寫入到任務佇列的資料記錄到某個儲存,比如redis中,這樣可以保證游標中斷,或者服務重啟後,可以從這個key中繼續遍歷,這樣就實現了遷移的可中斷
2. 多執行緒分塊遍歷
需要提前對資料進行分片,保證每塊不衝突。比如所有的資料是按照a~z來分布的。那可以開26的執行緒,分別負責遍歷a,z。 因為不同的資料
任務佇列的要求就是高併發的寫,能夠支援較長時間的儲存。kafka,rocketmq等訊息佇列都能滿足,
qps都能達到萬級別以上,都能滿足當前方案的效能要求。
同時可以使用批量提交,來進一步提公升寫入速度。
寫入新庫的操作不要求有順序性,所以只要支援水平擴充套件即可無限提公升速度。
需要結合具體的業務場景和公司已有的基礎設施來選用具體的實現方案。
殺雞焉用牛刀,使用本地執行緒池來實現即可,不需要額外的任務佇列。簡單高效
資料庫 to kafka 元件,將資料寫入到kafka,然後寫處理job扔到flink中跑。
遍歷老資料庫, 寫入到訊息佇列中,然後監聽訊息,查詢資料,寫入到新庫中。也很容易實現。
Redis資料遷移 鍵遷移
有時候我們想將乙個redis的資料遷移到另乙個redis中,redis提供了三種方式來滿足資料遷移的需求,分別是move dump restore migrate redis支援多資料庫,多資料庫之間彼此在資料上是隔離的。move key db就是把指定的鍵從源資料庫遷移到目標資料庫中。由於多資料庫...
Db2資料遷移
db2資料遷移的方法大致有以下幾種 通過db2資料庫的備份和復原進行資料遷移 注意點 進行復原的時候要通過手動選擇備份,復原檔案時間設定要和備份的檔案上的時間戳一致 不能進行跨平台的遷移,如 從linux平台資料庫備份的檔案,不能復原到windows平台資料庫中 通過export to和import...
快速風格遷移網路
快速風格遷移的網路結構包含兩個部分。乙個是 生成網路 image transform net 乙個是 損失網路 loss network 生成網路輸入層接收乙個輸入,最終輸出層輸出也是一張 即風格轉換後的結果 模型總體分為兩個階段,訓練階段和執行階段。模型如圖所示。其中左側是生成網路,右側為損失網路...