本來以為過年了要好好寫文章,因為疫情的關(guān)系,新增的不少的需求。希望這場疫情早日過去吧,武漢加油。今天我們來聊一聊數(shù)據(jù)庫遷移,這個其實非常的常見,例如我們要從自己的機房將數(shù)據(jù)遷移到騰訊云或者阿里云這些線上服務(wù),或者我們有時候需要把一個業(yè)務(wù)拆分成多個子業(yè)務(wù),為了減少系統(tǒng)的耦合,我們通常也會選擇拆庫,這就需要進行數(shù)據(jù)遷移。很多公司,在進行數(shù)據(jù)遷移的時候,都會選擇停服來處理,這是一種偷懶的方法,數(shù)據(jù)遷移能不能做到不停服呢?今天我們來介紹下這個高速換輪胎的技術(shù),數(shù)據(jù)庫遷移。
這個是最常見的數(shù)據(jù)遷移的一個流程。一開始,我們的應(yīng)用都是讀寫舊的數(shù)據(jù)庫,這個時候我們還沒有開啟數(shù)據(jù)遷移。緊接著,我們會有一個新的數(shù)據(jù)庫,一般來說,這個時候,我們會開啟雙寫,什么是雙寫呢?就是對數(shù)據(jù)庫的寫操作,我們既寫到舊庫,又寫到新庫。如果擔(dān)心因為雙寫而造成的耗時增加,我們可以選擇異步同步的模式,但是異步勢必增加了系統(tǒng)的復(fù)雜性,我們需要把失敗的日志記錄下來,以便后期進行處理。
在第二步的時候,我們?nèi)匀皇亲x取舊數(shù)據(jù)庫的數(shù)據(jù),這個時候?qū)€上的業(yè)務(wù)幾乎是沒有影響的,接下來,我們可以準(zhǔn)備讀取新庫的數(shù)據(jù),為了減小影響,我們可以采用一定的灰度策略,先讓部分流量讀取新庫,然后再慢慢擴大灰度范圍,這個時候所有的寫請求還是雙寫的,一旦發(fā)現(xiàn)有問題,可以回退到第二步甚至是第一步,減少對業(yè)務(wù)的影響。當(dāng)服務(wù)穩(wěn)定下來之后,我們可以去掉對舊庫的寫入,這樣子就能完成一次數(shù)據(jù)遷移。
相信很多人會問,說的容易。那么對于歷史數(shù)據(jù),怎么遷移到新庫呢?這里我們介紹兩種常見的方法,一是懶惰遷移,二是主動遷移。什么是懶惰遷移呢?這個是從英文單詞Lazy翻譯過來的,就是如果這行數(shù)據(jù)沒有被使用到,我們就不管他,如果它被使用到,那么我們就把它遷移過來。一般我們會使用一個key-value來記錄下哪些key被懶惰遷移過,當(dāng)我們更新舊表的時候,如果發(fā)現(xiàn)這個key沒有被遷移,那么就順路把他寫到新表里面,并且更新下鍵值數(shù)據(jù),表示這個key已經(jīng)被遷移過了,后面雙寫的時候,直接雙寫即可,無需進行數(shù)據(jù)遷移。
另外一個是主動遷移,有些數(shù)據(jù),可能在進行數(shù)據(jù)遷移的時候就沒被訪問過,例如用戶可能幾個月不登錄,你不能因為數(shù)據(jù)遷移就把他拋棄了。所以我們需要對這些冷數(shù)據(jù)進行數(shù)據(jù)遷移,簡單來說,就是掃取數(shù)據(jù)庫中的存量數(shù)據(jù),然后將他們寫入新的數(shù)據(jù)庫即可。