我有一个使用 ASP.NET 开发的网站,我的数据库是 MySQL。目前它托管在美国服务器上。但是当我尝试在印度附近访问它时,动态内容加载速度太慢了。这是可以接受的,因为请求必须发送到世界另一端。在美国,它真的很快。我已经将此站点与 cloudflare CDN 连接起来。但 CDN 对静态内容很有用。我的每个页面几乎都有动态内容。
所以我想扩展这个网站。因此,如果请求来自美国,我希望从美国服务器处理该请求,如果请求来自亚洲,我希望从亚洲服务器处理该请求。但请记住,无论它们被重定向到哪里,两台服务器上的内容都应该相同。(两台服务器应该同步)
那么如何实现这个架构呢?
谷歌、Facebook、雅虎是如何做到这一点的?他们如何在全球范围内提供服务?我认为他们在各大洲都有数据中心。他们如何相互同步?
答案1
除了@Gabriel-Talavera 的回答之外,我还要补充几点:
- 网络路由和地理负载平衡与不同服务器之间的“数据同步”完全无关。它们是两个用许多非常不同的技术解决的问题。
由于您的问题的标题似乎集中在网络方面,我将重点关注第一部分(网络路由问题)。
- 从严格的网络角度来看,跨多个位置/数据中心的负载分配可以通过“任播寻址“。关于任播的有用讨论可以在其他 SF 帖子中找到:
正如您所看到的,小型 ICT 公司很难满足这些要求。但“全球性”公司(如您在原帖中提到的公司)采用它不会有问题。
顺便说一句,我第一次听说“任播”是因为CloudFlare 博客文章,他们在会上讨论了(...以及许多其他事情)如何采用任播作为应对 D-DOS 攻击的对策。
答案2
你可以给予选择性 DNS 响应如果您使用 BIND 作为外部 DNS 服务器,则可以使用 BIND Views 根据位置进行搜索。新版 Windows Server 的技术预览版还具有一项名为DNS 策略这看起来非常有希望。
为了根据客户端位置和其他标准(例如用户代理或时间表)提供内容,F5 有一个名为 Global Traffic Manager 的设备,该设备与其负载平衡器结合使用可实现您的目标。在云环境中,Amazon 的 Route 53 可以实现相同的功能。
为了保持数据同步,您必须有一个能够进行同步复制的存储后端,或者使用 MySQL 提供的复制,这将使复制的数据保持一致。
答案3
在某些情况下,您可能希望:
- 可序列化事务的数据完整性保证。
- 数据可由全球用户更新。
- 数据可以低延迟地更新。
不幸的是,以上所有情况的组合在物理上是不可能的。你将受到光速的限制。
相反,你需要考虑你的确切要求。对于某些数据,有限的准确性就足够了。考虑一下 YouTube 视频的观看次数计数器。大多数人并不关心观看次数计数器是否暂时有点偏差。如果尚未包括 10 秒前在世界另一端发生的观看次数,但包括了 5 秒前更近的观看次数,它仍然足够准确。如果你对观看次数计数器的完整性如此放心,那么你就冒着两个不同的人都认为他们是该特定视频的第 100 位观众的风险。但大多数人会认为这造成的伤害可以忽略不计。
在其他情况下,数据完整性更为重要。假设有两个人同时尝试使用同一个用户名进行注册。告诉这两个人他们获得了用户名是不可接受的,因此在这种情况下,您可以选择一种更慢但更完整的方法。告诉这两个人用户名已被使用是可以接受的,因此一种可能的方法是尝试在每个副本上保留用户名,并且只有在超过 50% 的副本上成功时才报告成功。这种方法很可能会让用户等待半秒钟才能得到回复。但用户不会经常经历这个过程,因此不会受到这种延迟的困扰。
在其他情况下,您可能需要良好的完整性和快速更新,但只有一个人可以更新此特定数据。在这种情况下,您可以将数据的权威副本放在您认为靠近该用户的服务器上,并让其他服务器拥有缓存版本,该版本基本是最新的。