概念
數據遷移是指將數據從一個計算環境或存儲系統移動到另一個計算環境或存儲系統。
隨著公司業務的發展,出于成本優化、系統升級、分庫分表、整合數據等原因。數據遷移工作在日常工作中會陸續出現。
我們可以將數據遷移分成兩個部分,第一部分是數據遷移,第二部分是寫入數據切換
數據遷移
這一部分我們的目標是把舊數據庫的數據同步到新的數據庫,并且保證在線系統新產生的數據也會實時的同步到新數據庫
這里我們會遇到兩種方式的選擇
第一種 二階段遷移
數據會被切分成遷移開始之前和之后兩份數據
遷移開始之前的數據我們通常會用批量select和insert的方式同步到新數據庫
遷移開始之后的數據,通過讀取遷移開始之后binlog的方式同步到新數據庫
當同步的數據量特別大的時候,我們需要注意一個問題binlog是會設置保存時長的。當數據量很大的時候,會存在當第一階段耗時很長,當第二階段開始時,binlog的數據已經開始出現失效的情況
第二種 實時遷移
在這種方式中數據也會分成遷移開始之前和之后兩份數據
不過在遷移中兩份數據不會分成先后導入到新數據庫,會按照批次將兩份數據按照先后進行合并,再導入到新數據庫
雖然解決了第一種方式binlog失效的問題,但是由于加了合并的動作,寫入的效率并沒有第一種方式高
寫入數據切換
當數據遷移完成后,我們將進入數據遷移的第二個部分
我們立即會想到的就是找個業務低峰期直接將寫入服務從老數據切換到新數據庫
即使是單節點的服務,在重啟時也是會有可能存在新的數據開始寫入新的數據庫之后任然有老數據庫同步過來的數據,這時自增id就會出現異常。
所以最安全的操作就是服務停機,等待新庫確認已經同步了老庫的所有數據記錄,再重新開啟服務,寫入新庫
由于業務復雜性、業務量的增加,停服對許多業務來說是盡量避免的,那我們就沒有不停服寫入數據的辦法嗎
雙寫
通常我們可以使用雙寫的方式來實現這個切換
但是這個方式對代碼的入侵性和開發復雜度也是巨大的
代理方式
通過設計代理模式,接管新舊數據庫的切換工作,在服務內集成了數據比對和切換的工作,保證在不停機的情況下,安全的進行遷移數據切換
總結
考慮到不同服務業務需求。我們覺得如果服務存在停機的可能性,停機遷移肯定是最最安全的方式。如果在不能停服的前提下,少量表的遷移,雙寫是不錯的方式。如果不停服,并且全表遷移,代理方式是更合適的方式。