開發(fā)者必看!你想知道的遷移之道都在這里了
1.背景介紹
隨著GaussDB(for openGauss)數(shù)據(jù)庫的不斷發(fā)展,越來越多的客戶開始選擇使用GaussDB(for openGauss),其中很大一部分客戶是將現(xiàn)有的系統(tǒng)替換到GaussDB(for openGauss)上,客戶當(dāng)前所用的數(shù)據(jù)庫類型多種多樣,如Oracle、MySQL、PostgreSQL等。那么如何解決將客戶當(dāng)前數(shù)據(jù)庫遷移到GaussDB(for openGauss)上是一個很迫切的需求。GaussDB(for openGauss)自帶的GDS數(shù)據(jù)遷移工具實現(xiàn)了GaussDB(for openGauss)之間的高效數(shù)據(jù)遷移,但是無法解決異構(gòu)同步和實時同步的場景。華為云數(shù)據(jù)庫遷移工具DRS以一種易用、穩(wěn)定、高效的云服務(wù)為GaussDB(for openGauss)提供了異構(gòu)遷移和實時同步的能力,助力客戶輕松將數(shù)據(jù)庫遷移到GaussDB(for openGauss)。
2.數(shù)據(jù)庫遷移整體解決方案
數(shù)據(jù)庫遷移的目的是為了業(yè)務(wù)遷移,而業(yè)務(wù)能否順利切換取決于數(shù)據(jù)庫的遷移能力和遷移后的準(zhǔn)確性,站在業(yè)務(wù)側(cè)的角度,至少要滿足以下三個正確性才能夠去做業(yè)務(wù)的切換。
- 對象遷移是正確的
數(shù)據(jù)庫的存儲過程、函數(shù)、觸發(fā)器、表結(jié)構(gòu)、索引等全部數(shù)據(jù)庫對象能夠完整的遷移到目標(biāo)庫,并且能夠保證對象的運行邏輯和源庫是一致的。
- 數(shù)據(jù)遷移是正確的
將源庫的全量數(shù)據(jù)遷移到目標(biāo)庫,當(dāng)業(yè)務(wù)對停機時間窗口有要求的時候,要考慮全量+增量的在線遷移,保證業(yè)務(wù)不中斷。同時要能夠?qū)ν降臄?shù)據(jù)進行校驗,保證遷移數(shù)據(jù)的準(zhǔn)確性。
- 遷移后業(yè)務(wù)運行是正確的
當(dāng)對象和數(shù)據(jù)都遷移到目標(biāo)庫后,業(yè)務(wù)的切換還存在兩個風(fēng)險點,一個是業(yè)務(wù)在目標(biāo)庫的運行結(jié)果是否正確,另一個是目標(biāo)庫性能能否和源庫一樣支撐住業(yè)務(wù)的負(fù)載。因為異構(gòu)數(shù)據(jù)庫之間的差異還是很大的,設(shè)計理念和實現(xiàn)方式存在很多不同,會導(dǎo)致看上去類似的兩個對象,其運行結(jié)果或效率是完全不同的。所以要有工具來驗證這種差異,保證遷移后業(yè)務(wù)運行的正確性。
為了實現(xiàn)以上業(yè)務(wù)切換需要滿足的條件,華為云提供了數(shù)據(jù)庫遷移的整體解決方案,通過語法遷移(UGO),DRS-數(shù)據(jù)遷移,DRS-數(shù)據(jù)校驗和DRS-流量回放4個工具產(chǎn)品形成了整個遷移過程的閉環(huán)。

- 語法遷移(UGO)
實現(xiàn)了將oracle數(shù)據(jù)庫對象遷移到GaussDB(for openGauss)的能力,可以給出完整的遷移評估報告,哪些對象可以完全兼容的進行遷移,哪些對象需要進行轉(zhuǎn)換進行遷移,哪些對象需要業(yè)務(wù)配合改造。
- DRS-數(shù)據(jù)遷移
實現(xiàn)將Oracle、MySQL、PostgreSQL等數(shù)據(jù)庫數(shù)據(jù)實時遷移到GaussDB(for openGauss)的能力。
- DRS-數(shù)據(jù)校驗
實現(xiàn)了對數(shù)據(jù)遷移后的一致性校驗,具備行級比對、內(nèi)容級比對和實時的增量數(shù)據(jù)比對的能力。
- DRS-流量回放
實現(xiàn)對Oracle數(shù)據(jù)庫的業(yè)務(wù)流量抓取,并對流量SQL進行轉(zhuǎn)換,然后在GaussDB(for openGauss)進行回放的能力。
3.DRS數(shù)據(jù)遷移上云

DRS提供了簡單、易用的操作界面,采用流程化的配置方式,客戶按照提示步驟一步一步操作便可以搭建出同步鏈路。DRS除了支持Oracle到GaussDB(for openGauss)的數(shù)據(jù)遷移外,還支持其他數(shù)據(jù)庫之間的數(shù)據(jù)同步,下面給出了當(dāng)前DRS所支持的源庫和目標(biāo)庫類型的列表。

在數(shù)據(jù)遷移過程中,DRS采用很多手段和技術(shù)去降低可能存在的風(fēng)險,保證遷移過程的穩(wěn)定和最終數(shù)據(jù)的一致性。
- 在線遷移
DRS通過全量遷移將客戶數(shù)據(jù)庫中的存量數(shù)據(jù)遷移到GaussDB(for openGauss)中,通過增量同步,實時解析源庫日志,將客戶的實時變化數(shù)據(jù)同步到Gauss(for openGauss),通過全量和增量的無縫銜接來保證客戶在不中斷業(yè)務(wù)的情況下,完整地將全部數(shù)據(jù)遷移到GaussDB(for openGauss)。
- 預(yù)校驗
在DRS的遷移任務(wù)啟動之前,為提早發(fā)現(xiàn)遷移啟動后可能存在的風(fēng)險或錯誤,DRS引入預(yù)校驗環(huán)節(jié),能夠提前對配置信息、數(shù)據(jù)庫兼容性信息、連通性信息等進行校驗,同時會對一些可以遷移成功但可能會對業(yè)務(wù)產(chǎn)生影響的情況進行告警,讓客戶及時發(fā)現(xiàn)并提前處理。
- 斷點機制
為保證數(shù)據(jù)遷移的一致性,DRS在每個組件中都設(shè)有斷點機制,無論是在正常啟停、異常重啟還是在故障切換的場景下都可以保證數(shù)據(jù)同步的準(zhǔn)確性,不會造成數(shù)據(jù)丟失。
4.DRS技術(shù)實現(xiàn)原理
DRS在技術(shù)實現(xiàn)上主要分為兩個大的模塊,一個是全量的數(shù)據(jù)同步,另一個是增量數(shù)據(jù)同步。全量同步解決對靜態(tài)數(shù)據(jù)的遷移,增量同步解決對實時的變化數(shù)據(jù)遷移。
全量同步的技術(shù)架構(gòu)
全量同步的整體邏輯比較簡單,就是從源庫把數(shù)據(jù)通過select的方式查詢出來,然后再將這些數(shù)據(jù)寫入到目標(biāo)庫,只是在具體的代碼實現(xiàn)上會有一些關(guān)鍵技術(shù)點。

- 數(shù)據(jù)分片
一般全量同步產(chǎn)品的同步粒度都可以達到表級別的并發(fā),即多個線程可以同時對多張表同時進行同步,但往往客戶的系統(tǒng)中會存在單表數(shù)據(jù)量特別大的情況,比如一張表幾十億甚至上百億的數(shù)據(jù),此時這張表的同步時間就變?yōu)檎麄€全量同步的時間。那么如何進一步提升單張表的同步效率呢?我們可以對單表做進一步的拆分,按照主鍵去把它拆分成多個分片,多線程以分片為單位做并行的同步。
當(dāng)前DRS按照下面的策略對表進行分片:
-
- 無主鍵表不進行分片
- 分區(qū)表按分區(qū)進行同步,不再對每個分區(qū)進行分片
- 有主鍵表按主鍵(第一列)進行分片
- 數(shù)據(jù)不落盤
為減少全量同步過程中對磁盤的占用,DRS導(dǎo)出的數(shù)據(jù)不進行落盤緩存,而是直接通過內(nèi)存?zhèn)鬟f給導(dǎo)入線程,在導(dǎo)出和導(dǎo)入速率相當(dāng)?shù)那闆r下,可以最大化的提高全量同步的效率。
- 斷點控制
全量同步半途中斷是一個非常讓人棘手的問題,可能一張2億條數(shù)據(jù)的表,在同步到1.8億的時候因為網(wǎng)絡(luò)或源庫快照過舊的問題導(dǎo)致同步失敗,如果沒有好的斷點控制機制,那可能之前的付出都白白浪費,還要重新再次同步一次。DRS通過以分片為單位做為斷點的保存記錄,對于上面的例子,即使同步中斷,也可以再次被拉起,而且拉起后,已經(jīng)同步成功的分片將不再同步,還沒有同步的分片則會繼續(xù)同步。
- 流量控制
客戶的業(yè)務(wù)往往是存在高峰期和低峰期,高峰期時,數(shù)據(jù)庫的資源占用是最高的,我們要盡量避開在業(yè)務(wù)高峰期做全量的同步,因為全量同步對源庫的cpu、內(nèi)存和網(wǎng)絡(luò)資源占用是很大的。DRS采用流量控制的機制來減少業(yè)務(wù)高峰期對源庫的資源占用,主要是通過控制網(wǎng)絡(luò)流量的方式,客戶可以設(shè)置要進行流量控制的時間段,DRS在全量同步過程中,會實時計算同步的流量大小,運行到該時段后,當(dāng)流量超過設(shè)置的閾值,會放緩數(shù)據(jù)獲取的速度。運行過該時段后,便恢復(fù)全部的數(shù)據(jù)同步速度。
- 全量+增量的無縫銜接
在業(yè)務(wù)切庫的場景中,數(shù)據(jù)的遷移過程一般可以選擇兩種方案,一種是一次性將源庫的數(shù)據(jù)遷移到目標(biāo)庫,但是需要業(yè)務(wù)停機窗口,這個窗口的大小取決于全量數(shù)據(jù)遷移的時間。當(dāng)數(shù)據(jù)量較大時,整個遷移過程可能需要幾天的時間,這種業(yè)務(wù)停機是無法接受的。所以另一種方案就是業(yè)務(wù)不中斷的數(shù)據(jù)遷移方案,它的實現(xiàn)原理就是基于全量遷移和增量同步的無縫銜接,對于Oracle->GaussDB(for openGauss)的遷移,Oracle數(shù)據(jù)庫提供了指定scn進行快照導(dǎo)出的功能,基于這個特性,DRS在做全量同步時,指定scn進行導(dǎo)出,這樣整個全量同步的數(shù)據(jù)就是此scn點前的快照數(shù)據(jù),然后增量同步以這個scn點作為同步的分界點,只有大于這個scn的增量事務(wù)才會被同步到目標(biāo)庫。這樣就實現(xiàn)了全量和增量的無縫銜接,同步過程無需業(yè)務(wù)進行停機,當(dāng)全量數(shù)據(jù)同步完成且增量同步追趕到當(dāng)前時間點時,便可進行業(yè)務(wù)切換,業(yè)務(wù)中斷窗口可以控制在秒級。
增量同步的技術(shù)架構(gòu)
DRS的增量同步架構(gòu)主要分為3個部分,分別是數(shù)據(jù)抓取、落盤文件和數(shù)據(jù)回放。

- 數(shù)據(jù)抓取
數(shù)據(jù)抓取通過對源庫日志的解析,實時獲取源庫的變化數(shù)據(jù),在內(nèi)部實現(xiàn)上主要包括日志拉取、日志解析、事務(wù)整合和數(shù)據(jù)落盤幾個步驟。
-
- 日志拉取
DRS采用Oracle的Logminer接口獲取實時的redo日志,當(dāng)redo歸檔后,DRS會讀取歸檔日志文件。為了防止源庫的歸檔日志被不確定性刪除,DRS會啟動日志拉取的線程(可以多線程并發(fā))把日志拉取到本地,然后進行后續(xù)的解析。
-
- 日志解析
Oracle Logminer接口獲取到的數(shù)據(jù)需要進一步解析才能獲取到實際的變化內(nèi)容,DRS的日志解析線程對返回的數(shù)據(jù)進行過濾、拼接、元數(shù)據(jù)映射、轉(zhuǎn)換等操作形成一條完整的變更記錄對象。
-
- 事務(wù)整合
日志解析是按照源庫變化數(shù)據(jù)的順序進行解析,解析后的每條記錄的事務(wù)是交叉混合在一起的,必須對每條記錄按照事務(wù)id進行整合才能形成一個完整的事務(wù)。另一方面對于Oracle RAC的場景,還需要對不同節(jié)點的事務(wù)進行排序,避免事務(wù)亂序的情況發(fā)生。
- 落盤文件
經(jīng)過了事務(wù)整合后,形成了一個按照源庫業(yè)務(wù)提交順序的序列,DRS會按照這個順序把這些數(shù)據(jù)寫入到磁盤文件。落盤的數(shù)據(jù)包含了源庫每一條變化數(shù)據(jù)的全部信息,包含表信息、列信息、事務(wù)信息、數(shù)據(jù)信息和其他額外信息(如時間戳、rowid等),根據(jù)這些信息后面的組件便可以把每一條變化數(shù)據(jù)還原成對象的SQL。
- 數(shù)據(jù)回放
數(shù)據(jù)回放就是將數(shù)據(jù)抓取到的數(shù)據(jù)在目標(biāo)庫進行執(zhí)行的過程,但它和數(shù)據(jù)的抓取是解耦的。它讀取DRS的落盤文件,解析出每條變化的數(shù)據(jù),根據(jù)文件中記錄的元數(shù)據(jù)信息重構(gòu)出對應(yīng)的SQL語句,在目標(biāo)庫執(zhí)行。
在數(shù)據(jù)回放之前,DRS提供了過濾和轉(zhuǎn)換的功能,可以對同步的數(shù)據(jù)進行過濾,可配置過濾條件,如只同步id < 10000的數(shù)據(jù),也可以對同步數(shù)據(jù)的表名、schema名或列名進行映射等。
異常處理和回放性能是兩個重要的考量點,DRS通過配置數(shù)據(jù)沖突策略來處理回放中的異常數(shù)據(jù),通過并發(fā)機制來提高裝載的性能。
-
- 沖突策略
所謂的沖突是指在數(shù)據(jù)回放的時候出現(xiàn)了數(shù)據(jù)類報錯(如主鍵沖突、update和delete無法找到記錄等),這些報錯一版都是由于兩邊的數(shù)據(jù)不一致造成的。DRS對這類錯誤采用了三種處理策略,分別是覆蓋、忽略和等待。
覆蓋:當(dāng)出現(xiàn)沖突時,用抓取到的數(shù)據(jù)覆蓋掉目標(biāo)庫的數(shù)據(jù)
忽略:數(shù)據(jù)沖突后,直接跳過錯誤記錄,繼續(xù)執(zhí)行
等待:數(shù)據(jù)沖突后,等待人工處理
-
- 并發(fā)機制
DRS的并發(fā)機制采用記錄級別的并發(fā),最大化的提升數(shù)據(jù)裝載的性能。

首先從DRS的落盤文件中讀取增量數(shù)據(jù),按順序放入一個隊列中,并行分析引擎會從隊列中獲取每一條數(shù)據(jù),并根據(jù)其主鍵信息判斷是否存在數(shù)據(jù)沖突,對于沒有沖突的數(shù)據(jù)說明可以并行去執(zhí)行,則把這些數(shù)據(jù)分散到多個線程隊列中,當(dāng)線程隊列中的數(shù)據(jù)量達到設(shè)定的閾值時,這批數(shù)據(jù)會作為一個事務(wù)在目標(biāo)庫執(zhí)行。對于有沖突的數(shù)據(jù),則把這條數(shù)據(jù)放到?jīng)_突隊列,等待線程把上一批數(shù)據(jù)執(zhí)行完成后,再次進入并行分析引擎判斷是否存在沖突。
Ps:該內(nèi)容根據(jù)《GaussDB(for openGauss)數(shù)據(jù)遷移之DRS》技術(shù)直播整理完成
























