SymmetricDS 数据库双向同步开源软件入门
1.??????MySQL 5.0.2 及以上版本
2.??????MariaDB 及以上版本
3.??????Oracle 10g 及以上版本
4.??????PostgreSQL 8.2.5 及以上版本
5.??????Sql Server 2005 及以上版本
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.1 Notes
SymmetricDS 是一个基于 Java 的应用,提供了一个同步引擎,这个引擎在数据同步中作为一个 agent(代理,代理后边说的那个数据库实例),提供一个数据库实例和网络中其他同步引擎之间的数据同步。
一个 SymmetricDS 引擎叫做一个 Node。SymmetricDS 被设计为可以扩展到成千上万个节点。属性配置文件中提供的数据库连接字符 串,数据库用户名和数据库密码配置数据库连接信息。SymmetricDS 可以同步数据库连接可以访问的任意的数据库表,只要数据库用户被分配了合适的数 据库权限。
![](https://static001.geekbang.org/infoq/5a/5a8528bf2ee8de6a3ddfec6821529a73.gif)
一个 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 作为 trigger 定义的一部分。Channel id 记录在 SymmetricDS 的 SYM_DATA 和 SYM_OUTGOING_BATCH 系统表中。如果一个 batch 加载失败,将不会再有数据发送 到这个 channel 直到这个失败被处理。但是,其他 channel 上的数据将不受影响,继续同步。
如果远程节点离线,数据仍然在源数据库端被记录,直到远程节点重新上线。可选地,可以设置一个超时时间,超过此时间,下线的节点将从网络中删除。 SymmetricDS 捕获的数据所在的表的数据将在被发送后或者配置的保留时间到期后从 SymmetricDS 存放捕获的数据的系统表中被删除。将要发 送到一个关闭的节点的没有被发送的数据变化也将被清除。
SymmetricDS 在数据完整性错误的时候的默认的处理方式是尝试修复这些数据。如果一个插入 statement 执行,但是表中已经存在这样的 一行数据,SymmetricDS 将会回退插入操作然后尝试更新已经存在的行。同样地,如果一个在源数据库节点上成功执行的更新操作在目标节点上执行的时 候,没有找到要更新的行,SymmetricDS 将会回退更新操作,然后将这行数据插入到数据库中。如果在目标节点执行删除操作,但是没有找到要删除的 行,这种情况将会被简单的记录。这些处理方式可以通过调整配置来进行冲突监测和处理。
SymmetricDS 使用标准的 web 技术设计,所以它可以被扩展成不同数据库类型的多个客户端。它可以同步数据到与部署的数据库和网络基础设施 支持的客户端一样多的客户端节点;也可以从这么多数量的客户端拉取数据以同步数据。当一个两层的数据库和网络基础设施不够用的时候,一个 SymmetricDS 网络可以被设计成使用 N 层以产生更高的扩展性。到这我们已经介绍了 SymmetricDS 是什么,如何完成用标准的方式在多个数据 库间同步数据的工作。
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 接口来提供。
评论