这不是那么容易回答。
有不同的方法和各种意见,但我试图涵盖一些常见的场景。但首先是一些基础知识。
大多数 Web 应用程序可以分散在应用程序和数据库中。
数据库使用可以分为事务性(oltp)和分析性(olap)
在最好的情况下,您可以启动多个应用程序服务器并在它们之间分配流量。它们都连接到同一个数据库服务器,并且可以独立工作。
但是,如果您有其他共享数据、会话等,这可能会很困难。
您只需在 dns 中将多个 IP 地址添加到您的域名即可完成此操作。
或者您使用负载平衡技术来转发客户端做不同的服务器。
应用程序扩展通常非常容易。数据库要复杂得多。
首先要做的通常是设置一个或多个与主数据库具有相同数据的复制服务器。它们可以级联,但有 1 个严重的缺点。他们的数据并不总是最新的。通常不会超过几秒钟,但它可能会在负载下更多。但对于许多用例来说,这很好。
仅显示信息的大型站点可以将其数据库复制到一些从属服务器,设置一些应用程序服务器(在同一台服务器上运行一个从属服务器和一个应用程序服务器并让该应用程序服务器访问该数据库从属服务器是一个很好的做法)和每个没问题。
每个 olap 查询都可以定向到从站。 olap 查询是那些不修改任何内容并且不需要 100% up 2 日期数据的查询。
所以所有内容都需要写入同一个数据库源服务器,其他所有服务器都从该服务器获取副本。例如文章的每条评论。
如果这个瓶颈变得太紧,你可以朝两个方向发展。
- 分片
- 主-主复制
分片意味着您决定应用程序服务器将数据存储在何处以及从何处获取数据。
例如,每个以 a 开头的评论都会到达服务器 a、b-> b 等等。
那是一个愚蠢的例子,但它基本上是这样的。主要涉及一些内部ID。
如果可能的话,最好对数据进行分片,以便可以完全从服务器 agani 中提取数据。
在上面的示例中,如果我想要一篇文章的所有 cmets,我将不得不询问每个服务器 a-z 并合并结果。这是低效但可能的,因为可以复制这些服务器。这称为映射(您可以查看著名的 google map-reduce 算法,它基本上就是这样做的)。
主-主复制意味着您将数据写入不同的主服务器并且它们彼此同步,并且不像您进行分片那样单独存储。
如果您的应用程序无法自行决定在哪里存储和获取数据,则必须这样做。
您只是存储到任何主服务器,每台服务器都得到一切,每个人都开心吗?
不……因为这涉及到另一个严重的问题。
冲突!想象两个用户输入评论。 commentA 存储在 serverA 上,commentB 存储在 serverB 上。我们应该使用哪个 id。哪个先来?
最好的方法是设计一个应用程序来避免这种情况,并具有不同的键和东西。
但通常发生的是冲突解决、优先排序等等。 oracle 在这个级别上有很多特性,而 mysql 仍然落后。但趋势正在进入更复杂的数据结构,例如云计算...
好吧,我认为我解释得不好,但您至少应该从文本中获取一些关键字,以便 oyu 可以进一步调查。