如何保持两个相关但独立的系统彼此同步?

时间:2008-08-17 02:57:47

标签: sql-server database synchronization distributed

我目前的开发项目有两个方面。首先,有一个公共网站,外部用户可以为各种目的提交和更新信息。然后,此信息将保存到colo工具中的本地SQL Server。

第二个方面是员工用于管理相同记录(概念上)并提供状态更新,批准等的内部应用程序。此应用程序托管在具有自己的本地SQL Server数据库的公司防火墙内。

这两个网络通过硬件VPN解决方案连接,这很不错,但显然不是世界上最快的东西。

这两个数据库是相似的,并且共享许多相同的表,但它们不是100%相同。双方的许多表格都非常特定于内部或外部应用程序。

所以问题是:当用户更新他们的信息或在公共网站上提交记录时,如何将这些数据传输到内部应用程序的数据库,以便内部员工管理?反之亦然......你如何推动员工的更新回到网站?

值得一提的是,这些更新发生的“实时”越多越好。并非它必须是即时的,只是相当快。

到目前为止,我已经考虑过使用以下类型的方法:

  1. 双向复制
  2. 双方的Web服务接口,其代码可以实现同步(实时)。
  3. 双方的Web服务接口,使用代码异步同步更改(使用排队机制)。
  4. 有什么建议吗?有没有人遇到过这个问题?你有没有想出一个适合你的解决方案?

5 个答案:

答案 0 :(得分:20)

我相信这是一个非常常见的集成方案。就个人而言,我认为使用队列的异步消息传递解决方案是理想的。

您应该能够实现近乎实时的同步,而无需复制之类的开销或复杂性。

同步Web服务并不理想,因为您的代码必须非常复杂才能处理故障情况。当一个系统重新启动而另一个系统继续发布更改时会发生什么?发送系统是否会超时?它与那些有什么关系?除非您准备丢失数据,否则您需要某种事务性队列(如MSMQ)来接收更改通知,并确保它们到达其他系统。如果任一系统关闭,更改(作为消息传递)将只会累积,一旦建立连接,重新启动服务器将处理所有排队的消息并赶上,使系统完整性更容易实现。

如果您使用.NET,有一些开源工具可以让您轻松实现这一点(特别是如果您想使用MSMQ)。

  1. nServiceBus来自Udi Dahan
  2. 来自Dru Sellers和Chris Patterson的
  3. Mass Transit
  4. 还有商业产品,如果您正在考虑商业选项,请参阅here以获取有关.NET的选项列表。当然,WCF可以使用MSMQ绑定进行异步消息传递,但是像nServiceBus或MassTransit这样的工具将为您提供一个非常简单的发送/接收或发布/订阅API,这将使您的需求变得非常简单。

    如果你正在使用Java,那么任何数量的开源服务总线实现都会使这种双向异步消息传递成为现实,例如Mule或者只是ActiveMQ。

    你可能还想考虑阅读Udi Dahan'的博客,听他的一些播客。以下是some more good resources,可帮助您入门。

答案 1 :(得分:3)

我在类似的项目中途,除了我有多个站点需要通过慢速连接保持同步(在某些情况下拨号)。

首先,您需要跟踪更改,如果您可以使用SQL 2008(即使Express版本足够,如果2Gb限制不是问题)这将大大减轻痛苦,只需打开数据库上的更改跟踪和每个表。我们在总部使用SQL Server 2008,扩展架构和SQL Express 2008在每个站点都有一组数据和有限的架构。

其次,您需要跟踪您的更改,Sync Services可以很好地完成这项工作,并支持将WCF网关用于主数据库。在此示例中,您需要使用Sync using SQL Express Client示例作为起点,请注意它基于SQL 2005,因此您需要更新它以利用2008中的更改跟踪功能。默认情况下,Sync服务在客户端上使用SQL CE,我相信在您的情况下是不够的。您需要定期运行在Web服务器上运行的服务(如果需要,可以每10秒运行一次)运行Synchronize()方法。这将告诉您的主数据库有关在本地进行的更改,然后向服务器询问所有更改。您可以设置get和apply SQL代码来调用存储过程,并且可以添加事件处理程序来处理冲突(例如Client Update vs Server Update)并在每一端相应地解决它们。

答案 2 :(得分:1)

我们有一个商店作为客户,有三个商店连接到同一个VPN 其中两家商店的计算机作为该商店的“服务器”运行,第三家商店有“主数据库” 要将所有内容同步到主服务器,我们没有最佳解决方案,但它可以工作:有一台运行应用程序的专用PC,它检查两个存储库的每个表中每条记录的时间戳,如果它与上次不同则你同步,它复制结果
请注意,这有两种方式。即如果您更新master数据库中的产品,此更改将传播到其他两个商店。如果您在其中一家商店有新订单,它将被传送到“主人” 通过一些优化,您可以让所有商店在大约20分钟内同步

答案 3 :(得分:1)

最近,我在SQL Server Service Broker上取得了很大的成功,它提供了可靠,持久的异步消息,开箱即用,但实施难度很小。

  • 设置快速,随着您了解更多,您可以使用一些更高级的功能。
  • 大多数人都不知道,它也是桌面版的一部分,所以它可以用作工作站消息系统
  • 如果你有现有的T-SQL技能,可以利用它们,因为读取和写入消息的所有代码都是在SQL中完成的
  • 速度非常快

这是SQL Server中一个大肆宣传的部分,非常值得一看。

答案 4 :(得分:0)

我想说只需要一个将pub数据库输入表中的数据复制到私有数据库挂起表中的作业。然后,一旦您更新私有端的数据,它就会被复制到公共端。如果您没有更新公共端的任何复制数据,那么它应该是一个相当简单的事务复制解决方案。