2011-10-20 25 views
1

这是我真的很好奇,我真的不明白这是怎么可能的。当我的PHP网站开始拥有很多会员时会发生什么?

因此,可以说,我的Facebook(AHAH)的所有者,并且我有人访问我的网站的图片,视频,日志等,每天,成千上万亿..

我如何保存这一切数据?

我有更多的数据库在世界各地的不同服务器上,然后我从一个位置连接到它们吗?

我是否使用内部API系统从其他存储数据的服务器请求信息?

比如我知道,Facebook有很多世界各地的数据中心和数百台服务器的..

他们如何连接到这些服务器?配置文件是否存储在不同的位置,当我连接到我的配置文件时,我将使用该特定的服务器?或者是否有一台主服务器可以得到全球其他数百台服务器的支持?

有没有一种方法使用PHP,我将连接到不同的服务器和不同的mySQL(???)数据库以随时存储和检索数据?

对不起,如果这看起来像一个愚蠢的问题,但因为它可能发生一天在一个成功的网站上工作,我真的想知道我将不得不做什么,背后的逻辑是什么。

非常感谢。

+0

最终你会意识到MySQL是一条狗,并开始寻找不同于NoSQL数据库的东西。与此同时,您将开始寻找另一种更高效的编程语言。 –

+1

看起来Facebook仍然使用PHP作为其主要编程语言,因此必须足够高效。 –

+0

虽然他们使用他们自己的HipHip库将它(某些?)转换为C++。 – TJHeuvel

回答

9

我会尝试回答你的(大)问题,但不是从Facebook的角度来看,因为他们的架构是众所周知的。

首先你必须知道的是,你将不得不分发你的web应用程序的工作量。问题在于如何,所以为了确定什么会很慢,你必须分段划分你的应用程序。

首先是HTTP服务器,或接受所有请求的服务器。通过访问“www.your-facebook.com”,您可以联系IP上的服务。当然,你可能会有多个IP,但我们假设你有一个入口点。

现在会发生什么?你有一个HTTP服务器软件,比方说Apache和它处理传入的连接。由于Apache为每个连接的用户创建一个线程,因此它需要一定量的内存用于该操作。最终,它将耗尽内存,然后狗屎击中风扇,东西停止工作,您的网站不可用。 因此,你必须以某种方式扩展你的应用程序的这一部分,它将你的PHP代码/ MySQL数据库连接到想要与之交互的人。

让我们假设你成功地扩展了你的Apache,并且你有一个可以接受新计算机以扩展的计算机集群。你解决了你的第一个问题。

下一部分是做这项工作的实际层。接受来自用户的输入并将其保存在某处(MySQL),这是您将遇到的最大问题 - 为什么? 由于数据库。

数据库将数据存储在介质(如硬盘驱动器)上。硬盘,无论是SSD还是机械硬盘,都受限于其写入或检索数据的能力。如果我没有弄错,RAM的传输速率大约为6GB /秒。更不用说寻找时间也远远低于HDD的寻找时间。因此,如果您有X个用户要求提供一条信息,并且您只能以特定的速度提供它 - 您的应用程序崩溃,或者它变得没有响应,并且处理数据库查询的层变得很慢,因为硬件无法匹配您需要数据的速度。

这里有什么选择?有很多,我不会提及他们所有人

  1. 拆分读取和写入。设置你的数据库层,使得你有专门的机器来写数据,而完全不同的机器读数据。你必须使用复制和复制有它自己的怪癖 - 它永远不会破坏。

  2. 通过分解数据来优化数据集的处理。非常适合读/写性能,当您需要查询多个分片并合并数据时会搞砸了。

  3. 获取更好的硬件,特别是存储(如FusionIO

  4. 收费更好的存储引擎(如TokuDB

  5. 通过使用缓存减轻数据库的负载。您的用户请求的数据可能不会经常更改,因此您必须每次查询数据库(例如,您正在查看某人的个人资料,他们每秒钟会更改它的机会有多大?)。这就是为什么Facebook广泛使用Memcached的原因 - 一种将小块数据存储在RAM中的系统,它可以轻松扩展,而不是什么。最重要的是,它该死的快!

  6. 在MySQL旁边使用不同的解决方案。 MySQL(以及其他一些数据库)不适合每种数据存储或检索。有人提到过NoSQL。 NoSQL解决方案很快,但仍然不成熟。它们不如关系数据库那么多。他们使用延迟磁盘写入的方法(它们保存需要在RAM中写入的数据的缓存副本),以便它们可以实现快速插入速率。这就是为什么在使用NoSQL时丢失数据并不罕见。

主题有关MySQL与“插入数据库或任何这里”是广泛的,我不想去成,但要记住 - 数据存储的每一个在那里最终在硬盘上保存数据。不同的(当然是物理)是他们如何优化自己对磁盘的冲洗。

我也没有提到你可以通过收集数据运行的各种报告(有多少19至21岁的男人在01:15和13:37 CET之间点击了广告X等),这是Facebook实际上是什么收集(可怕的东西!)。

第三种 - 粘合数据存储(MySQL)和输出(HTTP服务器)的语言。 PHP

正如您所看到的,这里的大部分工作已经由Apache和MySQL完成。 PHP级别的优化很小,即使Facebook得到的结果很小(他们声称有50%,但是高达50%)。我广泛试用HipHop,但速度并不像它声称的那么快。当然,Facebook的人已经提到过,所以这也就不足为奇了。他们获得的好处是因为他们用自己的内置HipHop的服务器取代了Apache。有人声称“语言X比语言Y好”,他们是对的,但情况并非总是如此。每种语言都有其优点和缺点。例如,PHP广泛传播,但对于某些操作(例如,实施具有超过10亿条目的Trie)的缓慢。在分析db输出后回显一些HTML是非常棒的。从数据库插入和检索数据很快,大约占用PHP的90% - 与db交谈,显示数据,结束。

因此,无论您使用何种语言(比如我们使用C++而不是PHP),您的瓶颈将是数据存储/检索层。

另一方面,为什么使用C++不方便?因为知道如何使用PHP的人比使用C++的人多。在C++中开发Web应用的速度也慢得多。当然,他们会更快地执行,但谁会注意到1毫秒和1微秒之间的差异?

这篇文章更像是一篇翔实的博客文章,我知道它没有充足的资源来备份我的声明,但任何使用大型数据集或网站做任何工作的人都会知道P.I.T.A.始终是数据存储组件。我说过的一些东西可能不适合所有人,但在NUTSHELL中,这是您如何优化网站的方式。

0

不幸的是,你的问题没有一个简单的答案。对于它的MySQL部分,您需要调查数据库横向扩展。您可以从这里开始查看:http://www.mysql.com/why-mysql/scaleout/mixi.html。在服务器场中设置Apache/PHP网站有多种不同的方法。其中之一涉及设置循环赛DNS。这是添加一个DNS记录与许多不同的IP地址。每次请求记录时,您的DNS会发出一个不同的IP地址,以便在多个服务器之间平衡负载。您还可以使用MySQL,Apache和Heartbeat来设置群集,但与缩放解决方案相比,这更像是高可用性解决方案。

0

当你有一个拥有这么多用户的网站时,你已经有足够的经验来知道问题的答案,你还可以花很多钱去找人找到你系统的最佳体系结构。

我不是说我下面介绍的就是圣杯,但它肯定是一个选项:

你必须有很多备份的一个大的,碎片化的数据库,你就会有几个名字服务器将知道服务器的位置以及有关存储在每台服务器上的数据的一些规则。当数据被搜索时,查询将被发送到名称服务器,该名称服务器将找到可以为特定查询找到答案的服务器。我也提出了N.B.的答案,我认为他大部分都是对的。

0

对于大量的用户,你应该有一个服务器有很多的内存和速度。配置php.ini以允许更多的内存使用。有大量用户的服务器应该有4-12GB可用。另外,通过关闭桌面环境来节省资源。如果你有这么多的用户,你可能想考虑一个CDN并且创建一个数据库请求队列。

相关问题