一種後設資料同步的方法

KaiwuDB發表於2023-04-03

一、技術背景


在面向數字能源領域,KaiwuDB 就後設資料同步存在以下應用場景:源端執行後設資料操作語句,同時對應源端後設資料變化;這些後設資料需要在目標的一端進行同步,而實現這一目標的方法是透過 資料複製同步模組 來完成。

後設資料複製同步可以分為兩個部分:

  • 後設資料回放表的 複製模組
  • 後設資料 回放模組

本文主要介紹整個後設資料同步模組中的後半部分,即後設資料回放( metadata backfill)模組的技術實現。

二、技術基礎


1 . 後設資料回放表

此表用於記錄源端後設資料操作 SQL 語句:


表 1:後設資料回放表


2. 表級別的複製

表級別的複製是後設資料回 放的 基礎 。透過複製語法可以將源端的後設資料回放記錄表複製到目標端,在源端透過 DDL 對後設資料進行操作的語句,將會由表級別的複製傳送到目標端,完成對後設資料記錄表的複製 操作。後設資料回放模組在此表的同步基礎上,進行兩端的後設資料回放並達到後設資料同步的目的。

後設資料模組由表級別的複製呼叫觸發。在表級別的複製過程中,存在將資料寫入後設資料表的操作。選擇在資料寫入到目標端的回放表時,觸發回放模組,進行檢索並實現後設資料回放。

三、實現流程


圖 1:回放流程


1.  記錄後設資料操作語句


我們在執行後設資料操作的 SQL 語句時,在執行流程中呼叫回放表寫入介面,將 SQL 語句等其他引數記錄在後設資料回放表中。

寫入此表的資料中,生成的主鍵為當前的 portal_id(portal_id 和源端繫結,每個端的 portal_id 是不同的)和生成的 rowid 聯合主鍵。因此,縱使多個源端的語句也可以在同一目標端聚合在同一張回放表中,不會產生主鍵衝突問題。預設記錄的 SQL 語句的回放狀態為未回放狀態。

2.  放模組的啟動


回放模組的啟動是基於啟動服務時拉起一個協程。 透過啟動一個回放協程,協程中會檢測訊號 signal 作為回放模組的觸發機制。

若 signal 接收到訊號,就觸發回放模組的執行。啟動後的回放模組,等待複製模組的觸發訊號,進而觸發回放。


3.  放模組的觸發


複製模組透過複製表將源端記錄表複製到目標端。 隨著不斷的 SQL 記錄寫入回放表,表級別的複製可以將後續的 SQL 語句記錄傳送到目標端。

在目標端上,寫入回放表時透過向 signal 賦值,即向回放協程模組傳送觸發訊號,就可以在回放模組中觸發回放模組。 觸發回放模組後,就可以進行到下一步回放模組的執行。

4. 回放模組的執行


圖 2:回放執行模組


1) 獲取回放語句


透過對複製過來的源端的回放表的查詢,透過篩選查出回放表的未回放語句,查詢對應 SQL 記錄的回放狀態,從而拿到需要回放的待回放語句。

從回放表拿到的語句解析為待執行的字串語句,這些語句就是待同步在目標端執行的語句,將其傳入回放模組的下一階段,執行回放語句。

2) 執行回放語句

將獲取的待回放語句傳入執行回訪模組,利用執行模組對獲取到的語句進行執行,完成後設資料在目標端的同步執行。

執行完語句後,需要修改此條語句的回放狀態,進入更新語句的回放狀態模組。

3) 更新回放狀態


回放成功的語句,需要進入更新回放狀態模組,將記錄的語句執行成功的更新狀態為 true 已執行,下次重新獲取的語句就會跳過已經被回放過的語句。

4) 事務控制


回放模組的執行中,選擇將執行回放語句模組放入同一個事務執行,若語句回放失敗,則不進行更新狀態;若更新回放狀態失敗,則回退回放語句的執行。 放在同一個事務中,保證回放狀態和是否成功執行回放語句保持一致。

四、總結最佳化


基於複製的技術基礎,回放模組啟動後,觸發 和執行回放模組,在源端執行的後設資料操作 SQL 語句,同步到目標端進行回放,從而達到後設資料的同步。 本文講述的是一個基礎的實現思路,未來仍將有很大的最佳化空間。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027415/viewspace-2943439/,如需轉載,請註明出處,否則將追究法律責任。

相關文章