我已经安装并配置了数据库复制软件http://www.symmetricds.org/在客户端和服务器上。我按照说明设置了示例复制,并且一切都按宣传的那样运行。
我感兴趣的是单表上的双向复制。这意味着客户端和服务器上的每个数据库都可以插入/更新/删除,并且另一个数据库上会发生更改。每个表都是另一个表内容的发起者和目的地。
我已阅读全文symmetricDS 手册并且没有关于如何配置双向表的示例。手册中只有一段说可以这样做,但没有说明如何做。
在 symmetricDS 中创建双向数据库复制的说明在哪里?他们提供的默认示例是单向复制泵。
我的系统:
Client: Fedora 17 Linux with postgresql
Server: Windows 8 with mysql
我大胆尝试双向泵,但失败了:
触发器sym_trigger_router
是定义数据泵送方向的地方。我创建了一个双向泵送。但这会产生键强制冲突的问题。如果在同一时刻对同一键执行插入、更新或删除,数据库将不得不采取补救措施来恢复正常。
有没有关于如何做到这一点的说明或者有人这样做过?
答案1
symmetricDS 中的双向表复制
双向表复制并非易事,因为您必须处理可能出现的各种冲突。一个示例冲突是,在服务器和客户端上插入一行,这会同时违反唯一键。客户端和服务器都允许插入/更新发生,因为它们不知道有传入的更新会违反该键。
双方的同步引擎都认为:“哦不,我们都告诉用户,根据我们所知道的情况添加此行是可以的,但我们现在无法同步,因为它会违反唯一性。”
同步引擎有一个选择:
1. Take the last insert/update by timestamp and destroy the request that came
first. This is undesirable because the first person thought they committed,
successfully when in reality their transaction was erased without anyone's
consent.
2. Reject both rows, if I can't make everyone happy, I'm not letting anything
through, and log the conflict to an external table to be dealt with later.
The two users who thought they submitted data will find their transaction
in a queue.
3. Merge the rows, take a little from one, and a little from the other, and
create a hybrid row. Or take one or the other based on some priority system
or based on how filled out it is.
这只是冲突的一个例子。有数百种可能发生冲突的情况,你必须做好计划。
可能发生冲突的数百种情况都必须在配置表中定义补救措施:sym_conflict
。
您可以指示 symmetricDS 根据规则合并行,拒绝交易,直到有人查看了行,甚至可以对其进行编程以将婴儿和洗澡水一起倒掉。这在用户指南第 3.8 章,配置数据冲突及解决。
潜在冲突的数量取决于数据库表的配置和限制。随着您在表上添加条件和限制,潜在冲突的数量会成倍增加。如果您有唯一键,则需要为唯一键冲突做好准备并定义解决方案。如果您在其他表上有主键/外键,则需要为这些冲突制定冲突解决方案。如果您得到了 90% 的冲突但错过了一些,那么当冲突发生时,客户端和服务器上的数据库将不相同。