负载均衡多个水平drupal实例


8

我已经使用“服务”模块开发了REST WebAPI。它工作正常。我有一个该API的客户端,该API具有预期的用法,要求我水平扩展我的Drupal实例。请注意,由于我的API的性质,需要大量的CPU和GPU资源,因此我无法使用云服务器。另外,由于我的API的性质,Drupal实例必须在Windows OS上运行。(我的应用程序只需要Win64上可用的软件。)我现在在同一位置上有一个功能强大的服务器,对于这个雄心勃勃的客户端,我计划按以下方式水平扩展硬件:

  • 一台运行HaProxy作为前端负载均衡器的CentOS服务器,
  • 首先要启动两个服务器,然后根据需要添加更多服务器,以承载Drupal的Windows Server 2008 R2服务器,
  • 一台CentOS数据库服务器为多个Drupal实例提供一个数据库,
  • 如果DB服务器1死亡,则一台以复制模式运行的CentOS数据库服务器。

我的问题与HaProxy负载平衡器的工作方式有关。我假设由Drupal实例创建的sessionId将彼此唯一。负载平衡器是否查看sessionId并将所有请求路由到生成该sessionId的同一服务器上?如果负载平衡导致每个API请求都转到不同的服务器,REST WebAPI通信将如何工作?WebAPI引用的所有数据是否都必须存储在数据库中,因为我不能确保针对同一资源的多个API请求将被路由到同一Drupal实例?


非常有趣的问题。我不禁感到这不仅仅是一个关于Drupal的问题,而是一个普遍的问题(如果我没有看错的话,它可以应用于任何使用会话身份验证的基于PHP的REST API)。如果是这种情况,则可以通过标记将其迁移到主SO站点中而受益。只是一个想法:)
克莱夫(Clive)

+1用于在其他地方查找更多信息。您可以使用大多数建议在Drupal中扩展任何PHP应用程序。由于我的评论时间太长,因此我发布了一个答案,可以帮助您找到所需的内容。
rocketeerbkw 2012年

感谢rocketeerbkw和Berdir的见解。在我对此进行的持续研究中,我了解到HaProxy不会通过粘性会话处理SSL,并且我需要对SSL使用诸如stunnel之类的东西,因为我所有的API通信都是通过SSL进行的。似乎需要更多研究才能充分了解我在这里的下一步行动。
布莱克·森夫特纳

而且更多的研究似乎表明我的配置需要看起来像第1层:防火墙服务器和隧道,第2层:负载均衡器,第3层:多个drupal Web服务器,第4层:共享数据库服务器,第5层:复制数据库服务器。并可能与tier4一起用于多个Drupal实例的共享文件存储的SAN。欢迎任何见解,面包屑或描述人们设置类似内容的网络文章。
布莱克·森夫特纳

Answers:


12

对于Drupal来说,在负载均衡器/反向代理后面具有多个Web服务器是很常见的,并且得到了很好的支持。Varnish通常在Linux世界中使用,因为当它能够实际使用时,它的运行速度非常快,这意味着匿名访问者。对于您的网站,显然不是这种情况。

默认情况下,会话存储在数据库中,所以这不是问题。需要在所有服务器上共享的唯一其他内容是公用文件目录,如果您正在使用类似的文件,则还需要其他文件(例如私有文件)。在大多数情况下,尽管有一些更高级的方法,但使用共享/分布式文件系统(例如NFS)来实现。在我涉及的一个站点上,是由另一台服务器提供的文件系统,该服务器是Drupal服务器上的NFS挂载(因此访问速度很慢),并且由Lighthttpd分发到另一个域中。但这又一次与您无关紧要,因为我想您不会处理大量图像和css文件。

正如roboteerbkw所提到的,Memcache,Redis和其他服务器都有缓存后端。到目前为止,Ive仅使用Memcache,但我最近开始研究Redis,它看起来非常有前途,但是我不确定它是否可用于Windows。但是,可以设置一个单独的Linux服务器用于缓存。Drupal 7高度依赖缓存,能够将其从数据库中删除非常重要,原因有两个:

  1. 诸如Redis和Memcache之类的工具是为基于快速键的查找而设计的,它们始终将数据保留在内存中,以使查找尽可能快。它们还内置了对配置的限制接近时自动清除旧缓存数据的支持。

  2. 甚至更重要,它有助于减轻数据库负载。完成基本设置后,添加其他Web服务器很容易。一旦开始达到单个数据库服务器的极限,事情就会变得更加复杂,您需要研究主/主复制(Drupal 7在主/从环境中并没有真正获益)。

因此,基本上只需要您自己的API。如果可能,您需要确保所有服务器上的所有内容始终可用。您可以使用数据库,文件系统或其他方式(Drupal也可以使用MongoDB存储某些数据,例如字段)。如果这不是一个选择,那么您将需要使用粘性会话,以便用户始终最终位于同一实例上。但是,您应该真正避免这种情况,因为如果其中一台服务器发生故障,那么该服务器上的所有用户都需要重新连接到另一台服务器,这可能会丢失数据。


0

默认情况下,PHP将会话存储在磁盘上。如果用户登录到服务器1,然后单击服务器2,他们将被注销。有几种解决方法:

  1. 不要将会话存储在磁盘上
  2. 确保用户始终访问同一服务器
  3. 在所有服务器上挂载共享文件系统

实现#2并回答有关HAProxy的问题;在最基本的设置中,您可以在TCP模式下运行它,并使用“源”平衡算法(http://cbonte.github.com/haproxy-dconv/configuration-1.4.html#4-balance)确保用户点击同一台服务器。您应该阅读文档以确定使用该方法是否有不利之处。

对于#1,您可以使用Redis或Memecached之类的键/值存储,所有服务器都可以连接到该键/值并检索会话。这使得会话可以非常快速地加载/保存,您也可以将其用作共享的Drupal缓存。


6
默认情况下,Drupal将会话存储在数据库中,而不存储在文件系统中。
贝迪尔(Berdir)2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.