通过不可靠的网络连接在MySQL和SQL Server之间同步数据

时间:2012-12-14 14:31:38

标签: php mysql sql-server

这个问题涉及在两个不同服务器上同步两个数据库时实现冗余。首先,我将解释设置,以便您能够理解问题的背景。

我有两台不同的服务器,在两个不同的位置运行不同的操作系统,不同的数据库类型。

Server 1 (local server):
Windows 2003 Small Business Server OS
MSSQL DB Server
Server-Side Language - C# ASP.NET

Server 2 (website server):
Linux CentOS 6
MySQL DB
Server-Side Language - PHP

服务器1运行软件的内部管理端,服务器2运行外部网站接口(服务器2具有一些管理方面2)。不幸的是,我们在办公室经常看到宽带丢失,这意味着两台服务器之间的通信可能并不总是可行的(我们有3G宽带冗余,但动态DNS需要时间用我们的新IP地址更新DNS记录我们失去了主要的宽带)。这就是每个服务器都需要拥有自己的数据库的原因 - 因为我们不能让这两方中的一方完全脱机。

因此,我已经将它构建到两个服务器中,这两个服务器都有自己的本地数据库,但也应用任何更改到其他服务器。如果无法连接其他服务器,则会将查询保存到本地数据库,以便在其他服务器再次可用时应用查询。这留下了两个问题:

  1. 关于这样的数据库之间同步的一般观点 - 如何 我可以最好地避免在服务器时应用冲突的查询 重新连接?请参阅下面的示例1,了解我的意思。这个 问题被最小化,因为连接只应该丢失 几分钟 - 直到DNS记录更新。

  2. 在应用反向记录的查询时,我希望脚本自动应用查询(而不是必须手动启动脚本来解析反向记录的查询)。但是,我不确定如果用户在后台仍在应用后退记录的查询时导航离开页面会产生什么影响。

  3. 示例1:

    如果网站侧的用户(服务器2)更改了他们的电子邮件地址或电话号码等,并且管理侧(服务器1)上的用户更改了该用户的详细信息,则这两个查询将具有冲突的信息。当服务器重新连接时,两个查询将应用于另一个服务器 - 并且条目仍将不同步。

    P.S。对不起,这个问题太长了。

2 个答案:

答案 0 :(得分:3)

不要重新发明数据库复制。请改用数据库软件提供的那个。

但是,这意味着您应该在两端切换到相同的RDBMS。 MySQL复制在WAN连接上相当可靠,并且可以在平台和版本之间可靠地工作。

答案 1 :(得分:1)

我同意gertvdijk,最好的解决方案是在两台服务器上使用相同的RDBMS(虽然我会使用MySQL而不是MSSQL,因为它可以在两个主机操作系统上运行良好)然后使用复制软件RDBMS。

但是,如果您不愿意或无法做到这一点,我可以想到的下一个最佳替代方案是在两台服务器上创建“事务日志”。最简单的事情是捕获UTC日期/时间和要执行的SQL命令:

2012-12-14 13:42:13 UPDATE users SET email = 'me2@mydomain.com' WHERE id = 13542
2012-12-14 13:43:55 UPDATE ....
...

显然你会想要使用参数化查询而不是我所展示的 - 我更容易解释我的想法而不会陷入实施细节中。

因此每台服务器都会记录它的交易记录,然后突然失去办公室连接。几分钟后,当它出现时,两台服务器交换其事务日志并将它们与自己的事务日志合并,按UTC日期/时间戳排序所有记录。现在,您可以执行在两台服务器上发生的所有查询,而不必担心它们不同步,即使在服务器之间的连接丢失时对完全相同的列进行了更改。如果您担心在完全相同的时间更改完全相同的列,您可以将microtime放入日期/时间戳。