一句話歸納該軟件:SymmetricDS是一個文件和數據庫同步軟件,開源的,支持多主複製,同步時過濾和在異構的網絡環境中進行數據轉換傳輸。它支持單向和雙向上的多個訂閱者,異步的數據複製。node
如下是從CSDN專欄找到的用戶指南的翻譯,因爲目前SymmetricDS的中文資料是少之又少,因此用的人也不是不少。當初公司選擇SymmetricDS,主要是由於它知足開源免費,支持雙向同步,在使用的過程當中,因爲沒有什麼資料,因此一切都是靠本身的摸索和探究。測試過程當中也出現了一些使用上的問題,目前也都解決了,至因而什麼問題,下篇博客會詳述,供出現一樣問題的同窗參考。
web
目前SymmetricDS的穩定性還不能考量,由於不多看到相關的資料。可是它的官網上顯示,這個軟件還在以大概7天的頻率在更新當中,版本更新是至關快的,咱們公司對這個軟件也寄予厚望,但願往後能更加穩定和強大,固然是持續開源下去是最好了。shell
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,能夠查看你選用的數據庫的兼容性問題和其餘細節。
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。
數據庫觸發器開啓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」。
數據經過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中全部的數據都是本地可用的,一個數據庫鏈接從鏈接池中取出,而後在源數據庫 中發生的事情會在目標數據庫再次重演。
數據老是以在特定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是什麼,如何完成用標準的方式在多個數據 庫間同步數據的工做。
SymmetricDS擁有不少數據同步時你可能須要或者想要的特性。這些特性的大部分是根據SymmetricDS在生產環境中的使用反饋增長的。
事實上,數據的同步一般只須要往一個方向同步。例如,一個分銷商店發送它的商品交易信息到中央數據庫,中央數據庫發送存貨信息和價格到商店。其餘的 數據可能須要在雙向同步。例如,分銷商店發送中央數據庫一個存貨清單文檔,而後中央數據庫更新文檔中的數據,而後發送回商店。SymmetricDS支持 表的雙向同步,同時經過僅記錄同步以外的數據變化避免了陷入更新循環。
SymmetricDS支持數據通道的概念。數據同步被定義在表(整個表或者表的一部分數據)的層面,每個被管理的數據庫表都被分配到一個 channel上,channel會幫助控制數據流。一個channel是一個種類的數據,一個channel的數據能夠不依賴於其餘的channel中 的數據被同步。例如,在一個分銷例子中,一個促銷事件可能更新不少的商品信息,可是用戶可能正在等待存貨清單文檔的更新。若是按照順序處理,商品更新將延 遲存貨清單的更新,儘管數據是沒有聯繫的。經過將item表分配到item channel,inventory表分配到inventory channel,這兩個表的數據變化被分開來處理,所以inventory能夠無論大量的商品數據的狀況下操做數據。
Channel 將在Section3.3「Channel」中被詳細討論。
在一條數據變化記錄到數據庫中以後,對此變化感興趣的SymmetricDS節點被喚醒。Change Notification被配置爲既能夠執行數據push也能夠執行數據pull。當幾個節點將它們的數據變化對準到一箇中央節點的時候,用push的方 式代替等待中央節點從每一個源數據庫pull的方式是高效的。若是網絡配置了防火牆來保護一個節點,pull配置可能使該節點能夠接收到數據變化,而 push方式將會被阻塞。Change Notification的頻率是可配置的,默認是一分鐘一次。
默認狀況下,SymmetricDS以REST風格使用基於web的HTTP或者HTTPS請求的方式。這是一種輕量級而且易管理的方式。提供了一 系列的filter來強制認證和限制同時同步的數據流的數量。ITransportManager接口容許實現其餘的數據傳輸方式。
使用SymmetricDS,數據能夠再記錄,提取和加載的時候被過濾。
1. 數據路由是經過往SymmetricDS系統表ROUTER中插入一個給定類型的router來完成的。Router負責肯定捕獲到的變化應該被髮往的目的節點。自定義的router能夠經過實現一個IDataRouter接口來提供。
2. 除了同步,隨着同步數據加載到目標數據庫,SymmetricDS也能夠完成很複雜的數據轉換。數據轉換能夠被用來合併源數據,產生多個源數據的副本到多個目標數據庫表,在目標數據庫設置默認值,等等。轉換的類型能夠被擴展,能夠建立自定義的轉換。
3. 由於數據變化被加載到目標數據庫中,數據能夠被一個簡單的shell加載過濾器過濾,也能夠被一個 IDatabaseWriterFilter的實現類過濾。你能夠改變一個列中的數據,而後路由改變後的數據到任何地方,觸發器初始化負載或者其餘可能的 狀況。一個可能的用法是能夠路由信用卡數據到一個安全的數據庫而後在中央存放銷售信息的數據庫中空出來。過濾器也能夠防止數據所有到達目標節點,而後在目 標節點加載數據時使用數據的默認值,這樣很是高效。
不少的數據庫提供全局惟一的事務標識,跟做爲一個事務一塊兒提交的多個行相關聯。SymmetricDS隨同變化的數據一塊兒,也存儲事務的標識,所以 SymmetricDS能夠精確地回滾一個事務。這意味着,目標數據庫維護與源數據庫中相同的事務完整性。支持事務標識符的數據庫在附錄中有記錄。
管理功能經過JMX暴露出來,能夠經過Java JConsole工具或者經過一個應用程序服務器訪問。功能包括打開註冊,從新加載數據,清除舊的數據和查看batch信息。不少的配置信息和運行時屬性也能夠被查看。
SymmetricDS也提供了發送SQL事件的功能,跟用來發送數據的同步機制同樣。數據payload可使任意的SQL statement。事件的處理和響應也跟其餘類型的事件同樣。
很多的SymmetricDS用戶已經發現他們不只須要同步數據庫表到遠端,他們也有一系列的文件應該被同步。從version 3.5開始,SymmetricDS開始支持文件同步了。
請查看Section3.5 「File Trigger / File Synchronization」獲取更多的信息。
在關係型數據庫中,有幾種方法能夠捕獲到變化的數據,以用來複制、同步和整合。
1. Lazy data capture從源數據庫系統中使用條件(好比一個時間戳列)SQL語句查詢變化的數據。
2. Trigger-based data capture 安裝一個數據庫觸發器來捕獲變化的數據。
3. Log-based data capture從數據庫的恢復日誌中讀取數據的變化。
上邊的三種方式都有優點,也都有劣勢,都在SymmetricDS的開發計劃中。目前,SymmetricDS支持基於觸發器的數據捕獲和不公平的 懶惰數據捕獲。首先實現這兩種技術有不少的緣由,最重要的是SymmetricDS要解決的大多數的用例都能使用基於觸發器的方式解決,在某種程度上,條 件複製的方式(第一種方式)使更多的使用企業標準技術的數據庫平臺被支持。這個事實使SymmetricDS的開發者寶貴的時間和經理被放到設計一個易於 安裝、配置和管理的產品,而不是花費時間在逆向數據庫日誌文件上。
基於觸發器的數據捕獲方式引入了一個能夠衡量數據庫操做開銷。開銷會隨着處理器的能力和配置給數據庫平臺的資源還有應用使用數據庫的方式變化。隨着不斷改進的硬件和數據庫技術,基於觸發器的數據捕獲對須要高數據吞吐量或者須要擴展的應用來講將變得更加靈活。
基於觸發器的數據捕獲比基於日誌的解決方案更容易實現和受支持。它使用衆所周知的數據庫概念,對於軟件,數據庫開發者和數據庫管理員來講更易理解。它一般被應用開發團隊或者數據庫管理員安裝,配置和管理,自己不須要部署到數據庫服務器上。