標籤:
一句話概括該軟體: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. Concepts1.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的開發人員寶貴的時間和經理被放到設計一個易於 安裝、配置和管理的產品,而不是花費時間在逆向資料庫記錄檔上。
基於觸發器的資料擷取方式引入了一個可以衡量資料庫操作開銷。開銷會隨著處理器的能力和配置給資料庫平台的資源還有應用使用資料庫的方式變化。隨著不斷改進的硬體和資料庫技術,基於觸發器的資料擷取對需要高資料輸送量或者需要擴充的應用來說將變得更加靈活。
基於觸發器的資料擷取比基於日誌的解決方案更容易實現和受支援。它使用眾所周知的資料庫概念,對於軟體,資料庫開發人員和資料庫管理員來說更易理解。它通常被應用Team Dev或者資料庫管理員安裝,配置和管理,本身不需要部署到資料庫伺服器上。
SymmetricDS 資料庫雙向同步開源軟體入門