当我的PHP网站开始有很多成员时会发生什么?

Die*_*oP. 1 php mysql bandwidth

这是我真正好奇的事情,我真的不明白这是怎么可能的.

所以我要说我是Facebook(ahah)的所有者,我每天都有数百万人访问我的网站,成千上万的图像,视频,日志等.

如何存储所有这些数据?

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

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

例如,我知道Facebook在全球拥有大量数据中心和数百台服务器.

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

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

对不起,如果这看起来像一个愚蠢的问题,但由于它可能会在一个成功的网站上工作一天,我真的想知道我将要做什么,以及背后的逻辑是什么.

非常感谢你.

N.B*_*.B. 9

我会尝试回答你的(大)问题,但不是从Facebook的角度来回答,因为他们的架构非常有名.

首先要知道的是,您必须分配Web应用程序的工作负载.问题是如何,所以为了确定什么会变慢,你必须分段你的应用程序.

首先是HTTP服务器,或接受所有请求的服务器.通过访问"www.your-facebook.com",您正在联系IP上的服务.当然,您可能拥有多个IP,但是假设您有一个入口点.

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

假设您成功扩展了Apache,并且您拥有一组计算机,可以接受新计算机以进行横向扩展.你解决了第一个问题.

下一部分是完成工作的实际层.接受来自用户的输入并将其保存在某个地方(MySQL),这是你将遇到的最大问题 - 为什么?由于数据库.

数据库将其数据存储在诸如硬盘驱动器之类的介质上.硬盘驱动器,无论是SSD还是机械硬盘驱动器,都受到写入或检索数据的能力的限制.如果我没弄错的话,RAM的运行速度大约为6GB /秒.更不用说寻道时间也远远低于HDD的寻道时间.

因此,如果您有一定数量的用户要求提供一条信息并且您只能以一定的速率交付 - 您的应用程序崩溃,或者它变得无响应,并且由于硬件无法与速度匹配,因此层处理数据库查询变得缓慢你需要数据的地方.

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

  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% - 与数据库通信,显示数据,结束.

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

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

这篇文章更像是一篇内容丰富的博客文章,我知道它没有充足的资源来支持我的声明,但任何使用大型数据集或网站工作的人都会知道PITA始终是数据存储组件.我说的一些事情可能不适合所有人,但在坚果中,这就是你如何优化你的网站.