在webfarm上运行Drupal应用程序(可伸缩性),怎么样?

时间:2010-10-29 14:30:02

标签: php drupal scalability

我们已经使用Drupal创建了一个网站,但问题(好问题)是我们在服务器上获得WAAAAYY太多点击,以至于流量正在使服务器瘫痪。

现在我们想要在负载均衡器后面的3台服务器上运行应用程序,一台只服务于mysql,另外两台服务于Web应用程序,我之前使用Symofony为不同的项目完成了这项工作,而且相对简单。

但是我似乎无法与Drupal达成共识,此时的主要问题是能够将所有会话变量保存到mysql中,因此负载均衡器将请求发送到哪个服务器,应用程序在会话方面有一个参考点。

任何帮助将不胜感激,我正在寻找一个很好的教程或文档,因为我从一个不再在这里工作的人继承了这个项目:/

谢谢

4 个答案:

答案 0 :(得分:6)

注意:在我的回答中我假设您正在使用Apache。即使你正在使用像nginx等其他服务器,我的答案也是正确的。

你写道:

  

但是我似乎无法得到   与Drupal一样,主要问题在于   这一点是能够保存所有   会话变量进入mysql,所以   独立于哪个服务器负载   平衡器发送请求,   应用程序有一个点   关于会议的会议参考的参考。

会话是在Drupal + MySQL级别的核心PHP级别处理的。实际上,当浏览器访问您的服务器时,PHP核心会话处理逻辑会分配一个唯一的PHPSESSID cookie。该cookie由每个后续请求发回。

[侧面说明,使用PHPSESSID,PHP核心会话逻辑可能会关联一些其他数据,如评论首选项,需要在下一页视图中显示的drupal消息等。所有这些都是使用$ _SESSION PHP变量完成的。 PHP非常无缝地完成这项工作。请注意,在此之前,MySQL 仍然不会进入图片。当Drupal需要将其他数据与PHPSESSID(例如用户ID等)相关联时,MySQL才会输入图片。

长话短说,PHP通过分配PHPSESSID cookie来完成一些会话处理。现在假设负载均衡器将请求发送到Apache Webserver 1并且mod_php(PHP apache模块)分配一个唯一的PHPSESSID,例如“563”(它在现实生活中是一个更长的字符串)。现在,下次此客户端访问您的网站时,Cookie值PHPSESSID将以值563发送。现在可能会出现两种不同的情况:

  1. 负载均衡器(同时)将请求发送到最初分配了PHPSESSID cookie的Apache 1。它识别567并且工作正常
  2. 负载均衡器将请求发送到Apache 2. PHPSESSID是567,Apache 2 mod_php从未分配过。因此它会混淆并指定一个新的PHPSESSID。这就是你的问题发生的地方。
  3. 如何解决问题:您遇到的问题是一个常见问题。您只需告诉负载均衡器,一旦客户端被发送到特定的Web服务器,相同的 Web服务器应该继续处理该请求。这通常是通过告诉负载均衡器本身发送一个cookie来说明哪个服务器处理初始请求来完成的。将来,客户端会将此cookie提供给负载均衡器,负载均衡器会将请求定向到处理请求的原始服务器。这正如我在上面解释的那样重要,因为只有 服务器知道它分配的PHPSESSID。

    所有体面的负载均衡器都能够分配cookie。查找有关会话的负载均衡器。参考的配置详细信息。

    更多精神错乱的东西在通过配置负载均衡器来分配Cookie来解决会话问题后,您需要考虑一个更重要的问题。您的服务器的files文件夹必须以某种方式共享。这是有道理的。如果用户在一台服务器上上传图像,则通过另一台服务器访问该站点的其他人应该可以访问同一图像。这是通过NFS (Networked File System)安装或SAN实现的。

    只有然后您将拥有一个功能齐全的Drupal多服务器安装。正如其他人所指出的那样,您可能希望在网上引用一些参考文章。建议进一步优化,例如将会话表存储在memcache而不是MySQL中,但这又与我上面写的内容无关。实际上需要负载均衡器发行cookie。

    为什么我要经历这么多的悲伤?我过去做过多服务器的东西,除非你的网站有一些严重的流量,否则它不值得。你的交通量足够大吗?如果你的大多数用户都是匿名的,那么使用boost模块在​​Drupal前面建立一个像Varnish这样的缓存层甚至更好,可以解决你的问题。

    观看此视频http://sf2010.drupal.org/conference/sessions/24-million-page-views-day-60-m-month-one-server。这家伙只使用一台服务器提供了大量的页面浏览量。使用一台服务器,一切都变得如此简单。试试看!只有最大的网站可能需要多台服务器。

答案 1 :(得分:1)

答案 2 :(得分:1)

答案 3 :(得分:0)

有个好问题。不是一个简单的答案。

您是否看过memecached可以提供帮助的缓存。

可以在Drupal前使用varnish进行某些缓存。

当然我假设您已经调整了性能设置。对于正常甚至积极的缓存,如果可以的话。

对于会话,您可以将负载均衡器设置为粘性会话,以便用户将gonig保持在同一服务器上。您甚至可以使用清漆作为负载均衡器。