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