本文主要内容是对SymmetricDS-3.7.16版本的快速入门指南的翻译,并做了部分修改,用于快速了解SymmetricDS并利用其实现两数据库的同步。
SymmetricDS,利用数据库的触发器捕捉数据库变化来实现数据库同步,可以有两个节点或多个节点,可实现同服务器不同数据库同步或不同服务器数据库同步。基本模型如图所示。图中有一个主节点001和两个节点001、002,当主节点和各个节点连通后,由各个节点实现数据的推、拉,主节点不对数据进行操作,只负责管理。
1、系统环境
- 下载并安装java SE 6及以上版本
- 下载SymmetricDS
- Windows, Linux, Solaris, HP-UX, AIX, Mac OS X, 或 Android 操作系统
2、配置
- 连接源数据库
将下载的SymmetricDS解压至指定目录,例如D:/corp/目录下。
在SymmetricDS 中engines目录下创建xxx.properties的文件,xxx为主节点名称,例如homeoffice, central, server等,文件内容包括以下属性。
-
engine.name=节点专属名称,例如corp-000
-
group.id=节点组id,与节点id相匹配,例如corp
-
external.id=节点id,例如000
-
sync.url=同步url,格式如:http://{hostname}:{port}/{webcontext}/sync/{engine.name}
-
registration.url=注册url,配置主节点时,该项设置为空
-
db.driver=数据库驱动
-
db.url=数据库url
-
db.user=数据库用户名
-
db.password=数据库密码
- 连接目标数据库
将SymmetricDS解压至指定目录,例如D:/store/目录下。
配置如上,需要注意的是属性中
registration.url=必须与连接源数据库配置文件中sync.url属性值一致
3、创建数据库
步骤2中主要说明主节点和子节点属性文件的格式,也可以直接采用samples目录下的文件corp-000.properties、store-001.properties和store-002.properties,第一个为主节点,后两个为节点,修改其中部分属性即可。
根据主节点和子节点属性文件创建数据库和数据库用户,并为用户分配权限,这里最好拥有数据库所有权限。
在主节点服务器上,打开系统命令窗口,定位至SymmetricDS bin目录下,这里即D:/corp/symmetric-server-3.7.16/bin/,依次执行以下命令
- 创建数据库表
dbimport --engine corp-000 --format XML --alter-case create_sample.xml
- 创建系统表
symadmin --engine corp-000 create-sym-tables
- 插入原始数据
dbimport --engine corp-000 insert_sample.sql
其中,create_sample.xml和insert_sample.sql文件在samples目录下。
在子节点服务器上,打开系统命令窗口,定位至SymmetricDS bin目录下,这里即D:/store/symmetric-server-3.7.16/bin/,执行以下命令
dbimport --engine store-001 --format XML --alter-case create_sample.xml
4、启动SymmetricDS
在主节点服务器上,以8080端口监听数据库,命令窗口执行命令
sym --engine corp-000 --port 8080
在子节点服务器上,以9090端口监听数据库,命令窗口执行命令
sym --engine store-001 --port 9090
启动成功后,命令行提示Started SymmetricDS。5、注册并重新加载节点
在主节点服务器上,命令窗口依次执行命令
symadmin --engine corp-000 open-registration store 001
symadmin --engine corp-000 reload-node 001
现在,配置并启动SymmetricDS的操作完成了,可通过以下几方面查看数据库是否正确:
- 查看条目表(包括item、item_selling_price)是否从corp节点同步到store节点数据库
- 查看销售表(包括sale_transaction 、 sale_return_line_item)是否从store节点同步到corp节点数据库
- 查看系统表(以sym为前缀)
- 验证条目表是否有相同数据
6、Pulling Data
修改corp节点数据库条目表数据(增加一个条目),观察数据是否被拖到store节点数据库。
- 新建数据
打开corp节点数据库会话窗口,添加一条数据。
insert into item (item_id, name) values (110000055, 'Soft Drink');
insert into item_selling_price (item_id, store_id, price)
values (110000055, '001', 0.65);
insert into item_selling_price (item_id, store_id, price)
values (110000055, '002', 1.00);
观察log日志,查看数据转换。设置每分钟拖一次数据。
- 验证输出批次
打开corp节点数据库会话窗口,执行查询语句,查看status是否为OK。
select * from sym_outgoing_batch order by batch_id desc
- 验证输入批次
打开corp节点数据库会话窗口,执行查询语句,查看status是否为OK。
select * from sym_incoming_batch order by batch_id desc
- 验证数据
验证store节点数据库变化
select * from item_selling_price
7、Pushing Data
模拟一条销售记录,观察数据是否被推送至中央节点数据库。
- 新建数据
打开store节点数据库会话窗口,添加一条数据。
insert into sale_transaction (tran_id, store_id, workstation, day, seq)
values (1000, '001', '3', '2014-03-21', 100);
insert into sale_return_line_item (tran_id, item_id, price, quantity)
values (1000, 110000055, 0.65, 1);
观察log日志,查看数据转换。设置每分钟推一次数据。
- 验证输出批次
打开store节点数据库会话窗口,执行查询语句,查看status是否为OK。
select * from sym_outgoing_batch order by batch_id desc
- 验证输入批次
打开store节点数据库会话窗口,执行查询语句,查看status是否为OK。
select * from sym_incoming_batch order by batch_id desc
- 验证数据
验证corp节点数据库变化
select * from sale_transaction;
select * from sale_return_line_item;
另外仔细观察基本的triggers, routers, group links 及其他表数据是如何设置的,可根据实际需要实现自己的同步需求。