SymmetricDS是一個開源的同步軟件,該軟件是基於java環境編寫的,在運行的時候需要安裝JDK。SymmetricDS可以同步文件和數據庫,本文的重點是數據庫方面的同步。
SymmetricDS支持多種數據庫的同步,支持的數據庫如下:
Oracle, MySQL, MariaDB, PostgreSQL, MS SQL Server (including Azure), IBM DB2, H2, HSQLDB, Derby, Firebird, Interbase, Informix, Greenplum, SQLite (including Android), Sybase ASE, and Sybase ASA (SQL Anywhere) databases.
數據庫的同步可以按照計划同步,也可以實現准實時同步。
SymmetricDS是如何抓取源數據庫的數據的變化然后再同步到目標數據庫呢?
官方文檔上介紹了三種方式來捕捉數據的變化:
• Lazy data capture queries changed data from a source system using some SQL condition (like a
time stamp column).
通過sql的查詢來捕捉數據的變化,比如說通過時間戳的變化來捕捉變化的數據。
• Trigger-based data capture installs database triggers to capture changes.
通過在數據庫中建立觸發器來捕捉每張表的數據的變化。(在部署SymmetricDS的時候,所選中的需要同步的表,會由SymmetricDS自動建立觸發器來捕捉該表中數據的更新,插入以及刪除。)
• Log-based data capture reads data changes from proprietary database recovery logs.
基於日志的數據變化。通過讀取數據庫中日志的變化來捕捉變化的數據。
所有以上三個方面都有自己的優勢和缺點,並且以上三種捕捉數據變化的方式,SymmetricDS在將來都會實現。但在目前,SymmetricDS只支持前兩種方式來捕捉數據的變化。
下面通過一個官方的一個demo來實現sql server 到 Mysql的同步功能,該Demo是corp和store之間的同步,即公司和商店之間的數據庫的同步。
一 安裝並配置SymmetricDS
1.首先,從http://www.symmetricds.org/ 下載symmetric-ds-3.x.x-server.zip 文件。
2.在本地建立兩個文件夾以此來代表兩台機器。一個文件夾安裝corp的SymmetricDS軟件,另一個文件夾下也安裝SymmetricDS軟件代表store。
然后拷貝下載的symmetric-ds-3.x.x-server.zip文件分別到這兩個文件夾下,並解壓縮到當前文件夾到這兩個文件夾下。
3.拷貝配置文件到相應路徑下。
從F:\sync\sym-corp\samples路徑下拷貝corp-000.properties到F:\sync\sym-corp\engines下,同樣在F:\sync\sym-store001\samples下拷貝store-001.properties到F:\sync\sym-store001\engines下。
4.修改配置文件使SymmetricDS連接到數據庫。
Corp的配置:
打開F:\sync\sym-corp\engines下的corp-000.properties,可以看到里面都是數據庫連接的配置。
第22行 :engine.name=corp-000,這個是該engine的名字。
我這個demo中,公司的數據庫是sql server,那么在這個文件中的配置應該如下:
1 #數據庫驅動的類名 2 3 db.driver=net.sourceforge.jtds.jdbc.Driver 4 5 #jdbc連接 6 7 db.url=jdbc:jtds:sqlserver://localhost:1433/corp000;useCursors=true;bufferMaxMemory=10240;lobBuffer=5242880 8 9 #數據庫的登陸賬號 10 11 db.user=sa 12 13 #數據庫的登陸密碼 14 15 db.password=Administrator 16 17 #主節點的注冊地址 18 registration.url= 19 sync.url=http://localhost:8050/sync/corp-000 20 21 #設置的group id 22 23 group.id=corp 24 25 #分配的一個ID 26 external.id=000
store的配置:
打開F:\sync\sym-store001\engines下的store-001.properties,可以看到里面都是數據庫連接的配置。
第22行 :engine.name=store-001,這個是該engine的名字。
我這個demo中,公司的數據庫是sql server,那么在這個文件中的配置應該如下:
1 #數據庫驅動的類名 2 3 db.driver=com.mysql.jdbc.Driver 4 #jdbc連接 5 6 db.url=jdbc:mysql://localhost/store001 7 #數據庫的登陸賬號 8 9 db.user=root 10 #數據庫的登陸密碼 11 12 db.password=root 13 #需要連接主節點的SymmetrcDS來注冊,只有注冊通過之后,才能同步 14 registration.url=http://localhost:8050/sync/corp-000 15 #設置的group id 16 17 group.id=store 18 19 #分配的一個ID 20 external.id=001
二 建立數據庫並創建相應的業務表和系統表
△ 配置corp000的數據庫信息
1.打開命令窗口並定位到F:\sync\sym-corp\bin路徑下
2.建立業務表
在cmd窗口中輸入以下命令,並按回車:
dbimport --engine corp-000 --format XML F:\sync\sym-corp\samples\create_sample.xml
以上命令代表運行bin路徑下的 dbimport.bat並調用engine路徑下的corp-000.properties配置文件,並執行F:\sync\sym-corp\samples路徑下的create_sample.xml腳本,在執行之后會在sql server的corp數據庫中創建四張以下表:
item,item_selling_price,sale_return_line_item,sale_transaction
3.在corp數據庫中創建SymmetricDS的系統表
因SymmetricDS的運行需要一些系統表來裝載數據同步的相關信息,因此需要創建一些SymmetricDS需要的系統表。
在cmd窗口中繼續輸入以下命令,並按回車:
symadmin --engine corp-000 create-sym-tables
在執行以上命令之后會在sql server的corp數據庫中創建多張以sym_ 開頭的SymmetricDS的系統表。
4.最后,需要在業務表中插入一些數據以做同步測試用。
繼續在cmd命令窗口中運行以下命令:
dbimport --engine corp-000 F:\sync\sym-corp\samples\insert_sample.sql
△ 配置store001的數據庫信息
1.另外打開一個cmd窗口(上面那個cmd窗口先開着,后邊會用到,就不需要重新打開了),定位到F:\sync\sym-store001\bin路徑下。
2.在cmd窗口中運行以下命令以創建與corp一樣的業務表
dbimport --engine store-001 --format XML F:\sync\sym-store001\samples\create_sample.xml
以上corp和store的相關表的配置已經完成,請確認corp和store的數據庫的以下相關信息:
1.從corp數據庫向store數據庫同步的以下兩張表是否在兩個數據庫中都存在:
item , item_selling_price
2.從store向corp數據庫同步的以下兩張表是否在兩個數據庫中都存在:
sale_transaction , sale_return_line_item
3.在corp數據庫中,是否存在以sym_開頭的系統表,比如sym_channel,sym_trigger, sym_router, 和 sym_trigger_router表。
4.確認corp數據庫中的item表中有測試數據。
三 啟動SymmetricDS並同步數據
1.上一步驟中,我們打開了兩個cmd的窗口,分別將路徑定位到F:\sync\sym-corp\bin和F:\sync\sym-store001\bin,如果關閉的話,請重新打開兩個cmd命令窗口,並將路徑定位到corp和store的bin文件夾路徑下,以代表corp機器和store機器。
2.在corp的cmd窗口中,運行以下命令:
sym --engine corp-000 --port 8050
以上命令在第一次運行的時候,將會對相應的需要同步的表在數據庫中建立觸發器,可以查看數據庫中的該表的觸發器。如下圖所示,建立了三個觸發器來捕捉該表的數據的刪除,插入和更新操作。
之后,SymmetricDS將會監聽8050端口,來監聽同步的請求和向corp發來注冊請求的信息。
3.在store的cmd窗口中,運行以下命令:
sym --engine store-001 --port 8010
在store機器上第一次運行以上命令時,將會自動創建SymmetricDS的系統表,然后會根據F:\sync\sym-store001\engines下的store-001.properties中的registration.url來取得主機的注冊地址(即corp的注冊地址),並一直向該url發送注冊請求。
四 注冊節點
當一個沒有注冊的節點啟動后,它將會嘗試根據engines文件下的*.properties中的registration.url向該url發送注冊信息,只有注冊之后才能夠同步數據。但是root節點(這兒是corp節點)的注冊功能並沒有打開,所以需要打開root節點的注冊功能才可以接收注冊請求。
1.在上一步驟中,我們打開了兩個cmd窗口分別代表corp節點和store節點,上一步中,現在store節點每隔一定時間就嘗試向corp節點發送注冊信息,因為corp的注冊功能並沒有打開,所以store節點的注冊請求一直失敗,請看下圖中的最后一行:RegistrationService - Could not register. Sleeping for 28000 ms before attempting again.
現在打開第三個cmd命令窗口,並定位到F:\sync\sym-corp\bin,然后運行以下命令:
symadmin --engine corp-000 open-registration store 001
以上命令是運行bin文件下的sysadmin命令,並調用engine文件下的corp-000配置文件,對group node為store,編號為001的節點打開注冊窗口。
然后查看store節點的cmd窗口的輸出,發現注冊成功。
五 初始化數據
1.打開一個cmd窗口,定位到corp的F:\sync\sym-corp\bin 路徑下,運行以下命令:
symadmin --engine corp-000 reload-node 001
以上命令就是將數據從corp節點上初始化到 編號為001的節點上,初始化之后,可以在store節點上的數據庫中的item和item_selling_price表中查找到數據。
2.在corp節點pull data到store節點
打開sql server的corp庫,並運行以下sql:
1 insert into item (item_id, name) values (110000055, 'Soft Drink'); 2 insert into item_selling_price (item_id, store_id, price) 3 values (110000055, '001',0.65); 4 insert into item_selling_price (item_id, store_id, price) 5 values (110000055,'002', 1.00);
運行完畢之后,可以查看mysql上的store庫的item和item_selling_price表,數據已經同步過去了。
在以上sql的第4行和第5行,是一條insert語句,因為其插入的是002節點,而store是配置的001節點,所以這條數據並未插入到mysql的store數據庫中,而corp節點並未找到002節點,因此該條數據被丟棄。
從corp節點往store節點是用pull的方式同步數據的,即corp節點有新的數據插入后,並不主動同步到store節點,而是等待store節點來取數據。
3.store節點push data到corp
在mysql的store庫中,打開一個查詢窗口,運行以下代碼:
1 insert into sale_transaction (tran_id, store_id, workstation, day, seq) values 2 (1000, '001', '3', '2007-11-01', 100); 3 insert into sale_return_line_item (tran_id, item_id, price, quantity) values 4 (1000, 110000055, 0.65, 1);
數據將會同步到corp節點。當store數據庫中的表插入新的數據時,數據將會主動push到corp節點。
先寫到這兒吧,寫了一下午,歇歇了,如果有人關注這個軟件的話,有時間再繼續寫吧。如果有不對的地方,請指正O(∩_∩)O~
歡迎轉載,轉載請注明轉載地址:http://www.cnblogs.com/bobozhu/