SymmetricDS 數據庫雙向同步開源軟件入門


     一句話概括該軟件:SymmetricDS是一個文件和數據庫同步軟件,開源的,支持多主復制,同步時過濾和在異構的網絡環境中進行數據轉換傳輸。它支持單向和雙向上的多個訂閱者,異步的數據復制。

     以下是從CSDN專欄找到的用戶指南的翻譯,由於目前SymmetricDS的中文資料是少之又少,所以用的人也不是很多。當初公司選擇SymmetricDS,主要是因為它滿足開源免費,支持雙向同步,在使用的過程中,由於沒有什么資料,所以一切都是靠自己的摸索和探究。測試過程中也出現了一些使用上的問題,目前也都解決了,至於是什么問題,下篇博客會詳述,供出現同樣問題的同學參考。

    目前SymmetricDS的穩定性還不能考量,因為很少看到相關的資料。但是它的官網上顯示,這個軟件還在以大概7天的頻率在更新當中,版本更新是相當快的,我們公司對這個軟件也寄予厚望,希望日后能更加穩定和強大,當然是持續開源下去是最好了。

1.1.   System Requirements

SymmetricDS使用Java編寫,需要JRE或者JDK 6.0及以上版本。

任何一個擁有Trigger技術和JDBC驅動的數據庫都可能能夠使用SymmetricDS。數據庫通過Database Dialect被抽象,以支持不同的數據庫特性。下面的數據庫方言已經被包含進此發行版中(version 3.6.14):

1.      MySQL 5.0.2及以上版本

2.      MariaDB及以上版本

3.      Oracle 10g及以上版本

4.      PostgreSQL 8.2.5及以上版本

5.      Sql Server 2005及以上版本

6.      Sql Server Azure

7.      HSQLDB 2.x

8.      H2 1.x

9.      Apache Derby 10.3.2.1及以上版本

10.  IBM DB2 9.5及以上版本

11.  Firebird 2.0及以上版本

12.  Interbase 2009及以上版本

13.  Greenplum 8.2.15及以上版本

14.  SQLite 3及以上版本

15.  Sybase Adaptive ServerEnterprise 12.5及以上版本

16.  Sybase SQL Anywhere 9及以上版本

附錄C Database Notes,可以查看你選用的數據庫的兼容性問題和其他細節。

1.2.   Concepts

1.2.1 Notes

SymmetricDS是一個基於Java的應用,提供了一個同步引擎,這個引擎在數據同步中作為一個agent(代理,代理后邊說的那個數據庫實例),提供一個數據庫實例和網絡中其他同步引擎之間的數據同步。

一個SymmetricDS引擎叫做一個Node。SymmetricDS被設計為可以擴展到成千上萬個節點。屬性配置文件中提供的數據庫連接字符 串,數據庫用戶名和數據庫密碼配置數據庫連接信息。SymmetricDS可以同步數據庫連接可以訪問的任意的數據庫表,只要數據庫用戶被分配了合適的數 據庫權限。

一個SymmetricDS節點被分配一個external id和一個節點group id。External id是用戶指定的標示符,SymmetricDS使用這個標示符來標識一個特定的節點,數據被派往的節點。節點的group id用來標識節點所在的組或者層。它定義了一個節點整個網絡中所有的節點中所處的位置。例如,一個節點的組可能被命名為‘corporate’,代表一個 企業或者公司的數據庫;另一個節點的組可能被命名為“local_office”,代表一個地區不同的機構的數據庫。一個“local_office”的 external id可能是一個機構的編碼或者其他有標示性的字母組成的字符串。一個節點通過它的node id在一個網絡中被唯一的區分開,這個node id是根據external id自動生成的。如果本地機構代碼1有兩個數據庫和兩個SymmetricDS節點,它們可能有一個值為“1”的external id和值為“1-1”和“1-2”的node id。

SymmetricDS可以以多種方式部署。最常見的選擇是在作為一個獨立的進程,以服務的形式運行於服務器中。當以這種方式被部署的時 候,SymmetricDS可以作為一個客戶端或者一個多租戶的服務端,也可以依賴SymmetricDS數據庫在整個數據庫網絡中的位置而定。盡管它可 以與數據庫服務器運行在同一個服務器上,但是不需要必須這么做。SymmetricDS可以被部署到一個應用服務器中,像Apache Tomcat,JBoss Application Server,IBM WebSphere中,作為一個web應用。

SymmetricDS被設計成一個對技術人員來說,簡單,易用的工具。它可以被認為是一個web應用,只是用其他的SymmetricDS引擎作為客戶端代替瀏覽器的角色。它擁有web應用的所有特性,可以使用調試web應用的原理來調試SymmetricDS。

1.2.2. Change Data Capture

數據庫觸發器開啟SymmetricDS捕獲數據變化功能,SymmetricDS會根據用戶的配置自動安裝觸發器。數據庫觸發器記錄的數據變化都 在DATA表(DATA表是SymmetricDS中的系統表)。數據庫被設計為非侵入性的,盡可能的輕量級。在SymmetricDS觸發器被安裝之 后,外部應用執行的所有的DML statement產生的數據變化都會被捕捉。注意,用戶的應用不需要添加額外的庫,也不需要任何的更改;SymmetricDS不需要必須在線才能捕捉 數據。

SymmetricDS配置的不同數據庫實例間的數據庫表需要有相同的結構。整個網絡中的節點的配置通常在網絡中的一個中心節點管理,也就是 registration server節點。Registration Server節點幾乎總是與樹形拓撲網絡結構中的root節點是同一個。當配置一個“葉”節點,需要配置的一個啟動參數是registration server節點的URL。如果“葉”節點還沒注冊到root節點,它聯系registration server然后請求加入到網絡中。一旦請求被接受,“葉”節點就下載所需的配置。在一個節點被注冊之后,SymmetricDS也可以在開始同步之前提 供一個數據初始負載操作。

SymmetricDS將在啟動時安裝或者更新它的數據庫觸發器;當預定的同步觸發器任務運行的時候,SymmetricDS會定期地再次安裝新的 觸發器和更新原有的觸發器(默認情況下,是在每天午夜)。當決定一個觸發器是否需要被重新建立的時候,同步觸發器任務會檢測數據庫結構或者觸發器配置的變 化。可選擇地,同步觸發器任務可以被關閉,DBA可以自己生成和運行數據庫觸發器DDL腳本。

在變化的數據被數據庫觸發器插入到SymmetricDS的DATA系統表之后,這些數據被Router Job分批然后分配到某個SymmetricDS節點。路由數據指的是在SymmetricDS網絡中選擇一個數據應該發送的節點。默認情況下,一個節點 的數據根據節點組標識被路由。可選地,數據和目標節點的特性也可以在路由過程中使用。一個數據的batch是一組數據的變化。這一組數據一起被傳送和加載 到目標節點,作為一個數據庫事務提交。Batch信息記錄在SymmetricDS的OUTGOING_BATCH系統表中。Batch是節點特定的,每 個節點只有自己處理過的Batch的記錄。DATA和OUTGOING_BATCH通過DATA_EVENT聯系。Batch的發送狀態記錄在 OUTGOING_BATCH中。在數據被發送到遠程節點之后,batch的狀態被改為“OK”。

1.2.3. Change Data Delivery

數據通過HTTP或者HTTPS發送到遠程節點。數據可以通過這兩種方式中的一種發送,發送的方式依賴於配置的節點的組之間的傳輸鏈路的類型。一個 節點組可以被配置成推送變化到某個節點組中的其他節點,也可以配置成從某個節點組中的其他節點拉取數據。推送數據的操作是通過在數據源節點初始化一個 Push Job實現。如果有多個等待被發送的Batch,推送節點將通過使用同一個HTTP HEAD請求來保持同一個到各個目標節點的連接。如果預留的請求被接受,數據源節點將從batch中提取所有的數據。數據以CSV格式被提取高內存緩沖區 中,直到緩沖區大小達到配置的閥值,數據通過HTTP PUT被發送到目標節點。下一個Batch接着被提取和發送。這將一直重復直到給每一個channel發送的batch達到最大值,或者沒有batch可 以發送為止。因為所有的batch通過一個HTTP PUT請求發送,目標節點也將返回一個batch的狀態的列表。

拉取請求在目標節點通過Pull Job初始化。一個拉取請求使用HTTP GET提交方式。在Push過程中執行的提取過程也會在Pull過程中執行。

在數據被提取,發送之后,數據加載到目標節點。與提取過程相似,隨着數據不斷被接收,數據加載器將以CSV格式緩存數據到內存緩沖區中,直到達到閥 值。如果達到閥值,數據被刷寫到一個文件中然后繼續接收數據。一個batch中所有的數據都是本地可用的,一個數據庫連接從連接池中取出,然后在源數據庫 中發生的事情會在目標數據庫再次重演。

1.2.4. Data Channels

數據總是以在特定channel中記錄的順序被發送到遠程節點。一個channel是用戶定義的一組互相依賴的表。捕獲的屬於一個組的表的數據總是 一起被同步。每一個觸發器必須被分配一個channel id作為trigger定義的一部分。Channel id記錄在SymmetricDS的SYM_DATA和SYM_OUTGOING_BATCH系統表中。如果一個batch加載失敗,將不會再有數據發送 到這個channel直到這個失敗被處理。但是,其他channel上的數據將不受影響,繼續同步。

如果遠程節點離線,數據仍然在源數據庫端被記錄,直到遠程節點重新上線。可選地,可以設置一個超時時間,超過此時間,下線的節點將從網絡中刪除。 SymmetricDS捕獲的數據所在的表的數據將在被發送后或者配置的保留時間到期后從SymmetricDS存放捕獲的數據的系統表中被刪除。將要發 送到一個關閉的節點的沒有被發送的數據變化也將被清除。

SymmetricDS在數據完整性錯誤的時候的默認的處理方式是嘗試修復這些數據。如果一個插入statement執行,但是表中已經存在這樣的 一行數據,SymmetricDS將會回退插入操作然后嘗試更新已經存在的行。同樣地,如果一個在源數據庫節點上成功執行的更新操作在目標節點上執行的時 候,沒有找到要更新的行,SymmetricDS將會回退更新操作,然后將這行數據插入到數據庫中。如果在目標節點執行刪除操作,但是沒有找到要刪除的 行,這種情況將會被簡單的記錄。這些處理方式可以通過調整配置來進行沖突監測和處理。

SymmetricDS使用標准的web技術設計,所以它可以被擴展成不同數據庫類型的多個客戶端。它可以同步數據到與部署的數據庫和網絡基礎設施 支持的客戶端一樣多的客戶端節點;也可以從這么多數量的客戶端拉取數據以同步數據。當一個兩層的數據庫和網絡基礎設施不夠用的時候,一個 SymmetricDS網絡可以被設計成使用N層以產生更高的擴展性。到這我們已經介紹了SymmetricDS是什么,如何完成用標准的方式在多個數據 庫間同步數據的工作。

1.3.   Features

SymmetricDS擁有很多數據同步時你可能需要或者想要的特性。這些特性的大部分是根據SymmetricDS在生產環境中的使用反饋增加的。

1.3.1.Two-Way Table Synchronization

事實上,數據的同步通常只需要往一個方向同步。例如,一個分銷商店發送它的商品交易信息到中央數據庫,中央數據庫發送存貨信息和價格到商店。其他的 數據可能需要在雙向同步。例如,分銷商店發送中央數據庫一個存貨清單文檔,然后中央數據庫更新文檔中的數據,然后發送回商店。SymmetricDS支持 表的雙向同步,同時通過僅記錄同步之外的數據變化避免了陷入更新循環。

1.3.2. Data Channels

SymmetricDS支持數據通道的概念。數據同步被定義在表(整個表或者表的一部分數據)的層面,每一個被管理的數據庫表都被分配到一個 channel上,channel會幫助控制數據流。一個channel是一個種類的數據,一個channel的數據可以不依賴於其他的channel中 的數據被同步。例如,在一個分銷例子中,一個促銷事件可能更新很多的商品信息,但是用戶可能正在等待存貨清單文檔的更新。如果按照順序處理,商品更新將延 遲存貨清單的更新,盡管數據是沒有聯系的。通過將item表分配到item channel,inventory表分配到inventory channel,這兩個表的數據變化被分開來處理,因此inventory可以不管大量的商品數據的情況下操作數據。

Channel 將在Section3.3“Channel”中被詳細討論。

1.3.3. Change Notification

在一條數據變化記錄到數據庫中之后,對此變化感興趣的SymmetricDS節點被喚醒。Change Notification被配置為既可以執行數據push也可以執行數據pull。當幾個節點將它們的數據變化對准到一個中央節點的時候,用push的方 式代替等待中央節點從每個源數據庫pull的方式是高效的。如果網絡配置了防火牆來保護一個節點,pull配置可能使該節點可以接收到數據變化,而 push方式將會被阻塞。Change Notification的頻率是可配置的,默認是一分鍾一次。

1.3.4 HTTP(S) Transport

默認情況下,SymmetricDS以REST風格使用基於web的HTTP或者HTTPS請求的方式。這是一種輕量級並且易管理的方式。提供了一 系列的filter來強制認證和限制同時同步的數據流的數量。ITransportManager接口允許實現其他的數據傳輸方式。

1.3.5. Data Filtering and Rerouting

使用SymmetricDS,數據可以再記錄,提取和加載的時候被過濾。

1.      數據路由是通過往SymmetricDS系統表ROUTER中插入一個給定類型的router來完成的。Router負責確定捕獲到的變化應該被發往的目的節點。自定義的router可以通過實現一個IDataRouter接口來提供。

2.      除了同步,隨着同步數據加載到目標數據庫,SymmetricDS也可以完成很復雜的數據轉換。數據轉換可以被用來合並源數據,產生多個源數據的副本到多個目標數據庫表,在目標數據庫設置默認值,等等。轉換的類型可以被擴展,可以創建自定義的轉換。

3.      因為數據變化被加載到目標數據庫中,數據可以被一個簡單的shell加載過濾器過濾,也可以被一個 IDatabaseWriterFilter的實現類過濾。你可以改變一個列中的數據,然后路由改變后的數據到任何地方,觸發器初始化負載或者其他可能的 情況。一個可能的用法是可以路由信用卡數據到一個安全的數據庫然后在中央存放銷售信息的數據庫中空出來。過濾器也可以防止數據全部到達目標節點,然后在目 標節點加載數據時使用數據的默認值,這樣非常高效。

1.3.6. Transaction Awareness

很多的數據庫提供全局唯一的事務標識,跟作為一個事務一起提交的多個行相關聯。SymmetricDS隨同變化的數據一起,也存儲事務的標識,因此 SymmetricDS可以精確地回滾一個事務。這意味着,目標數據庫維護與源數據庫中相同的事務完整性。支持事務標識符的數據庫在附錄中有記錄。

1.3.7. Remote Management

管理功能通過JMX暴露出來,可以通過Java JConsole工具或者通過一個應用程序服務器訪問。功能包括打開注冊,重新加載數據,清除舊的數據和查看batch信息。很多的配置信息和運行時屬性也可以被查看。

SymmetricDS也提供了發送SQL事件的功能,跟用來發送數據的同步機制一樣。數據payload可以使任意的SQL statement。事件的處理和響應也跟其他類型的事件一樣。

1.3.8. File Synchronization

不少的SymmetricDS用戶已經發現他們不僅需要同步數據庫表到遠端,他們也有一系列的文件應該被同步。從version 3.5開始,SymmetricDS開始支持文件同步了。

請查看Section3.5 “File Trigger / File Synchronization”獲取更多的信息。

1.4 Why Database Triggers?

在關系型數據庫中,有幾種方法可以捕獲到變化的數據,以用來復制、同步和整合。

1.      Lazy data capture從源數據庫系統中使用條件(比如一個時間戳列)SQL語句查詢變化的數據。

2.      Trigger-based data capture 安裝一個數據庫觸發器來捕獲變化的數據。

3.      Log-based data capture從數據庫的恢復日志中讀取數據的變化。

上邊的三種方式都有優勢,也都有劣勢,都在SymmetricDS的開發計划中。目前,SymmetricDS支持基於觸發器的數據捕獲和不公平的 懶惰數據捕獲。首先實現這兩種技術有很多的原因,最重要的是SymmetricDS要解決的大多數的用例都能使用基於觸發器的方式解決,在某種程度上,條 件復制的方式(第一種方式)使更多的使用企業標准技術的數據庫平台被支持。這個事實使SymmetricDS的開發者寶貴的時間和經理被放到設計一個易於 安裝、配置和管理的產品,而不是花費時間在逆向數據庫日志文件上。

基於觸發器的數據捕獲方式引入了一個可以衡量數據庫操作開銷。開銷會隨着處理器的能力和配置給數據庫平台的資源還有應用使用數據庫的方式變化。隨着不斷改進的硬件和數據庫技術,基於觸發器的數據捕獲對需要高數據吞吐量或者需要擴展的應用來說將變得更加靈活。

基於觸發器的數據捕獲比基於日志的解決方案更容易實現和受支持。它使用眾所周知的數據庫概念,對於軟件,數據庫開發者和數據庫管理員來說更易理解。它通常被應用開發團隊或者數據庫管理員安裝,配置和管理,本身不需要部署到數據庫服務器上。

   


免責聲明!

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



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