在预算上负载平衡Apache?

我试图让我的脑海中围绕负载均衡的概念来确保可用性和冗余性,以便在出现问题时保持用户满意,而不是为了给数百万用户提供高速度的负载平衡。

我们正在做预算,并试图坚持可用的知识丰富的东西,所以在Ubuntu VPS上运行Apache看起来像一个着名的search引擎收购我们( 周六反讽,请注意 )的战略。

至less对我来说,这是一个可用的不同解决scheme的完整丛林。 Apaches自己的mod_proxy&HAproxy是我们通过快速的谷歌searchfind的两个,但没有负载平衡的经验,我不知道什么适合我们的情况,或者我们select一个解决scheme来解决我们的问题可用性问题。

什么是我们最好的select? 我们应该如何提高可用性,同时留在预算内?

我使用的解决scheme可以通过VPS轻松实现,具体如下:

  • DNS被循环(sp?)为6个不同的有效IP地址。
  • 我有3个相同configuration的负载均衡器,并使用corosync / pacemaker来均匀分配6个IP地址(因此每台机器可以获得2个地址)。
  • 每个负载平衡器都有一个nginx + 清漆configuration。 Nginx处理接收连接,并进行重写和一些静态服务,并将其传递给进行负载平衡和caching的Varnish。

在我的偏见中,这个拱门有以下优点:

  1. corosync / pacemaker会重新分配ip地址,以防其中一个LB失败。
  2. nginx可用于直接从文件系统或NFS直接提供SSL,某些types的文件而无需使用caching(大video,audio或大文件)。
  3. 清漆是一个非常好的负载平衡器,支持重量,后端健康检查,并作为反向代理做出色的工作。
  4. 如果需要更多的LB来处理stream量,只需在集群中添加更多的机器,IP地址将在所有机器之间重新平衡。 你甚至可以自动执行(添加和删除负载平衡器)。 这就是为什么我使用6 ips的3台机器,让一些成长的空间。

在你的情况下,物理上分离VPS是一个好主意,但是使得IP共享更加困难。 目标是具有一个故障抵抗,冗余系统,以及负载均衡/ HA端的一些configuration,增加单点故障(如单个负载均衡器接收所有stream量)。

我也知道你问过关于apache的问题,但那些日子里我们有了更适合这个工作的特定工具(比如nginx和varnish)。 让Apache在后端运行应用程序,并使用其他工具提供服务(不是说apache不能做好负载平衡或反向代理,只是将工作的不同部分卸载到更多的服务,所以每个部分都可以做好这是份额)。

HAproxy是一个很好的解决scheme。 configuration相当简单。

您将需要另外的VPS实例坐在至less2个其他VPS的前面。 所以对于负载平衡/故障切换,您至less需要3个VPS

还有一些需要考虑的事情是:

  1. SSL终止。 如果您使用HTTPS://该连接应在负载平衡器处终止,则在负载平衡器后面,应该通过未encryption连接传递所有stream量。

  2. 文件存储。 如果用户上传图片去哪里? 它只坐在一台机器上吗? 你需要在计算机之间立即共享文件 – 你可以使用亚马逊的S3服务来存储所有的静态文件,或者你可以有另一个可以作为文件服务器的VPS,但是我会推荐S3,因为它的冗余和非常便宜。

  3. 会话信息。 你的负载均衡器configuration中的每台机器都需要能够访问用户的会话信息,因为你永远不知道他们将会遇到什么样的机器。

  4. 数据库 – 你有一个单独的数据库服务器? 如果你现在只有一台机器,你将如何确保你的新机器能够访问数据库服务器 – 如果它是一个独立的VPS数据库服务器,那么多less是多余的。 使用一台数据库服务器的高可用性Web前端和单点故障没有必要,现在您还需要考虑数据库复制和从属服务器的升级。

所以我一直在你的鞋子里,这就是一个网站每天要做几百次的麻烦。 它变得很复杂。 希望给你一些想法的食物:)

我的投票是Linux虚拟服务器作为负载平衡器。 这使得LVS导演成为一个单一的失败点,同时也是一个瓶颈

  1. 根据我的经验,瓶颈不是一个问题; LVSredirect步骤是第3层,并且非常(计算上)便宜。
  2. 单个故障点应该由第二个主pipe来处理,而这两个主pipe由Linux HA控制。

第一个控制器与第一个LVS节点在同一台机器上,第二个控制器与第二个LVS节点在同一台机器上,从而可以节省成本。 第三个和后续节点是纯粹的节点,没有LVS或HA影响。

这也使您可以自由地运行您喜欢的任何Web服务器软件,因为redirect发生在应用程序层下面。

这条链如何?

循环赛dns>两台机器上的haproxy> nginx到分离的静态文件> apache

可能也使用呃或心跳,以确保haproxy总是回答。 如果你还需要SSL,Stunnel会坐在haproxy面前

你可能要考虑使用适当的集群软件。 RedHat(或CentOS) 集群套件或Oracle的ClusterWare 。 这些可用于设置主动 – 被动群集,并可用于重新启动服务,并在出现严重问题时在节点之间发生故障。 这基本上是你在找什么。

所有这些集群解决scheme都包含在相应的操作系统许可证中,所以您可能很酷。 它们确实需要某种共享存储方式 – NFS挂载或两个节点都使用集群文件系统访问的物理磁盘。 后者的一个例子是允许多个主机访问的SAN磁盘,用OCFS2或GFS格式化。 我相信你可以使用VMWare 共享磁盘 。

集群软件用于定义始终在节点上运行的“服务”,或者仅在该节点处于“活动”时才定义。 节点通过心跳进行通信,并监视这些服务。 他们可以重新启动,如果他们注意到失败,并重新启动,如果他们不能修复。

你基本上将configuration一个单一的“共享”的IP地址stream量将被导向。 然后可以定义apache和其他必要的服务,并且只能在活动服务器上运行。 共享磁盘将用于您的所有网页内容,任何上传的文件和您的apacheconfiguration目录。 (使用httpd.conf等)

根据我的经验,这工作非常好。

  • 不需要DNS循环,或任何其他单点故障负载平衡器 – 一切都达到一个IP / FQDN。
  • 用户上传的文件进入共享存储,因此不关心你的机器是否故障。
  • 开发人员将内容上传到单一的IP / FQDN,而不需要额外的培训,而且如果故障恢复,它始终是最新的。
  • pipe理员可以把脱机的机器,修补它,重新启动等,然后使主动节点失效。 进行升级需要最less的停机时间。
  • 现在过时的节点可以保持一段时间没有打补丁,使得故障恢复同样简单的过程。 (比VMWare快照快)
  • Apache的configuration更改是共享的,所以在故障转移期间没有什么奇怪的事情发生,因为pipe理员忘记在离线框中进行更改。

– 克里斯托弗·卡雷尔

最佳的负载平衡可能非常昂贵和复杂。 基本的负载平衡应该确保每个服务器在任何时候都提供大致相同的点击次数。

最简单的负载均衡方法是在DNS中提供多个Alogging。 默认情况下,IP地址将以循环方式configuration。 这将导致用户在服务器上分布相对均匀。 这适用于无国籍的网站。 当你有一个有状态的站点时,需要一些更复杂的方法。

为了处理有状态的需求,你可以使用redirect。 为每个Web服务器分配一个备用地址,例如www1,www2,www3等。将初始www连接redirect到主机的备用地址。 您可能以这种方式结束书签问题,但它们应该均匀分散在服务器中。

或者,使用不同的path来指示哪个服务器正在处理有状态会话将允许将主机切换到原始服务器的代理会话。 当发生故障的服务器的会话到达从故障服务器接pipe的服务器时,这可能是一个问题。 但是,除了集群软件之外,状态将会丢失。 由于浏览器caching,您可能不会遇到很多会话更改服务器。

可以通过configuration服务器来接pipe故障服务器的IP地址来处理故障转移。 这将最大限度地减less服务器故障时的停机时间。 没有集群软件,如果服务器出现故障,有状态会话将会丢失。

如果没有故障转移function,用户将遇到延迟,直到浏览器故障转移到下一个IP地址。

使用Restful服务而不是有状态会话应该消除前端上的集群问题。 存储方面的集群问题仍然适用。

即使在服务器前面有负载平衡器,您也可能在它们前面有循环的DNS。 这将确保您的所有负载均衡器得到利用。 他们会为您的devise增加一层,增加复杂性和另一个失败点。 但是,他们可以提供一些安全function。

最好的解决scheme将取决于相关的要求。

实现图像服务器来提供像图像,CSS文件和其他静态内容的内容可以减轻应用服务器的负担。

我通常使用一对相同的OpenBSD机器:

  • 使用RelayD进行负载均衡,web服务器监视和处理失败的Web服务器
  • 使用CARP来实现负载均衡器本身的高可用性。

OpenBSD轻巧,稳定,相当安全 – 非常适合networking服务。

首先,我推荐一个layer3的设置。 它避免了复杂的防火墙(PF)设置。 下面是一个示例/etc/relayd.conf文件,显示了一个简单的中继负载均衡器的设置,监控后端的Web服务器:

# $OpenBSD: relayd.conf,v 1.13 2008/03/03 16:58:41 reyk Exp $ # # Macros # # The production internal load balanced address intralbaddr="1.1.1.100" # The interface on this load balancer with the alias for the intralbaddr address intralbint="carp0" # The list of web/app servers serving weblbaddress intra1="1.1.1.90" intra2="1.1.1.91" # Global Options # # interval 10 timeout 1000 # prefork 5 log updates # The "relaylb" interface group is assigned to the intralbint carp interface # The following forces a demotion in carp if relayd stops demote relaylb # # Each table will be mapped to a pf table. # table <intrahosts> { $intra1 $intra2 } # Assumes local webserver that can provide a sorry page table <fallback> { 127.0.0.1 } # # Relay and protocol for HTTP layer 7 loadbalancing and SSL acceleration # http protocol httprelay { return error header append "$REMOTE_ADDR" to "X-Forwarded-For" header append "$SERVER_ADDR:$SERVER_PORT" to "X-Forwarded-By" # header change "Connection" to "close" # Various TCP performance options tcp { nodelay, sack, socket buffer 65536, backlog 128 } # ssl { no sslv2, sslv3, tlsv1, ciphers HIGH } # ssl session cache disable } relay intra-httprelay { listen on $intralbaddr port 80 protocol httprelay # Forward to hosts in the intrahosts table using a src/dst hash # The example shows use of a page with dynamic content to provide # application aware site checking. This page should return a 200 on success, # including database or appserver connection, and a 500 or other on failure forward to <intrahosts> port http mode loadbalance \ check http "/nlbcheck.asp" code 200 } 

你有没有给ec2以cloudfoundry或者Elastic beanstalk或只是一个普通的旧的AWS自动调整思想。 我一直在使用它,它的尺度非常好,弹性可以放大/缩小,无需任何人为干预。

鉴于你说你没有负载平衡的经验,我会build议这些选项,因为他们需要最小的大脑“煎”起床和运行。

这可能会更好地利用你的时间。