一款資料庫比較與同步軟體的設計與實現

janezhou6801sina發表於2019-03-12

1 、開發背景

我是做軟體開發的,在專案實施過程中,經常遇到系統對接問題,需要將一個系統的資料同步到另一個系統,即需要做資料庫的同步。

搜遍了各大網路,未找到適合的解決方案。現有的資料庫系統,大多數只支援同型資料庫之間的同步,不支援異型資料庫同步,而現實中的資料庫種類很多,相互間都可能需要同步;其它同步軟體又太複雜,需要配置的東西太多,不適合交付給普通客戶使用。

乾脆,自己動手開發了這款 DBSync 軟體,用於各種資料庫之間的比較與同步,且力求簡單實用。

2 、設計思想

傳統的資料庫同步,一般使用快照 + 事務日誌的工作模式。用大白話來說,就是先把源資料整個複製到目標庫,使得雙方具有相同的起點;再啟動監測程式,隨時監測源資料的變化,一旦有更新操作(即事務),就將事務傳遞至目標庫,在目標庫中實施同樣的更新,從而使得雙方保持一致。

不同的資料庫系統,事務日誌的格式不同,按照這個模式設計的同步軟體,只適用於同型別資料庫的同步,如 SQL Server SQL Server Oracle Oracle 等。 DbSync 採取不同的同步策略,不再捲入具體的事務,而是直接訪問事務的結果,即直接訪問資料,透過掃描比較雙方資料,找到相互間的差異,再將差異部分同步過去。按照這個模式, DbSync 就具有廣泛的通用性,能用於各種資料庫之間的同步。因為,無論什麼樣的資料庫,也無論它怎麼工作,最終的結果無非就是資料。

3 、功能及技術要點

3.1 使用 ADO.Net OleDbConnection 連線資料庫,因此能連線各資料來源,包括 Access SQL Server Oracle MySQL DB2 等常規資料庫,也包括 Excel txt csv 等檔案資料來源。

3.2 既支援相同型別資料庫之間的同步,如 Access Access SQL Server SQL Server ,又支援異型資料庫之間的同步,如 Excel Access Access SQL Server SQL Server Oracle 等。

3.3 以任務為同步的基本單位,一個任務負責一對資料表之間的同步,多個資料表間的同步設定多個任務即可。

3.4 任務採取執行緒的方式執行,可併發啟動、執行多個執行緒,因此可併發執行多個同步任務。

3.5 任務可設定為自動重複執行,只需預先設定好時間間隔,即可長期自動執行,從而實現無人值守同步。最短時間間隔可設定為 1 秒,幾乎等同於實時同步。

3.6 提供斷點續傳能力,當同步中斷後,再次同步時能從中斷位置繼續同步,避免每次都從頭開始。

3.7 提供單獨的資料比較功能,可對比兩份資料,突出顯示改動條目,修改情況一目瞭然。

4 、使用方法

4.1 主介面介紹

開啟軟體後進入主介面,顯示同步任務列表,如下圖所示:

1 DBSync 主介面

說明:

●資料比較: Click 任務列表中的“○”按鈕,可比較雙方資料,突出顯示改動條目。

●資料同步: Click 任務列表中的“ ”按鈕,立即開始同步。

●執行狀態:實時顯示同步進度資訊,包括:已掃描的記錄數、已同步(增刪改)的記錄數等。

●開始時間、結束時間、下次開始時間:顯示每個任務執行的時間資訊。

●日誌: Click 任務列表中的“檢視”按鈕,可檢視該任務的操作歷史、同步歷史。

●設定: Click 任務列表中的“修改”按鈕,可修改任務設定。

4.2 同步任務設定

軟體預設了 3 個同步任務,用作示範。要同步自己的資料,您必須根據自己的需要設定任務,指定源資料表、目標資料表,以及同步方式、同步頻度等。 Click 主介面上的“新增”按鈕,即可新增一個同步任務,進入 Step1

Step1 :選擇源資料庫、目標資料庫

首先要指定源資料庫、目標資料庫,如下圖所示:

2 DBSync 選擇資料庫

說明:本介面的用途是設定源資料庫及目標資料庫的連線字串,使得 DBSync 能連線雙方資料庫。其中,介面上打星號( * )的欄位是必填的。填寫完成後,請 Click 標籤 2 ,進入 Step2

Step2 :選擇源資料表、目標資料表

 

3 DBSync 選擇資料表

說明:本介面的用途是選擇源資料表及目標資料表。選擇完成後,請 Click 標籤 3 ,進入 Step3

Step3 :選擇欄位對應關係

 

4 DBSync 選擇欄位對應關係

說明:本介面的用途是選擇欄位對應關係,即:源欄位以及對應的目標欄位。如果您需要做增量同步,這裡必須選擇主鍵欄位。主鍵欄位是記錄的唯一標誌,它用於判別同步雙方是否存在對應記錄。選擇完成後,請 Click 標籤 4 ,進入 Step4

Step4 :選擇同步方式及頻度

 

5 DBSync 同步方式及頻度

說明:本介面的用途是選擇同步方式及頻度。

1 )同步方式:

●全部新增( Insert )至目標表:是指將源資料表中的資料全部 Insert 到目標資料表。

●僅同步增量資料:是指以主鍵欄位為記錄標識,查詢相互間的差異,只同步差異部分(即增量部分),而相同部分不同步。

2 )執行頻度:

●手動點選“開始”執行:是指每次同步都由使用者 Click 任務列表中的“ ”來執行。

●手動,然後自動重複執行:是指由使用者 Click ”開始第一次執行,同步結束後,程式會按照預定時間間隔自動重複執行。只要程式不關閉,同步操作就會一直持續下去,從而實現無人值守同步。

3 )同步範圍:

屬於高階選項,可填寫 Select * From...Where... 形式的 SQL 語句,每次同步前會執行,用於進一步限定參與同步的資料範圍。

4 )同步後處理:

屬於高階選項,可填寫 Update SQL 語句,每次同步後會執行,用於資料回寫、資料轉換、公式計算等額外任務。

4.3 資料比較介面

設定好同步任務後, Click 任務列表中的“○”按鈕,進入掃描與比較介面,如下圖所示:

6 DBSync 掃描與比較介面

說明:本介面的用途是比較雙方資料,找出資料差異(即增量)。該介面不實施同步,僅展示增量資料,其中的紅色部分為已修改欄位,移動滑鼠過去能顯示修改前的原值。

5 、核心演算法及提速措施

資料庫產品的一個重要指標就是速度,同步軟體也不例外。同步一般分兩個步驟:先快照或複製過去,再監測更新並同步更新。前者類似於檔案複製,是最初的一次性的動作;後者是長期的隨時要做的動作,因此,重點在於更新速度。

傳統同步軟體透過事務日誌進行更新,雖然不通用,但速度快,幾乎是實時同步的效果; DBSync 使用掃描比較判斷更新,雖然通用,但速度可能較慢。為此, DBSync 提供一種機制,使得每次同步僅掃描比較增量資料,從而大幅提速。

為了深入理解提速原理,我們先了解一下掃描比較的核心演算法:首先, DBSync 會讀取雙方的資料,並按主鍵欄位排序;然後,以主鍵欄位值為記錄標識,依次比較雙方的記錄。對於源資料表存在而目標表不存在的記錄,視作新增增量;對於目標資料表存在而源資料表不存在的記錄,視作刪除增量;對於源資料表與目標資料表均存在的記錄,則繼續比較其它欄位,其它欄位有差異的,視作修改增量;無差異的,則為相同資料。

一般來說,同步是定期重複執行的,兩次同步間的增量非常有限,絕大部分是未變化的相同資料。比如,一個記錄數為百萬級的資料表,如果每 5 秒同步一次, 5 秒內的增量是很少的,通常也就幾十條記錄,與百萬級總量相比幾乎是忽略不計的。因此,簡單的全表掃描比較會浪費大量時間,提速思路就是排除相同資料的無意義比較,僅掃描比較增量資料。具體措施:

5.1 在源資料庫中建立一個表,用於記錄每次同步的完成時間,例如:表名 DBSync ,含一個欄位 SyncDate ,其中的 SyncDate 初始化為一個很小的值,如: 1900-1-1

5.2 對於新增、修改增量,單獨用一個任務來執行,並在 Step4 設定回寫 SQL ,向源資料庫寫入同步完成時間,如: UPDATE DBSync set SyncDate=getdate() ;再限定源資料範圍,如: SELECT a.* FROM Customer AS a, DBSync AS b where a.CreateTime>=b.SyncDate or a.UpdateTime>=b.SyncDate 。如下圖所示:

7 DBSync 限定掃描範圍

這樣,第一次同步會全表掃描比較,以後同步就根據 SyncDate 僅提取增量資料,掃描比較的數量就大幅減少,速度自然也大幅提升。

利用此方案,需要注意的是,源資料表必須有 CreateTime UpdateTime 欄位,分別記有資料的新增時間、修改時間。

5.3 對於刪除增量,用另一個任務來執行。由於該任務只比較雙方的主鍵,不比較其它欄位,即使不限定資料範圍,速度也很快。

6 、效能測試報告

測試環境:最普通的電腦,雙核 CPU E7500 ,主頻 2.75G ,記憶體 2G

資料庫情況:源資料庫、目標資料庫均為 SQL Server ,位於同一臺電腦上;源資料表、目標資料表均為 Customer 表,均含 10 個欄位、 100 萬條資料;源資料表含有增、刪、改資料各 100 條,共 300 條增量。

任務設定情況:按照上述提速策略,安排 2 個任務來進行,任務 4 用於同步源資料庫中的新增、修改增量,任務 5 用於同步刪除增量。

任務執行結果:截圖如下:

8 DBSync 速度測試

說明:對於新增、修改增量的同步, 4 秒鐘完成;對於刪除增量的同步, 6 秒鐘完成。

 

結論: DBSync 的優點是支援各種資料庫,簡單易用。缺點是速度稍慢,記錄數為百萬級的資料庫同步,一般需要數秒鐘才能完成;千萬級的,約 1 分鐘才能完成;億級的,約數分鐘才能完成。另外, DBSync 只同步資料,不同步索引、觸發器、儲存過程等其它設定。

 


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

相關文章