原文参照: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的数据库,会发现:

大功告成!

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

  1. Oracle数据库同步方案

    Oracle数据库同步方案 1. 利用数据泵导出每表前2000行数据 expdp tvpay2/tvpay directory=dmp dumpfile=20170508.dmp include=ta ...

  2. [转]SqlServer数据库同步方案详解

    SqlServer数据库同步是项目中常用到的环节,若一个项目中的数据同时存在于不同的数据库服务器中,而这些数据库需要被多个不同的网域调用时,配置 SqlServer数据库同步是个比较好的解决方案.Sq ...

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

    本文源码:GitHub·点这里 || GitEE·点这里 一.数据库扩容 1.业务场景 互联网项目中有很多"数据量大,业务复杂度高,需要分库分表"的业务场景. 这样分层的架构 (1 ...

  4. SpringBoot数据库读写分离之基于Docker构建主从数据库同步实例

    看了好久的SpringBoot结合MyBatista实现读写,但是一直没有勇气实现他,今天终于接触到了读写分离的东西,读写分离就是讲读操作执行在Slave数据库(从数据库),写操作在Master数据库 ...

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

    SQL Server 2008数据库复制是通过发布/订阅的机制进行多台服务器之间的数据同步,我们把它用于数据库的同步备份.这里的同步备份指的是备份服务器与主服务器进行 实时数据同步,正常情况下只使用主 ...

  6. Python Django CMDB项目实战之-2创建APP、建模(models.py)、数据库同步、高级URL、前端页面展示数据库中数据

    基于之前的项目代码来编写 Python Django CMDB项目实战之-1如何开启一个Django-并设置base页index页文章页面 现在我们修改一个文章列表是从数据库中获取数据, 下面我们就需 ...

  7. MySQL专题 1 分布式部署数据库同步问题 BinLog

    什么是 Binlog MySQL Server 有四种类型的日志——Error Log.General Query Log.Binary Log 和 Slow Query Log. 第一个是错误日志, ...

  8. 【转】通过SQL Server 2008数据库复制实现数据库同步备份

    SQL Server 2008数据库复制是通过发布/订阅的机制进行多台服务器之间的数据同步,我们把它用于数据库的同步备份.这里的同步备份指的是备份服务器与主服务器进行实时数据同步,正常情况下只使用主数 ...

  9. MySQL数据库同步工具的设计与实现

    一.背景 在测试过程中,对于不同的测试团队,出于不同的测试目的,我们可能会有多套测试环境.在产品版本迭代过程中,根据业务需求,会对数据库的结构进行一些修改,如:新增表.字段.索引,修改表.字段索引等操 ...

随机推荐

  1. Greenplum 调优--VACUUM系统表

    Greenplum 调优--VACUUM系统表 1.VACUUM系统表原因 Greenplum是基于MVCC版本控制的,所有的delete并没有删除数据,而是将这一行数据标记为删除, 而且update ...

  2. [Luogu] 教主的魔法

    https://www.luogu.org/problemnew/show/P2801 分块 对于每一块进行排序存储在另一个数组中 二分查询 #include<iostream> #inc ...

  3. 2019-2020 ICPC, NERC, Southern and Volga Russian Regional Contest

    目录 Contest Info Solutions A. Berstagram B. The Feast and the Bus C. Trip to Saint Petersburg E. The ...

  4. P3939 数颜色 线段树动态开点

    P3939 数颜色 线段树动态开点 luogu P3939 水.直接对每种颜色开个权值线段树即可,注意动态开点. #include <cstdio> #include <algori ...

  5. 【概率论】5-4:泊松分布(The Poisson Distribution)

    title: [概率论]5-4:泊松分布(The Poisson Distribution) categories: - Mathematic - Probability keywords: - Po ...

  6. mybatis oracle 逆向工程

  7. mongodb的状态分析

    1.借助工具 mongostat 分析mongodb运行状况 C:\Users\Administrator>mongostat --help //查看帮助 View live MongoDB p ...

  8. jmeter接口上传图片功能

    图片上传需要选择Files Upload 输入下列参数: File Path:方法一,把图片放在bin目录下,直接输入图片名称:方法二,点击下图“Browse”按钮,选择一张需要上传的图片,地址将会自 ...

  9. onPageScroll的使用

    1. 2.

  10. pc电源cpu插座和显卡插座

    cpu插座是8口的,一般4+4 显卡插座是6口的,也有8口的用6+2 6+2的中2有一个小边,组合成8口也不能插入cpu插座.