一款資料庫比較與同步軟體的設計與實現
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 磁碟資料庫與記憶體資料庫的特點比較資料庫記憶體
- Redis 設計與實現:資料庫Redis資料庫
- influxdb與傳統資料庫的比較UX資料庫
- Redis 設計與實現 (五)--多機資料庫的實現Redis資料庫
- 《redis設計與實現》2-資料庫實現篇Redis資料庫
- RedisSyncer同步引擎的設計與實現Redis
- 區塊鏈與分散式資料庫的比較區塊鏈分散式資料庫
- PostgreSQL與Rust的聚合實現比較SQLRust
- 分散式時序資料庫QTSDB的設計與實現分散式資料庫QT
- swoole 的練習 demo(6)- 資料庫設計與實現資料庫
- Redis設計與實現閱讀總結(二)單機資料庫的實現Redis資料庫
- 深度解讀MRS IoTDB時序資料庫的整體架構設計與實現資料庫架構
- 如何高效實現 MySQL 與 elasticsearch 的資料同步MySqlElasticsearch
- 淺析pplx庫的設計與實現。
- 訊息佇列中介軟體的選型與比較佇列
- Xflow軟體與傳統CFD軟體比較有哪些優勢
- 探索Redis設計與實現9:資料庫redisDb與鍵過期刪除策略Redis資料庫
- 主流資料庫比較資料庫
- 圖資料庫比較資料庫
- 如何實現一個資料庫的 UDF?圖資料庫 NebulaGraph UDF 功能背後的設計與思考資料庫
- 《Redis設計與實現》筆記 -- 資料結構與物件Redis筆記資料結構物件
- [原始碼和文件分享]資料庫敏感資料加解密系統的設計與實現原始碼資料庫解密
- 一文了解資料庫高可用容災方案的設計與實現資料庫
- Python 與 PHP:2024 年程式設計前景比較PythonPHP程式設計
- Java非同步程式設計:CompletableFuture與Future的對比Java非同步程式設計
- MRAM與常用計算機記憶體的效能比較計算機記憶體
- BST查詢結構與折半查詢方法的實現與實驗比較
- 《redis設計與實現》1-資料結構與物件篇Redis資料結構物件
- 《Linux核心設計與實現》學習【5】—— 核心同步Linux
- 開源資料庫中介軟體-MyCa初探與分片實踐資料庫
- 資料庫設計原則與方法資料庫
- 鮑勃大叔實錘:類與資料結構的比較!每個優秀的軟體設計師和架構師都需要牢記的問題資料結構架構
- RocketMQ(十):資料儲存模型設計與實現MQ模型
- Titan 的設計與實現
- LFU 的設計與實現
- Java實體對映工具MapStruct 與BeanUtils效能比較JavaStructBean
- 第03講:Flink 的程式設計模型與其他框架比較程式設計模型框架
- 單點登入原理與技術實現比較