我目前有 2 台服务器,使用 cPanel/WHM。第一台是托管在伦敦的 VPS(我们称之为“国际”),第二台是位于我所在国家的专用服务器(我们称之为“本地”)。
“local” 将拥有无限的本地带宽,但只有 1Mbps 的国际带宽。
我需要在两台服务器上托管一个网站(或者多个网站),并根据访问者的来源国为其提供服务。我的意思是,当访问者来自我自己的国家时,数据将从“本地”提供,如果访问者来自其他国家,数据将从“国际”提供。
两种类型的访问者都可以在服务器上执行读/写操作,并且我需要在两台服务器之间同步文件和数据库,因为两台服务器都会有更新的文件和数据库。
那么,关于 DNS 和同步,这怎么可能实现呢?或者说,什么是简单且可行的?有人可以指导我执行哪些步骤吗?
答案1
第一个,简单,直接,最重要的是,强壮的解决方案是放弃拥有两台服务器的计划,只在合适的中心位置运行一台机器。虽然我理解由于国际带宽受限而不在本地服务器上托管任何内容的理由,但我没有看到您的问题中有任何需要本地服务器的内容。
如果您想要本地服务器的原因纯粹是出于性能原因,我强烈建议您考虑使用本地静态资产服务器,所有动态内容都发送到伦敦。虽然 geoDNS 并不简单,但它比动态资产和数据库的强大实时同步要容易得多。许多网站(包括这个网站)都使用这种机制来提高整体感知页面速度,而且效果相当不错。
假设情况并非如此,你真的做需要两台服务器,我发现你的计划存在巨大缺陷——1Mbps 的国际带宽将被你的同步流量完全耗尽。你得祈祷你的网站不要太受欢迎,否则你会陷入痛苦之中。
就 DNS 而言,您处于相当有利的位置,因为您有一个明确定义的地址子集,您希望向这些地址提供特定记录。大概您可以从提供商那里获得一个网络块列表,其中列出了哪些流量算作“本地、带宽无限”流量,哪些流量算作“国际、1Mbps 上限”流量。如果您的提供商不能这样做的话,我会问他们到底是如何进行速率限制的,因为那里肯定有一个列表。最坏的情况是,如果他们只是根据“我们看到的通过此 BGP 链接宣布的任何内容都是本地的”来做到这一点,您仍然应该能够获得该链接上的前缀列表。
因此,DNS 内容归结为“对于A
记录请求,如果源地址在本地前缀列表中,则www.example.com
提供服务,否则”。如何为给定的 DNS 服务器编写脚本取决于您;我会选择,因为我会用它做所有我能做的事情,而且它在这个特定任务上表现得非常棒。localip
internationalip
tinydns
但这只是整个问题的 1%。动态资产方面的问题要大得多。
数据库实际上是(相对)简单的部分。MySQL 和 PostgreSQL 都支持多主复制,即对任一数据库的写入都会自动复制到另一个数据库(或多或少)。设置起来并不简单,你需要密切监视它以检测它何时出现故障并修复它,但它是以一种相当标准化的方式实现。
另一方面,您的文件需要更多的本地智能。要实现这一点,您需要正确设计文件存储以允许复制工作。这更有趣,因为您说您需要支持删除。
确实,定期 rsync 是您最好的选择。暂时忽略事物的修改和删除方面,如果您确保文件名不会在两端发生冲突(使用 UUID 或数据库 PK 作为所有文件名的基础会很好),您应该能够定期将每一端 rsync 到另一端,并且每一端创建的所有新文件都会神奇地出现在另一端。您执行 rsync 的频率取决于在所有内容同步之前您可以忍受多长时间——这是您必须做出的决定。您的应用程序还需要智能地处理(例如)数据库记录已同步但文件尚未同步的情况。
删除使事情变得更加困难,因为您不能盲目地运行,rsync -a --delete
因为发送方没有的任何东西都会从接收方删除——这是一种丢失大量数据的好方法。我更喜欢有一个删除日志,不时地浏览它并从另一端删除东西。如果这不吸引人,您可以更花哨地在两端使用两个单独的文件系统(一个用于“本地数据”,另一个用于“另一端的副本”),然后从您的应用程序访问它们,或者使用联合文件系统层使它们看起来像一个文件系统到网络服务器。
修改完全是一场噩梦——您的风险是同时修改两台服务器,此时您就完蛋了。在您使用的“最终一致性”模型中(对于您不得不处理的地理分布、高延迟复制系统,这是唯一的选择),您根本无法在基础设施层面处理这个问题——您必须在应用程序上做出某种妥协来决定如何处理这类问题。您可以通过将文件系统视为仅附加存储(如果您想修改文件,您可以编写新版本并更新数据库以指向新记录)来帮助解决这种情况,但由于您的数据库也只是最终一致的,因此您无法完全解决问题。不过,至少如果您的数据库是唯一的事实点,那么即使不能保证正确性,您也能保证一致性,这已经是成功的一半了。
我认为这几乎涵盖了一切。不过,重申一下,如果你不必须使用地理分布的服务器。如果你实施这个是因为“听起来很酷”,那就远离键盘。如果你想做很酷的事情,那就在自己的时间里做,或者作为科学实验。你拿钱来做对雇主最有效的事情,而不是让你成为怪人的事情。