基于SymmetricDS的多主一从数据库同步方案

原文参照:https://blog.csdn.net/seattle0564/article/details/22096901

下面就记录下测试的一款第三方同步方案SymmetricDS(以下简称S)的使用过程,中文资料较少,而且存在一些版本上的差异,导致一些步骤根本不能通过或报错,自己简化了些操作,并没有按照官方的指导操作,鉴于英文水平有限,很多叙述都是基于自己的理解,也请有不同观点的兄弟留言指正或交流。

之所以选择SymmetricDS,大致三个原因:

1.  平台独立。不依赖其他组件包,独立配置完后实现功能。

2.  业务无关。不需要关心数据库中的业务,直接配置同步的表名等参数。

3.  同步及时。基于触发器的数据同步,保证数据传输的及时性。

官方地址:http://www.symmetricds.org

版本:symmetric-3.5.19-server.zip

下面是开源中国的一些图表介绍,引用下:

部署示意图,双箭头代表可以双向同步,而不是简单的单向复制。

配置数据模型:对于各个服务器,不管是主机还是从机,都需要配置S服务,用来监听或执行动作等,并且是以节点代表服务器来配置,至于触发器更体现它的实时性,一方数据库发生变化,首先被本机S服务监听,同时向关联的节点发起同步请求,关联节点接收请求并做响应动作。

运行时数据模型:当每个节点监听到本机的数据事件(即数据变动),会将变动的数据通过触发器与关联节点进行通迅。

测试方案拓扑图如下。sun1、sun2 向 sun进行单向数据同步。

因实际硬件测试环境限制,本地新建三个数据库分别模拟sun,sun1,sun2

每个节点都需要配置一个s服务,将S服务代码分别解压到了三个目录:
D:\develop\symmetric\sun\symmetric
D:\develop\symmetric\sun1\symmetric
D:\develop\symmetric\sun2\symmetric


一、首先配置从机sun的S服务。进入到D:\develop\symmetric\sun\symmetric目录,将samples目录下的corp-000.properties文件拷贝到engines目录下,samples目录下是官网提供的一个范例,engines是你配置自己同步服务的目录,corp-000.properties可以说是配置从机节点参数的一个模板,所以拷贝出来做修改,文件名可以自定义修改,修改为sunserver-000.properties。
按照如下模板修改:

engine.name 引擎名称,可以理解成当前节点服务的名称
db.driver 数据库的jdbc驱动名称
db.url 数据库连接字符串
db.user 数据库用户名
db.password 数据库密码
registration.url 上一级节点的注册地址,如果是顶级节点,就设为空
sync.url 本机的注册地址 http://localhost:8080/sync/sunserver-000
其中8080是当前节点服务启动后需要占用的端口,sunserver-000即第一个参数engine.name的值
group.id 节点组的ID,当前顶级节点组名为sunserver,意思是服务端
external.id 当前节点组下节点的编号,通过上面的group.id和external.id可以定位到唯一的节点

后面的参数是对S服务运行参数的配置,保持默认就好。

二、配置子节点sun1。配置好顶级节点从机sun的服务,接下来就该配置子节点数据主机sun1,sun2的了,先配置sun1.同样的,进入到D:\develop\symmetric\sun1\symmetric目录,将samples目录下的store-001.properties文件拷贝到engines目录下,这里的store-001.properties也可以说是配置数据主机节点参数的一个模板,配置内容与sun类似,这里改名为sunclient-001.properties

配置基本上与sun节点类似,其中有些需要关注的是:
registration.url 这里填写的是上级节点的注册地址,可以看到就是sun配置参数中的sync.url
这里的sync.url其实不用配置,因为节点到此为止。如果sun1以下还有节点分支,那需要配置这个参数,并且在下一个节点的registration.url配置这个值。需要注意的是,我当前是在单机上模拟三个节点服务的运行,所以每个节点服务的启动端口不同,避免冲突。sun1的启动端口是7070
group.id 这里的组ID为sunclient,意思是客户端。

三、配置sun2节点。进入到D:\develop\symmetric\sun2\symmetric目录,后续步骤与上一步相同。

四、创建同步表数据。接下来,需要向同步的数据库进行数据导入,官网的方式是通过命令行进入到Symmetric的目录,通过命令执行sql脚本创建表和数据,但我尝试了几次,都没有成功,有些资料说是因为官网相关XML文件格式的问题,不管咋样,索性自己手动创建表和数据。
    所以要做的,就是在数据库中创建你要同步的表,如果数据库中已经有表结构了,可不做操作了。
    创建后的表为

区域表,电站表。
具体表结构也一目了然:

所有的节点数据库sun、sun1、sun2都需手动创建和添加数据,并且理论上数据库的结构应该是保持一致的。

五、初始化顶级节点sun的系统表结构。这里的系统表,指的就是Symmetric自己的同步服务表,并且所有的节点数据库中都需要有这些系统表(这也是我觉得悲催的地方,光这些系统表就二三十个,忒不美观了)。稍微庆幸的是,我们只要在顶级节点中创建这些表,所有子节点在服务启动后,会根据顶级节点自动创建。
通过命令行进入到D:\develop\symmetric\sun\symmetric\engines目录
执行

..\bin\symadmin --engine sunserver-000 create-sym-tables

运行成功,完成初始化系统表。此时可以查看下数据库,发现多了好多表啊。

sym前缀的表 都是,表数量不止于此,还不是完整截图。:-(

六、初始化顶级节点sun的系统表数据。上一步骤是初始化表结构,下面就要初始化数据了。其实说到现在,我们都还不知道怎么控制SymmetricDS同步的逻辑,比如需要同步哪些表,哪个节点向哪个节点发送同步数据,这些都体现在系统表数据中了。
        至于如何初始化系统表数据,我参照了samples目录中insert_sample.sql脚本文件,官方范例中系统表的初始化脚本,另外还参照了百度文库中一篇说明。

(1)配置节点组

insert into sym_node_group (node_group_id, description)
values (‘sunserver‘, ‘电站数据中心‘);
insert into sym_node_group (node_group_id, description)
values (‘sunclient‘, ‘子电站数据服务器‘);

(2)配置各节点组间的数据同步模式。有push(推)和wait(等待||拉)两种,由data_event_action制定,其中w(wait for pull)代表拉,p代表推(push)。
insert into sym_node_group_link (source_node_group_id, target_node_group_id, data_event_action)
values (‘sunclient‘, ‘sunserver‘, ‘P‘);
insert into sym_node_group_link (source_node_group_id, target_node_group_id, data_event_action)
values (‘sunserver‘, ‘sunclient‘, ‘W‘);

(3)配置各个节点信息。这里只要配置sun的节点信息就可,其他子节点sun1、sun2在注册节点后,会自动生成系统表并且插入数据
insert into sym_node (node_id, node_group_id, external_id, sync_enabled)
values (‘000‘, ‘sunserver‘, ‘000‘, 1);
insert into sym_node_security (node_id,node_password,registration_enabled,registration_time,initial_load_enabled,initial_load_time,initial_load_id,initial_load_create_by,rev_initial_load_enabled,rev_initial_load_time,rev_initial_load_id,rev_initial_load_create_by,created_at_node_id)
values (‘000‘,‘123456‘,0,current_timestamp,0,current_timestamp,null,null,0,null,null,null,‘000‘);
insert into sym_node_identity values (‘000‘);

(4)配置数据通道表。有外键关联的表,一定要定义在同一通道中,才能进行关联同步。
insert into sym_channel
(channel_id, processing_order, max_batch_size, enabled, description)
values(‘bus_info‘, 1, 100000, 1, ‘电站信息同步通道‘);

(5)定义触发器。在这里定义需要同步库中的哪些表,注意有外键关联的表,通道值要相同。sym_trigger中的excluded_column_names字段,可以设置不想同步的表字段,这里并没有体现。
insert into sym_trigger
(trigger_id,source_table_name,channel_id,last_update_time,create_time)
values(‘symmetric_test_area‘,‘symmetric_test_area‘,‘bus_info‘,current_timestamp,current_timestamp);
insert into sym_trigger
(trigger_id,source_table_name,channel_id,last_update_time,create_time)
values(‘symmetric_test_bus‘,‘symmetric_test_bus‘,‘bus_info‘,current_timestamp,current_timestamp);

(6)配置数据路由。配置数据同步时数据的走向,即从哪个节点向哪个节点同步。其中ROUTER_TYPE=‘column‘就是指明由需同步的表中某列的值来决定数据流向,具体的条件则来表达式决定:ROUTER_EXPRESSION=‘org_code=:EXTERNAL_ID‘ 。默认ROUTER_TYPE=‘default’就好。
insert into sym_router
(router_id,source_node_group_id,target_node_group_id,router_type,create_time,last_update_time)
values(‘client_2_server‘, ‘sunclient‘, ‘sunserver‘, ‘default‘,current_timestamp, current_timestamp);

(7)最后建立触发器与路由的关联。SymmetricDS中定义的触发器只有被路由关联后,SymmetricDS才会为这个表自动生成相应的触发器。
insert into sym_trigger_router
(trigger_id,router_id,initial_load_order,last_update_time,create_time)
values(‘symmetric_test_area‘,‘client_2_server‘, 200, current_timestamp, current_timestamp);
insert into sym_trigger_router
(trigger_id,router_id,initial_load_order,last_update_time,create_time)
values(‘symmetric_test_bus‘,‘client_2_server‘, 200, current_timestamp, current_timestamp);

七、启动SymmetricDS
(1)注册所有子节点,命令行进入D:\develop\symmetric\sun\symmetric\engines 顶级节点目录。
分别执行注册节点命令
..\bin\symadmin --engine sunserver-000 open-registration sunclient 001
..\bin\symadmin --engine sunserver-000 open-registration sunclient 002

再分别执行注入节点命令
..\bin\symadmin --engine sunserver-000 reload-node 001
..\bin\symadmin --engine sunserver-000 reload-node 002

(2)启动服务。
分别启动三个节点的服务,先执行子节点。
命令行进入 D:\develop\symmetric\sun1\symmetric\engines 
执行 
..\bin\sym --port 7070

命令行进入 D:\develop\symmetric\sun2\symmetric\engines 
执行 .
..\bin\sym --port 9090

命令行进入 D:\develop\symmetric\sun\symmetric\engines 
执行 
..\bin\sym --port 8080

这里要注意端口号,即配置文件中注册地址的端口号。

至此 三个服务都成功开启。下面可以进行测试了。。

在sun1数据库symmetric_test_area表中新增一条数据4--seattle

在sun2数据库symmetric_test_area表中新增一条数据5--tokyo

最后直接查看sun的数据库,会发现:

大功告成!

原文地址:https://www.cnblogs.com/killclock048/p/9817482.html

时间: 2024-10-24 18:39:11

基于SymmetricDS的多主一从数据库同步方案的相关文章

手机端与服务器数据库同步方案

服务器端: 1, 创建数据表 2, 操作数据库的日志. 定义三个字段(id,操作时间,操作内容,分发到所属手机端的用户id) Id: js uuid值 操作时间:2014/8/21 11:32:10 操作内容:以json格式存放select,delete,update之类的 分发到所属手机端的用户id:手机端并不是每个手机用户都需要,选择性的更新数据. 手机端: 建空库,直接取服务器端的操作数据库的日志运行操作.然后取服务器端的操作日志,过滤时间进行操作. 手机端与服务器数据库同步方案

数据库同步方案

1--所有的表添加'datatsp和datatsp_int' --select * from sysobjects where xtype='U' order by name --数据库中所有的只具有一个主键表添加'datatsp和datatsp_int' declare @table_name varchar(50), @sql varchar(8000), @col_key varchar(50) declare cur_tb cursor for select distinct table

一种分布式数据库同步方案 .

转:http://blog.csdn.net/fangaoxin/article/details/5752526 对于大型企业,业务分布在世界各地,为了改善当地业务服务能力,不得不在当地部署数据库以提高性能,而各个区域之间的数据交互或者同步,成为不可不面对的问题.其间要解决的技术问题主要有:    1.同步数据的提取.从数据库里提取出需要同步的数据,这包括增.删.改三类动作对数据造成的改变.在数据表安装触发器是提取同步数据的简单有效的手段,而且触发器对应用层而言是透明的,应用程序感觉不到触发器的

架构组件:基于Shard-Jdbc分库分表,数据库扩容方案

一.数据库扩容 1.业务场景 互联网项目中有很多"数据量大,业务复杂度高,需要分库分表"的业务场景. 这样分层的架构 (1)上层是业务层biz,实现业务逻辑封装: (2)中间是服务层service,封装数据访问: (3)下层是数据层db,存储业务数据: 2.扩容场景和问题 当数据量持续新增,面临着这样一些需求,两台数据库无法容纳,需要数据库扩容,这里选择2台-扩容到3台的模式,如下图: 这样扩容的问题 (1)分库分表的策略导致数据迁移量大: (2)影响数据的持续服务性: (3)指定时间

[转贴] 网络游戏实时动作同步方案手记(3)

出处 http://blog.csdn.net/akara/article/details/5936744 (2)网上根本找不到,我也试图私信过原作者询问,没有回复. ------------------------------------------------------ 基于上面的(1)(2)两篇同步方案知识,可以写个demo来试验同步的效果. 需要找一个p2p库来做系列同步算法的demo.选了RakNet-4.0.Beta5.  官方网站是http://www.jenkinssoftwa

SymmetricDS 异构数据库同步软件部署案例

SymmetricDS是一个开源的同步软件,该软件是基于java环境编写的,在运行的时候需要安装JDK.SymmetricDS可以同步文件和数据库,本文的重点是数据库方面的同步. SymmetricDS支持多种数据库的同步,支持的数据库如下: Oracle, MySQL, MariaDB, PostgreSQL, MS SQL Server (including Azure), IBM DB2, H2, HSQLDB, Derby, Firebird, Interbase, Informix,

通过SQL Server 2008数据库复制实现数据库同步备份

SQL Server 2008数据库复制是通过发布/订阅的机制进行多台服务器之间的数据同步,我们把它用于数据库的同步备份.这里的同步备份指的是备份服务器与主服务器进行 实时数据同步,正常情况下只使用主数据库服务器,备份服务器只在主服务器出现故障时投入使用.它是一种优于文件备份的数据库备份解决方案. 在选择数据库同步备份解决方案时,我们评估了两种方式:SQL Server 2008的数据库镜像和SQL Server 2008数据库复制.数据库镜像的优点是系统能自动发现主服务器故障,并且自动切换至镜

一种异构数据库同步的简单方法

标题有点高大上,是为了解决实际应用中的一个问题.做了一个Android应用,用于记录日常消费账单,开始是单机版的,我老婆说太low了,起码要能看到彼此的消费情况吧.为此,我还专门写了一套基于protobuf的RPC组件,用于网络通信,http://www.cnblogs.com/zmkeil/p/5176758.html. 应用本身比较简单,几张简单粗暴的UI,涵盖了增.删.改各种功能,外加一个后台service组件,用于上传账单,并同步他人账单.也算是麻雀虽小五脏俱全吧,看几张效果图.代码见h

Oracle GoldenGate 简介 数据库同步 异地复制方案

OracleGoldenGate介绍 GoldenGateTDM(交易数据管理)软件是一种基于日志的结构化数据复制软件,它通过解析源数据库在线日志或归档日志获得数据的增删改变化,再将这些变化应用到目标数据库,实现源数据库与目标数据库同步.双活.GoldenGateTDM 软件可以在异构的IT基础结构(包括几乎所有常用操作系统平台和数据库平台)之间实现大量数据亚秒一级的实时复制,其复制过程简图如下: 如上图所示,GoldenGate TDM的数据复制过程如下: 1 利用捕捉进程(Capture P