多种数据库之间的同步⼯具SymmetricDS
原理:
通过触发器模式同步时,是将数据库的变化记录到某个系统表中,然后在客户端建⽴缓冲,并定期将变化push到接收端,接收端和发送端建⽴通道,并定期pull新的数据变化,并在⽬标数据库回放。--这个过程会有⼀定的延迟,和性能影响,但是只要数据库⽀持触发器,都可以使⽤SymmetricDS来做数据库同步。
另外⼀种模式记录SQL,并回放SQL,好像⽤很少。
还在开发的是解析⽇志,通过回放⽇志来实现同步,这个最难,基本相当于流复制的速度了,但是各种数据源的⽇志格式不⼀样,造成了解析⽇志的⼯作量相当的⼤,有点难实现。不过Oracle 的OGG是实现了从种数据库间通过解析⽇志来相互同步了。
具体项⽬选型:
在我们的⼤数据项⽬中,最终还是使⽤了OGG,因为SymmetricDS使⽤触发器,会影响⽣产环境的性能,这点⽆法接受,⽽OGG解析⽇志的⽅式基本不会影响业务数据库的性能。
特点:
跨平台的 ——⼤多数操作系统上运⾏,包括移动设备,可以同步任何数据库的数据库⽀持。
多线程 -多线程架构提取、转移和并⾏加载数据。
渠道 ——表分成独⽴的渠道,有⾃⼰的线程同步队列。
⾃动恢复 ——批次错误重试,直到他们成功,所以同步可以从⽹络故障中恢复过来。
事务意识到 ——数据变更记录和回放在相同的顺序和在同⼀事务。
多主机 ——相同的表都可以同步到从主机系统,同时避免更新循环。
转换 ——⼦集,过滤和转换数据在提取或加载阶段。
冲突检测 ——⾃动检测冲突和解决他们在多主机同步。
表模式 ——选择允许创建和升级的数据库模式。
初始数据加载 ——准备⼀个远程数据库的初始负载数据。部分的初始加载指定表和⾏也可以发送。
中央配置 ——从中央注册服务器接收到所有配置和保持同步。
多个部署选项 ——部署使⽤独⽴的引擎,web应⽤程序,或嵌⼊在⼀个应⽤程序。
沟通的⽅法推或拉的变化通过防⽕墙进⾏通信。
HTTP / S的传输 ——HTTP / S服务。
有效的协议 ——⼀个快速流数据格式,很容易产⽣,解析和加载。运输也是默认压缩。
监控 ——监视器观察问题批量错误或积压和通过电⼦邮件发送⼀个通知。
远程管理通过命令⾏⼯具——管理,REST API和Java管理扩展(JMX)控制台。
插件API 通过扩展和插件点,添加定制。
可嵌⼊ ——⼩到可以嵌⼊或引导在另⼀个应⽤程序(即⼀个POS应⽤程序)。
介绍:
⼀句话概括该软件:SymmetricDS是⼀个⽂件和数据库同步软件,开源的,⽀持多主复制,同步时过滤和在异构的⽹络环境中进⾏数据转换传输。它⽀持单向和双向上的多个订阅者,异步的数据复制。
以下是从CSDN专栏到的⽤户指南的翻译,由于⽬前SymmetricDS的中⽂资料是少之⼜少,所以⽤的⼈也不是很多。当初公司选择SymmetricDS,主要是因为它满⾜开源免费,⽀持双向同步,在使⽤的过程中,由于没有什么资料,所以⼀切都是靠⾃⼰的摸索和探究。测试过程中也出现了⼀些使⽤上的问题,⽬前也都解决了,⾄于是什么问题,下篇博客会详述,供出现同样问题的同学参考。
⽬前SymmetricDS的稳定性还不能考量,因为很少看到相关的资料。但是它的官⽹上显⽰,这个软件还在以⼤概7天的频率在更新当中,版本更新是相当快的,我们公司对这个软件也寄予厚望,希望⽇后能更加稳定和强⼤,当然是持续开源下去是最好了。
1.1. System Requirements
SymmetricDS使⽤Java编写,需要JRE或者JDK 6.0及以上版本。
任何⼀个拥有Trigger技术和JDBC驱动的数据库都可能能够使⽤SymmetricDS。数据库通过Database Dialect被抽象,以⽀持不同的数据库特性。下⾯的数据库⽅⾔已经被包含进此发⾏版中(version 3.6.14):
1. MySQL 5.0.2及以上版本
2. MariaDB及以上版本
3. Oracle 10g及以上版本
4. PostgreSQL 8.2.5及以上版本
5. Sql Server 2005及以上版本greenplum数据库
6. Sql Server Azure
7. HSQLDB 2.x
8. H2 1.x
9. Apache Derby 10.3.2.1及以上版本
10. IBM DB2 9.5及以上版本
11. Firebird 2.0及以上版本
12. Interbase 2009及以上版本
13. Greenplum 8.2.15及以上版本
14. SQLite 3及以上版本
15. Sybase Adaptive ServerEnterprise 12.5及以上版本
16. Sybase SQL Anywhere 9及以上版本
附录C Database Notes,可以查看你选⽤的数据库的兼容性问题和其他细节。
1.2. Concepts
1.2.1 Notes
SymmetricDS是⼀个基于Java的应⽤,提供了⼀个同步引擎,这个引擎在数据同步中作为⼀个agent(代理,代理后边说的那个数据库实例),提供⼀个数据库实例和⽹络中其他同步引擎之间的数据同步。
⼀个SymmetricDS引擎叫做⼀个Node。SymmetricDS被设计为可以扩展到成千上万个节点。属性配置⽂件中提供的数据库连接字符串,数据库⽤户名和数据库密码配置数据库连接信息。SymmetricDS可以同步数据库连接可以访问的任意的数据库表,只要数据库⽤户被分配了合适的数据库权限。
⼀个SymmetricDS节点被分配⼀个external id和⼀个节点group id。External id是⽤户指定的标⽰符,SymmetricDS使⽤这个标⽰符来标识⼀个特定的节点,数据被派往的节点。节点的group id⽤来标识节点所在的组或者层。它定义了⼀个节点整个⽹络中所有的节点中所处的位置。例如,⼀个节点的组可能被命名为‘corporate’,代表⼀个企业或者公司的数据库;另⼀个节点的组可能被命名为“local_office”,代表⼀个地区不同的机构的数据库。⼀个“local_office”的 external id可能是⼀个机构的编码或者其他有标⽰性的字母组成的字符串。⼀个节点通过它的node id在⼀个⽹络中被唯⼀的区分开,这个node id是根据external id⾃动⽣成的。如果本地机构代码1有两个数据库和两个SymmetricDS节点,它们可能有⼀个值为“1”的external id和值为“1-1”和“1-2”的node id。
SymmetricDS可以以多种⽅式部署。最常见的选择是在作为⼀个独⽴的进程,以服务的形式运⾏于服务器中。当以这种⽅式被部署的时
候,SymmetricDS可以作为⼀个客户端或者⼀个多租户的服务端,也可以依赖SymmetricDS数据库在整个数据库⽹络中的位置⽽定。尽管它可以与数据库服务器运⾏在同⼀个服务器上,但是不需要必须这么做。SymmetricDS可以被部署到⼀个应⽤服务器中,像Apache Tomcat,JBoss Application Server,IBM WebSphere中,作为⼀个web应⽤。
SymmetricDS被设计成⼀个对技术⼈员来说,简单,易⽤的⼯具。它可以被认为是⼀个web应⽤,只
是⽤其他的SymmetricDS引擎作为客户端代替浏览器的⾓⾊。它拥有web应⽤的所有特性,可以使⽤调试web应⽤的原理来调试SymmetricDS。
1.2.2. Change Data Capture
数据库触发器开启SymmetricDS捕获数据变化功能,SymmetricDS会根据⽤户的配置⾃动安装触发器。数据库触发器记录的数据变化都在DATA表(DATA表是SymmetricDS中的系统表)。数据库被设计为⾮侵⼊性的,尽可能的轻量级。在SymmetricDS触发器被安装之后,外部应⽤执⾏的所有的DML statement产⽣的数据变化都会被捕捉。注意,⽤户的应⽤不需要添加额外的库,也不需要任何的更改;SymmetricDS不需要必须在线才能捕捉数据。
SymmetricDS配置的不同数据库实例间的数据库表需要有相同的结构。整个⽹络中的节点的配置通常在⽹络中的⼀个中⼼节点管理,也就是registration server节点。Registration Server节点⼏乎总是与树形拓扑⽹络结构中的root节点是同⼀个。当配置⼀个“叶”节点,需要配置的⼀个启动参数是registration server节点的URL。如果“叶”节点还没注册到root节点,它联系registration server然后请求加⼊到⽹络中。⼀旦请求被接受,“叶”节点就下载所需的配置。在⼀个节点被注册之后,SymmetricDS也可以在开始同步之前提供⼀个数据初始负载操作。SymmetricDS将在启动时安装或者更新它的数据库触发器;当预定的同步触发器任务运⾏的时候,SymmetricDS会定期地再次安装新的触发器和更新原有的
触发器(默认情况下,是在每天午夜)。当决定⼀个触发器是否需要被重新建⽴的时候,同步触发器任务会检测数据库结构或者触发器配置的变化。可选择地,同步触发器任务可以被关闭,DBA可以⾃⼰⽣成和运⾏数据库触发器DDL脚本。
在变化的数据被数据库触发器插⼊到SymmetricDS的DATA系统表之后,这些数据被Router Job分批然后分配到某个SymmetricDS节点。路由数据指的是在SymmetricDS⽹络中选择⼀个数据应该发送的节点。默认情况下,⼀个节点的数据根据节点组标识被路由。可选地,数据和⽬标节点的特性也可以在路由过程中使⽤。⼀个数据的batch是⼀组数据的变化。这⼀组数据⼀起被传送和加载到⽬标节点,作为⼀个数据库事务提交。Batch信息记录在SymmetricDS的OUTGOING_BATCH系统表中。Batch是节点特定的,每个节点只有⾃⼰处理过的Batch 的记录。DATA和OUTGOING_BATCH通过DATA_EVENT联系。Batch的发送状态记录在 OUTGOING_BATCH中。在数据被发送到远程节点之后,batch的状态被改为“OK”。
1.2.3. Change Data Delivery
数据通过HTTP或者HTTPS发送到远程节点。数据可以通过这两种⽅式中的⼀种发送,发送的⽅式依赖于配置的节点的组之间的传输链路的类型。⼀个节点组可以被配置成推送变化到某个节点组中的其他节点,也可以配置成从某个节点组中的其他节点拉取数据。推送数据的操作是通过在数据源节点初
始化⼀个 Push Job实现。如果有多个等待被发送的Batch,推送节点将通过使⽤同⼀个HTTP HEAD请求来保持同⼀个到各个⽬标节点的连接。如果预留的请求被接受,数据源节点将从batch中提取所有的数据。数据以CSV格式被提取⾼内存缓冲区中,直到缓冲区⼤⼩达到配置的阀值,数据通过HTTP PUT被发送到⽬标节点。下⼀个Batch接着被提取和发送。这将⼀直重复直到给每⼀个channel发送的batch达到最⼤值,或者没有batch可以发送为⽌。因为所有的batch通过⼀个HTTP PUT请求发送,⽬标节点也将返回⼀个batch的状态的列表。
拉取请求在⽬标节点通过Pull Job初始化。⼀个拉取请求使⽤HTTP GET提交⽅式。在Push过程中执⾏的提取过程也会在Pull过程中执⾏。
在数据被提取,发送之后,数据加载到⽬标节点。与提取过程相似,随着数据不断被接收,数据加载器将以CSV格式缓存数据到内存缓冲区中,直到达到阀值。如果达到阀值,数据被刷写到⼀个⽂件中然后继续接收数据。⼀个batch中所有的数据都是本地可⽤的,⼀个数据库连接从连接池中取出,然后在源数据库中发⽣的事情会在⽬标数据库再次重演。
1.2.4. Data Channels
数据总是以在特定channel中记录的顺序被发送到远程节点。⼀个channel是⽤户定义的⼀组互相依赖的表。捕获的属于⼀个组的表的数据总是⼀起被同步。每⼀个触发器必须被分配⼀个channel id作为tri
gger定义的⼀部分。Channel id记录在SymmetricDS的SYM_DATA和SYM_OUTGOING_BATCH系统表中。如果⼀个batch加载失败,将不会再有数据发送到这个channel直到这个失败被处理。但是,其他channel上的数据将不受影响,继续同步。
如果远程节点离线,数据仍然在源数据库端被记录,直到远程节点重新上线。可选地,可以设置⼀个超时时间,超过此时间,下线的节点将从⽹络中删除。 SymmetricDS捕获的数据所在的表的数据将在被发送后或者配置的保留时间到期后从SymmetricDS存放捕获的数据的系统表中被删除。将要发送到⼀个关闭的节点的没有被发送的数据变化也将被清除。
SymmetricDS在数据完整性错误的时候的默认的处理⽅式是尝试修复这些数据。如果⼀个插⼊statement执⾏,但是表中已经存在这样的⼀⾏数据,SymmetricDS将会回退插⼊操作然后尝试更新已经存在的⾏。同样地,如果⼀个在源数据库节点上成功执⾏的更新操作在⽬标节点上执⾏的时候,没有到要更新的⾏,SymmetricDS将会回退更新操作,然后将这⾏数据插⼊到数据库中。如果在⽬标节点执⾏删除操作,但是没有到要删除的⾏,这种情况将会被简单的记录。这些处理⽅式可以通过调整配置来进⾏冲突监测和处理。
SymmetricDS使⽤标准的web技术设计,所以它可以被扩展成不同数据库类型的多个客户端。它可以同步数据到与部署的数据库和⽹络基础设施⽀持的客户端⼀样多的客户端节点;也可以从这么多数量
的客户端拉取数据以同步数据。当⼀个两层的数据库和⽹络基础设施不够⽤的时候,⼀个 SymmetricDS⽹络可以被设计成使⽤N层以产⽣更⾼的扩展性。到这我们已经介绍了SymmetricDS是什么,如何完成⽤标准的⽅式在多个数据库间同步数据的⼯作。
1.3. Features
SymmetricDS拥有很多数据同步时你可能需要或者想要的特性。这些特性的⼤部分是根据SymmetricDS在⽣产环境中的使⽤反馈增加的。
1.3.1.Two-Way Table Synchronization
事实上,数据的同步通常只需要往⼀个⽅向同步。例如,⼀个分销商店发送它的商品交易信息到中央数据库,中央数据库发送存货信息和价格到商店。其他的数据可能需要在双向同步。例如,分销商店发送中央数据库⼀个存货清单⽂档,然后中央数据库更新⽂档中的数据,然后发送回商店。SymmetricDS⽀持表的双向同步,同时通过仅记录同步之外的数据变化避免了陷⼊更新循环。
1.3.
2. Data Channels
SymmetricDS⽀持数据通道的概念。数据同步被定义在表(整个表或者表的⼀部分数据)的层⾯,每⼀个被管理的数据库表都被分配到⼀个channel上,channel会帮助控制数据流。⼀个channel是⼀个种类的数据,⼀个channel的数据可以不依赖于其他的channel中的数据被同步。例如,在⼀个分销例⼦中,⼀个促销事件可能更新很多的商品信息,但是⽤户可能正在等待存货清单⽂档的更新。如果按照顺序处理,商品更新将延迟存货清单的更新,尽管数据是没有联系的。通过将item表分配到item channel,inventory表分配到inventory channel,这两个表的数据变化被分开来处理,因此inventory可以不管⼤量的商品数据的情况下操作数据。
Channel 将在Section3.3“Channel”中被详细讨论。
1.3.3. Change Notification
在⼀条数据变化记录到数据库中之后,对此变化感兴趣的SymmetricDS节点被唤醒。Change Notification被配置为既可以执⾏数据push也可以执⾏数据pull。当⼏个节点将它们的数据变化对准到⼀个中央节点的时候,⽤push的⽅式代替等待中央节点从每个源数据库pull的⽅式是⾼效的。如果⽹络配置了防⽕墙来保护⼀个节点,pull配置可能使该节点可以接收到数据变化,⽽ push⽅式将会被阻塞。Change
Notification的频率是可配置的,默认是⼀分钟⼀次。
1.3.4 HTTP(S) Transport
默认情况下,SymmetricDS以REST风格使⽤基于web的HTTP或者HTTPS请求的⽅式。这是⼀种轻量级并且易管理的⽅式。提供了⼀系列的filter来强制认证和限制同时同步的数据流的数量。ITransportManager接⼝允许实现其他的数据传输⽅式。
1.3.5. Data Filtering and Rerouting
使⽤SymmetricDS,数据可以再记录,提取和加载的时候被过滤。
1. 数据路由是通过往SymmetricDS系统表ROUTER中插⼊⼀个给定类型的router来完成的。Router负责确定捕获到的变化应该被发往的⽬的节点。⾃定义的router可以通过实现⼀个IDataRouter接⼝来提供。
2. 除了同步,随着同步数据加载到⽬标数据库,SymmetricDS也可以完成很复杂的数据转换。数据转换可以被⽤来合并源数据,产⽣多个源数据的副本到多个⽬标数据库表,在⽬标数据库设置默认值,等等。转换的类型可以被扩展,可以创建⾃定义的转换。
3. 因为数据变化被加载到⽬标数据库中,数据可以被⼀个简单的shell加载过滤器过滤,也可以被⼀个 IDatabaseWriterFilter的实现类过滤。你可以改变⼀个列中的数据,然后路由改变后的数据到任何
地⽅,触发器初始化负载或者其他可能的情况。⼀个可能的⽤法是可以路由信⽤卡数据到⼀个安全的数据库然后在中央存放销售信息的数据库中空出来。过滤器也可以防⽌数据全部到达⽬标节点,然后在⽬标节点加载数据时使⽤数据的默认值,这样⾮常⾼效。
1.3.6. Transaction Awareness
很多的数据库提供全局唯⼀的事务标识,跟作为⼀个事务⼀起提交的多个⾏相关联。SymmetricDS随同变化的数据⼀起,也存储事务的标识,因此 SymmetricDS可以精确地回滚⼀个事务。这意味着,⽬标数据库维护与源数据库中相同的事务完整性。⽀持事务标识符的数据库在附录中有记录。
1.3.7. Remote Management
管理功能通过JMX暴露出来,可以通过Java JConsole⼯具或者通过⼀个应⽤程序服务器访问。功能包括打开注册,重新加载数据,清除旧的数据和查看batch信息。很多的配置信息和运⾏时属性也可以被查看。
SymmetricDS也提供了发送SQL事件的功能,跟⽤来发送数据的同步机制⼀样。数据payload可以使任意的SQL statement。事件的处理和响应也跟其他类型的事件⼀样。
1.3.8. File Synchronization
不少的SymmetricDS⽤户已经发现他们不仅需要同步数据库表到远端,他们也有⼀系列的⽂件应该被同步。从version 3.5开
始,SymmetricDS开始⽀持⽂件同步了。
请查看Section3.5 “File Trigger / File Synchronization”获取更多的信息。
1.4 Why Database Triggers?
在关系型数据库中,有⼏种⽅法可以捕获到变化的数据,以⽤来复制、同步和整合。
1. Lazy data capture从源数据库系统中使⽤条件(⽐如⼀个时间戳列)SQL语句查询变化的数据。
2. Trigger-based data capture 安装⼀个数据库触发器来捕获变化的数据。
3. Log-based data capture从数据库的恢复⽇志中读取数据的变化。
上边的三种⽅式都有优势,也都有劣势,都在SymmetricDS的开发计划中。⽬前,SymmetricDS⽀持基于触发器的数据捕获和不公平的懒惰数据捕获。⾸先实现这两种技术有很多的原因,最重要的是SymmetricDS要解决的⼤多数的⽤例都能使⽤基于触发器的⽅式解决,在某种程度上,条件复制的⽅
式(第⼀种⽅式)使更多的使⽤企业标准技术的数据库平台被⽀持。这个事实使SymmetricDS的开发者宝贵的时间和经理被放到设计⼀个易于安装、配置和管理的产品,⽽不是花费时间在逆向数据库⽇志⽂件上。
基于触发器的数据捕获⽅式引⼊了⼀个可以衡量数据库操作开销。开销会随着处理器的能⼒和配置给数据库平台的资源还有应⽤使⽤数据库的⽅式变化。随着不断改进的硬件和数据库技术,基于触发器的数据捕获对需要⾼数据吞吐量或者需要扩展的应⽤来说将变得更加灵活。
基于触发器的数据捕获⽐基于⽇志的解决⽅案更容易实现和受⽀持。它使⽤众所周知的数据库概念,对于软件,数据库开发者和数据库管理员来说更易理解。它通常被应⽤开发团队或者数据库管理员安装,配置和管理,本⾝不需要部署到数据库服务器上。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论