SymmetricDS 異構數據庫同步軟件部署案例


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/

 


免責聲明!

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



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