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/

 

posted on 2014-04-27 17:30  啵啵猪  阅读(4450)  评论(3编辑  收藏

导航