如何在有非常大的数据库时快速登录?

问题描述:

我一直在想,当我试图登录我的Gmail或Facebook时,登录操作如此快速地执行如何。我的意思是,例如,Google拥有的服务器数量超过了一百万台, 3秒钟登录。我现在没有对这些大数据做任何事情,但我可能会迟一些,所以我现在想在有空的时候透露一下这项技术。如何在有非常大的数据库时快速登录?

请仔细阅读以下内容,我知道我的理论是否正确(至少是其中的一部分)。 我的想法是服务器遍布各个国家。假设有100台服务器在英国。当我尝试登录时,它只知道我在哪里,并将我的用户名和密码传递给这些服务器。在数据库中找到我的第一台服务器将作出响应。

这种方法切断了大量的数据进行检查。但是当我移居美国时,如何知道在哪里搜索? ...以及服务器如何处理数千个用户同时登录的问题?

Google几乎将数据复制到全球所有数据中心。这是Google速度的主要原因。如果您从英国转移到美国,数据将不会在美国上市。只要您在美国首次登录,就会调用最近的服务器,然后再查找登录历史记录并复制来自英国服务器的所有用户数据。

注:喜欢你的,甚至我的是不是证明了一个理论,因为谷歌从来不公开这些机制

+0

接下来的问题是如何做的改变,当他们处理无效的旧密码。我猜想密码更改可能是一个后台进程,在某些服务器上可以接受的小延迟,他们在全局范围内告诉每个“本地”节点旧密码现在无效。 – Seph 2012-03-26 06:35:48

我不知道他们是怎么做到的,但是有很多技术来传播负载。一个特别简单的解决方案是使用您的用户名的散列来查找保存凭据的分区。

如果您想要对auth服务器进行地理定位,可以在GeoIP数据库(如MaxMind's)中查找原始IP。当找到本地服务器时,如果它没有用户的信用,它可以从*服务器场进行一次性慢速获取。

马塞洛的分区是正确的。大多数现代大型数据库都支持以这种方式分割数据。

要回答您的问题的其他位,无论如何默认情况下您的数据都可以复制到多个物理位置以实现冗余。在你的IP上使用地理查找可以暗示哪些服务器最接近发送查询。或者,您可以使用map-reduce类型的解决方案 - 将作业发送给几台服务器,然后只是先回答问题。

确保从RAM(通过缓存)而不是从保存数据库的磁盘中满足您的查询,这往往会产生显着效果。