開發者必看!你想知道的遷移之道都在這里了


摘要:數據庫遷移的目的是為了業務遷移,而業務能否順利切換取決於數據庫的遷移能力和遷移后的准確性,站在業務側的角度,至少要滿足以下三個正確性才能夠去做業務的切換。

本文分享自華為雲社區《華為雲GaussDB(for openGauss)專場直播第4期:用對遷移工具,遷移也可以很簡單》,原文作者:心機胖 。

1.背景介紹

隨着GaussDB(for openGauss)數據庫的不斷發展,越來越多的客戶開始選擇使用GaussDB(for openGauss),其中很大一部分客戶是將現有的系統替換到GaussDB(for openGauss)上,客戶當前所用的數據庫類型多種多樣,如Oracle、MySQL、PostgreSQL等。那么如何解決將客戶當前數據庫遷移到GaussDB(for openGauss)上是一個很迫切的需求。GaussDB(for openGauss)自帶的GDS數據遷移工具實現了GaussDB(for openGauss)之間的高效數據遷移,但是無法解決異構同步和實時同步的場景。華為雲數據庫遷移工具DRS以一種易用、穩定、高效的雲服務為GaussDB(for openGauss)提供了異構遷移和實時同步的能力,助力客戶輕松將數據庫遷移到GaussDB(for openGauss)。

2.數據庫遷移整體解決方案

數據庫遷移的目的是為了業務遷移,而業務能否順利切換取決於數據庫的遷移能力和遷移后的准確性,站在業務側的角度,至少要滿足以下三個正確性才能夠去做業務的切換。

  • 對象遷移是正確的

數據庫的存儲過程、函數、觸發器、表結構、索引等全部數據庫對象能夠完整的遷移到目標庫,並且能夠保證對象的運行邏輯和源庫是一致的。

  • 數據遷移是正確的

將源庫的全量數據遷移到目標庫,當業務對停機時間窗口有要求的時候,要考慮全量+增量的在線遷移,保證業務不中斷。同時要能夠對同步的數據進行校驗,保證遷移數據的准確性。

  • 遷移后業務運行是正確的

當對象和數據都遷移到目標庫后,業務的切換還存在兩個風險點,一個是業務在目標庫的運行結果是否正確,另一個是目標庫性能能否和源庫一樣支撐住業務的負載。因為異構數據庫之間的差異還是很大的,設計理念和實現方式存在很多不同,會導致看上去類似的兩個對象,其運行結果或效率是完全不同的。所以要有工具來驗證這種差異,保證遷移后業務運行的正確性。

為了實現以上業務切換需要滿足的條件,華為雲提供了數據庫遷移的整體解決方案,通過語法遷移(UGO),DRS-數據遷移,DRS-數據校驗和DRS-流量回放4個工具產品形成了整個遷移過程的閉環。

  • 語法遷移(UGO)

實現了將oracle數據庫對象遷移到GaussDB(for openGauss)的能力,可以給出完整的遷移評估報告,哪些對象可以完全兼容的進行遷移,哪些對象需要進行轉換進行遷移,哪些對象需要業務配合改造。

  • DRS-數據遷移

實現將Oracle、MySQL、PostgreSQL等數據庫數據實時遷移到GaussDB(for openGauss)的能力。

  • DRS-數據校驗

實現了對數據遷移后的一致性校驗,具備行級比對、內容級比對和實時的增量數據比對的能力。

  • DRS-流量回放

實現對Oracle數據庫的業務流量抓取,並對流量SQL進行轉換,然后在GaussDB(for openGauss)進行回放的能力。

3.DRS數據遷移上雲

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

在數據遷移過程中,DRS采用很多手段和技術去降低可能存在的風險,保證遷移過程的穩定和最終數據的一致性。

  • 在線遷移

DRS通過全量遷移將客戶數據庫中的存量數據遷移到GaussDB(for openGauss)中,通過增量同步,實時解析源庫日志,將客戶的實時變化數據同步到Gauss(for openGauss),通過全量和增量的無縫銜接來保證客戶在不中斷業務的情況下,完整地將全部數據遷移到GaussDB(for openGauss)。

  • 預校驗

在DRS的遷移任務啟動之前,為提早發現遷移啟動后可能存在的風險或錯誤,DRS引入預校驗環節,能夠提前對配置信息、數據庫兼容性信息、連通性信息等進行校驗,同時會對一些可以遷移成功但可能會對業務產生影響的情況進行告警,讓客戶及時發現並提前處理。

  • 斷點機制

為保證數據遷移的一致性,DRS在每個組件中都設有斷點機制,無論是在正常啟停、異常重啟還是在故障切換的場景下都可以保證數據同步的准確性,不會造成數據丟失。

4.DRS技術實現原理

DRS在技術實現上主要分為兩個大的模塊,一個是全量的數據同步,另一個是增量數據同步。全量同步解決對靜態數據的遷移,增量同步解決對實時的變化數據遷移。

全量同步的技術架構

全量同步的整體邏輯比較簡單,就是從源庫把數據通過select的方式查詢出來,然后再將這些數據寫入到目標庫,只是在具體的代碼實現上會有一些關鍵技術點。

  • 數據分片

一般全量同步產品的同步粒度都可以達到表級別的並發,即多個線程可以同時對多張表同時進行同步,但往往客戶的系統中會存在單表數據量特別大的情況,比如一張表幾十億甚至上百億的數據,此時這張表的同步時間就變為整個全量同步的時間。那么如何進一步提升單張表的同步效率呢?我們可以對單表做進一步的拆分,按照主鍵去把它拆分成多個分片,多線程以分片為單位做並行的同步。

當前DRS按照下面的策略對表進行分片:

    • 無主鍵表不進行分片
    • 分區表按分區進行同步,不再對每個分區進行分片
    • 有主鍵表按主鍵(第一列)進行分片

 

  • 數據不落盤

為減少全量同步過程中對磁盤的占用,DRS導出的數據不進行落盤緩存,而是直接通過內存傳遞給導入線程,在導出和導入速率相當的情況下,可以最大化的提高全量同步的效率。

  • 斷點控制

全量同步半途中斷是一個非常讓人棘手的問題,可能一張2億條數據的表,在同步到1.8億的時候因為網絡或源庫快照過舊的問題導致同步失敗,如果沒有好的斷點控制機制,那可能之前的付出都白白浪費,還要重新再次同步一次。DRS通過以分片為單位做為斷點的保存記錄,對於上面的例子,即使同步中斷,也可以再次被拉起,而且拉起后,已經同步成功的分片將不再同步,還沒有同步的分片則會繼續同步。

  • 流量控制

客戶的業務往往是存在高峰期和低峰期,高峰期時,數據庫的資源占用是最高的,我們要盡量避開在業務高峰期做全量的同步,因為全量同步對源庫的cpu、內存和網絡資源占用是很大的。DRS采用流量控制的機制來減少業務高峰期對源庫的資源占用,主要是通過控制網絡流量的方式,客戶可以設置要進行流量控制的時間段,DRS在全量同步過程中,會實時計算同步的流量大小,運行到該時段后,當流量超過設置的閾值,會放緩數據獲取的速度。運行過該時段后,便恢復全部的數據同步速度。

  • 全量+增量的無縫銜接

在業務切庫的場景中,數據的遷移過程一般可以選擇兩種方案,一種是一次性將源庫的數據遷移到目標庫,但是需要業務停機窗口,這個窗口的大小取決於全量數據遷移的時間。當數據量較大時,整個遷移過程可能需要幾天的時間,這種業務停機是無法接受的。所以另一種方案就是業務不中斷的數據遷移方案,它的實現原理就是基於全量遷移和增量同步的無縫銜接,對於Oracle->GaussDB(for openGauss)的遷移,Oracle數據庫提供了指定scn進行快照導出的功能,基於這個特性,DRS在做全量同步時,指定scn進行導出,這樣整個全量同步的數據就是此scn點前的快照數據,然后增量同步以這個scn點作為同步的分界點,只有大於這個scn的增量事務才會被同步到目標庫。這樣就實現了全量和增量的無縫銜接,同步過程無需業務進行停機,當全量數據同步完成且增量同步追趕到當前時間點時,便可進行業務切換,業務中斷窗口可以控制在秒級。

增量同步的技術架構

DRS的增量同步架構主要分為3個部分,分別是數據抓取、落盤文件和數據回放。

  • 數據抓取

數據抓取通過對源庫日志的解析,實時獲取源庫的變化數據,在內部實現上主要包括日志拉取、日志解析、事務整合和數據落盤幾個步驟。

    • 日志拉取

DRS采用Oracle的Logminer接口獲取實時的redo日志,當redo歸檔后,DRS會讀取歸檔日志文件。為了防止源庫的歸檔日志被不確定性刪除,DRS會啟動日志拉取的線程(可以多線程並發)把日志拉取到本地,然后進行后續的解析。

    • 日志解析

Oracle Logminer接口獲取到的數據需要進一步解析才能獲取到實際的變化內容,DRS的日志解析線程對返回的數據進行過濾、拼接、元數據映射、轉換等操作形成一條完整的變更記錄對象。

    • 事務整合

日志解析是按照源庫變化數據的順序進行解析,解析后的每條記錄的事務是交叉混合在一起的,必須對每條記錄按照事務id進行整合才能形成一個完整的事務。另一方面對於Oracle RAC的場景,還需要對不同節點的事務進行排序,避免事務亂序的情況發生。

  • 落盤文件

經過了事務整合后,形成了一個按照源庫業務提交順序的序列,DRS會按照這個順序把這些數據寫入到磁盤文件。落盤的數據包含了源庫每一條變化數據的全部信息,包含表信息、列信息、事務信息、數據信息和其他額外信息(如時間戳、rowid等),根據這些信息后面的組件便可以把每一條變化數據還原成對象的SQL。

  • 數據回放

數據回放就是將數據抓取到的數據在目標庫進行執行的過程,但它和數據的抓取是解耦的。它讀取DRS的落盤文件,解析出每條變化的數據,根據文件中記錄的元數據信息重構出對應的SQL語句,在目標庫執行。

在數據回放之前,DRS提供了過濾和轉換的功能,可以對同步的數據進行過濾,可配置過濾條件,如只同步id < 10000的數據,也可以對同步數據的表名、schema名或列名進行映射等。

異常處理和回放性能是兩個重要的考量點,DRS通過配置數據沖突策略來處理回放中的異常數據,通過並發機制來提高裝載的性能。

    • 沖突策略

所謂的沖突是指在數據回放的時候出現了數據類報錯(如主鍵沖突、update和delete無法找到記錄等),這些報錯一版都是由於兩邊的數據不一致造成的。DRS對這類錯誤采用了三種處理策略,分別是覆蓋、忽略和等待。

覆蓋:當出現沖突時,用抓取到的數據覆蓋掉目標庫的數據

忽略:數據沖突后,直接跳過錯誤記錄,繼續執行

等待:數據沖突后,等待人工處理

    • 並發機制

DRS的並發機制采用記錄級別的並發,最大化的提升數據裝載的性能。

首先從DRS的落盤文件中讀取增量數據,按順序放入一個隊列中,並行分析引擎會從隊列中獲取每一條數據,並根據其主鍵信息判斷是否存在數據沖突,對於沒有沖突的數據說明可以並行去執行,則把這些數據分散到多個線程隊列中,當線程隊列中的數據量達到設定的閾值時,這批數據會作為一個事務在目標庫執行。對於有沖突的數據,則把這條數據放到沖突隊列,等待線程把上一批數據執行完成后,再次進入並行分析引擎判斷是否存在沖突。

 

Ps:該內容根據《GaussDB(for openGauss)數據遷移之DRS》技術直播整理完成,錯過直播的小伙伴們,歡迎點擊此處回顧精彩內容哦~

 

點擊關注,第一時間了解華為雲新鮮技術~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM