假设...我从澳大利亚登录一个 Web 应用并更改了一些数据。在美国,我的同事使用相同的系统,并希望查看我更改的数据。如何才能将 Web 应用部署到本地供澳大利亚用户使用,并将美国用户部署到本地(以提高性能),但共享数据?
Google、Facebook 或任何其他全球系统如何为不同国家/地区的用户提高性能,同时在用户前往不同地点或数据在全球范围内使用的情况下保持数据同步。或者他们实际上是否将数据库服务器放在一个位置?
答案1
对于 Facebook、Google 等公司来说:数据库服务器并非全部位于同一位置,而且当然也不是全部始终保持同步。它们都采用分布式系统,在多个服务器集群上为不同的地理区域提供服务。
集群分布在许多国家。集群之间的更新频率取决于系统可接受的工作需求。
以 Facebook 为例:大多数时候,您与自己国家的朋友交流。因此,将服务器保留在您的国家/地区将产生立竿见影的效果,您的朋友将立即看到您的消息。
其他国家/地区的朋友可能会有延迟,具体取决于集群服务器节点的更新频率。如果我没记错的话,Facebook 集群会在需要时通过向其他集群请求信息进行交互。很多次我收到一条消息,内容是“此用户将状态更新为 blah blah”。单击整个消息的链接时,我收到一条错误消息。这是集群之间的同步问题。一些信息已同步,而其他信息尚未同步。
如何构建基础设施取决于有多少用户、数据需要同步的频率等等。
另一个例子是电子邮件:电子邮件系统是遍布全球的分布式系统。与拥有 100 万用户的服务器相比,拥有单个用户的服务器并不那么繁忙。您将如何解决繁忙服务器的交付问题?更分散的本地服务器?更强大的服务器?更强大的互联网连接?以上所有?由于电子邮件的基本概念(将消息从一个节点传递到另一个节点)无论电子邮件用户数量如何都不会改变,因此您需要设计特定的系统来适应所有用户。无论您如何设计系统,有时电子邮件交付延迟,因为链中其他节点的流量太大。
同样的理念也适用于 Facebook。他们为特定地区设计和构建农场,但整个系统依赖于“地理差异”。也就是说,与其他地区相比,你更有可能与自己地区的用户互动。
至于您的具体问题:这完全取决于有多少用户。
单个数据库服务器(或集群服务器)可能适合您。如果需要分布式集群服务器场,那么您可能必须像 Facebook 和 Google 那样编写自己的同步系统。此解决方案取决于您的用户需要什么以及系统打算如何工作。我不知道有任何标准化系统是“适用于所有人”的解决方案。
我已经在这里咆哮了很多次了,现在已经很晚了,我可能完全偏离了目标,但嘿,这是我的一点看法。
干杯!
答案2
不确定这有多大的建设性,但是谷歌声称拥有近乎实时的同步性。他们甚至在数据中心拥有自己的原子钟,以确保正确同步。Wired 有一篇文章对此进行了介绍:
http://www.wired.com/wiredenterprise/2012/11/google-spanner-time/
答案3
这是一个众所周知的 CS 问题,由 Eric Brewer 总结为 CAP 定理。
然而,谷歌似乎已经解决了这个问题,谷歌扳手现已公开发布https://cloud.google.com/spanner/
如果您尚未准备好使用 spanner,那么您应该考虑数据需求的指导原则。一致性、可用性或性能。(CAP)
关于这一点已经有很多文章和设计模式,因此我就不在这里重述了。