數據庫同步的一些想法

數據同步的關鍵在於捕獲數據變化,提取數據,網絡傳輸至接收落地。一般的,數據庫內部機制以集羣的方式,通過複製進行同步,當然也有的提供更高級的服務。下面以 Oracle 和 MySQL 爲例,說明數據庫內部有哪些機制可以發現數據變化。

捕獲數據變化

  • 觸發器,這是最簡單直接的方式,優點是編程簡單,缺點是具有一定的侵入性,此外還要注意 MySQL 5.7 之前一個表不支持多個觸發器;

  • Oracle Streams - 一個靈活的複製工具,它能捕獲 DML 和 DDL 操作,通過網絡傳輸變更,原理是基於 redo log 日誌,分析出變更的數據提供給捕獲進程,Oracle 11g JDBC 就提供了數據庫變更捕獲的 API 支持;

  • Oracle Materialized View - 物化視圖,也可用於複製數據,Oracle 通過在對主表進行更改後刷新物化視圖的數據,刷新方法有增量(快速刷新)和完全,也可按需或定期刷新;

  • MySQL binlog - 記錄了所有 DML 和 DDL 語句,主要用於主從複製和數據恢復。基於日誌分析、挖掘數據變化,可減少系統開銷,不具有侵入性。

利用 Java 實現思路

有時候數據庫提供的同步滿足不了需求,一些場景需要使用應用程序來同步數據,比如信息整合,網間數據交換,不只是數據庫同步,部分也有文件同步的需求。

基於觸發器的實現

通常將表的增刪改記錄到一箇中間表中,應用程序定時掃描中間表,抽取數據。

基於日誌的實現

難點在於如何通過應用程序發現數據變化和日誌解析。

  • 對於 MySQL 它的協議和日誌格式都是開源的,可通過僞裝成從節點,與主節點通信來獲取變化數據的日誌,解析還原成 SQL 再次執行,達到複製的目的;
  • 對於 Oracle,雖然高版本已經提供了 API,但爲了通用性,還是得實現日誌的解析,只不過它的日誌說明文檔有限,需要大量的測試尋找規律,此外,數據變化也可通過檢查 checkpoint 來得知。

文件同步

文件變化的監控,無非就是大小和修改時間的比較,這個和平臺關聯比較大,比如文件拷貝,Linux 下文件大小一直變化,而 Windows 下則直接是實際大小。還有多進程並行讀寫文件的問題,Windows 文件系統默認進程獨佔文件,同時只能有一個進程讀寫,而 Linux 下的文件默認不是強制鎖定,對強制鎖定也支持有限,況且用戶使用的 Linux 版本也比較多樣化,也只能在應用層面進行控制。

小結

整體來講,實現一個同步軟件,技術上難度不大,一些細節可能要花費時間琢磨,更多的是關注性能和可擴展性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章