3

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

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

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. 应用积压查询时,我希望脚本自动应用查询(而不是手动启动脚本来解决积压查询)。但是,我不确定如果用户在后台应用积压查询时离开页面会产生什么影响。

示例 1:

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

PS对不起,问题太长了。

4

2 回答 2

2

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

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

于 2012-12-14T14:36:22.990 回答
0

我同意 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 日期/时间戳对所有记录进行排序。现在,您可以执行在两台服务器上发生的所有查询,而不必担心它们不同步,即使在服务器之间的连接丢失时对完全相同的列进行了更改。如果您担心在完全相同的时间更改完全相同的列,您可以将微时间放在日期/时间戳中。

于 2012-12-14T15:03:45.730 回答