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