CMS和高流量网站:PHP和MySQL

3

CMS和高流量网站(如新闻门户网站)在逻辑和数据库设计以及优化(PHP和MySQL)方面有什么区别吗? 我在stackoverflow上搜索了php网站可扩展性memcached占据了大多数。 是否有MySQL优化技术?(我正在寻找一本关于此问题的书。我在amazon上搜索过,但我不知道最好的选择是什么。) 提前致谢。


你有什么具体的问题? - OMG Ponies
一般来说,CMS 的优化选项更加受限,但其思路是相同的。 - arthurprs
"高流量" 是什么意思?像 Google 新闻之类的应用会使用不同的数据库架构(不是 MySQL),但这一切取决于数据量、流量、应用的目的等因素。 - bjudson
2个回答

5
这并不是一个简单的问题。有不同的方法和各种不同的意见,但我会尝试涵盖一些常见的情况。首先介绍一些基础知识。
大多数Web应用程序可以分为应用程序和数据库两个部分。数据库使用可以分为事务性(OLTP)和分析性(OLAP)。
在最好的情况下,您可以启动多个应用程序服务器并在它们之间分配流量。它们都连接到同一个数据库服务器并可以独立工作。然而,如果您有其他共享数据、会话等,则可能会很困难。您可以通过在DNS中为域名添加多个IP地址来实现这一点。或者您可以使用负载均衡技术将客户端转发到不同的服务器。
应用程序扩展通常非常容易,但数据库则更加复杂。通常要做的第一件事是设置一个或多个副本服务器,它们与主数据库具有相同的数据。它们可以级联,但有一个严重的缺点。它们的数据不总是最新的。一般来说,不超过几秒钟,但在负载下可能会更长。但对于许多用例来说,这是可以接受的。只需将其数据库复制到一些从服务器上,设置一些应用程序服务器(在同一台服务器上运行一个从服务器和一个应用程序服务器是一种好的做法,并让此应用程序服务器访问该数据库从服务器),就可以了。
每个OLAP查询都可以定向到一个从服务器。OLAP查询是那些不修改任何内容且不需要100%更新数据的查询。
因此,所有内容都需要写入完全相同的数据库源服务器,从中获取其副本的每个其他服务器。例如,每篇文章的每个评论。
如果这个瓶颈变得太紧,您可以朝两个方向走。
分片意味着您在应用程序服务器上决定存储和获取数据的位置。例如,以a开头的每个评论都进入a服务器,以b开头的都进入b服务器,依此类推。这是一个愚蠢的例子,但基本上就是这样。通常涉及一些内部ID。如果可能的话,最好对数据进行分片,以便可以完全从该服务器中提取它。在上面的例子中,如果我想要一篇文章的所有评论,我将不得不询问每个服务器a-z并合并结果。这是低效的,但是可能的,因为这些服务器可以被复制。这被称为映射(您可以查看著名的Google MapReduce算法,它基本上就是这样)。
主-主复制意味着您将数据写入不同的主服务器,并使它们相互同步,而不像分片那样单独存储。如果您的应用程序无法自行决定存储和提取数据的位置,则必须执行此操作。您只需存储到任何主服务器,每个服务器都会得到所有内容,每个人都很高兴?不是这样的...因为这涉及另一个严重的问题。冲突!想象两个用户输入一个评论。评论A存储在服务器A上,评论B存储在服务器B上。我们应该使用哪个ID?哪个先出现?最好设计一个应用程序来避免这种情况,并具有不同的密钥等内容。但通常发生的是冲突解决、优先级等事项。Oracle 在这个层次上有很多功能,而 MySQL 还落后。但趋势正在走向更复杂的数据结构,比如云...... 嗯,我觉得我解释得不好,但您至少可以从文本中获得一些关键词,可以进一步调查。

1
非常感谢您的出色回答。 您能否为这个问题提供一个资源? - TheNone
我的解释特别是在主从复制方面的表述非常差,我会找一些好的资源来补充。 - The Surrican

1

当然,您可以采取各种方式来优化 PHP/MySQL 网站应用程序以应对高流量网站。然而,大多数方法都取决于您的具体情况,而您在问题中并未提供。

无论您是否拥有高流量站点,数据库都应该被良好构建。如果您使用现成的 CMS,则通常不需要过多关注此问题。除了良好的应用程序架构之外,没有一种通用解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接