使用负载均衡器时需要注意什么?

时间:2013-08-06 05:38:53

标签: php apache2 load-balancing haproxy

我有一个用PHP编写的Web应用程序,已经部署在Apache服务器上并且运行良好。

应用程序使用Mysql作为db,会话保存在memcached服务器中。

我计划迁移到有2台服务器的HAproxy环境。

我所知道的:我将应用程序部署到服务器并配置HAproxy。

我的问题是:我有什么需要关心/更改代码中的 吗?

2 个答案:

答案 0 :(得分:0)

您将遇到的最大问题是与php会话相关。默认情况下,php会话使用单个服务器维护状态。当您将第二个服务器添加到混合中并开始对两个服务器的负载平衡连接时,PHP会话将在被命中的第二台服务器上无效。

像haproxy这样的负载均衡器需要“无状态”应用程序。要使PHP无状态,您很可能需要为会话使用不同的机制。如果您不能/无法使您的应用程序无状态,那么您可以将HAProxy配置为通过cookie或粘贴表(源IP等)执行粘性会话。

您将遇到的下一件事是您将丢失原始请求者的IP地址。这是因为haproxy(负载均衡器)终止TCP会话,然后为apache创建一个新的TCP会话。为了继续查看原始请求者的IP地址,您将需要使用x-forwarded-for之类的东西。在haproxy配置中,选项是:

选项forwardfor

你可能遇到的最后一件事是haproxy处理如何保持活力。 Haproxy有acl's,规则确定将流量路由到哪里。如果启用了keep alives,haproxy将仅根据第一个请求决定发送流量的位置。

例如,假设您有两条路径,并且您希望将流量发送到两个不同的服务器场(后端):

somedomain / foo - > BACKEND_serverfarm-FOO

somedomain / bar - > BACKEND_serverfarm杆

somedomain / foo的第一个请求转到BACKEND_serverfarm-foo。 somedomain / bar的下一个请求也会转到BACKEND_serverfarm-foo。这是因为当使用keep alives时,haproxy仅处理第一个请求的ACL。这对您来说可能不是问题,因为您只有2个apache服务器,但如果是,则需要让haproxy终止keep alive会话。 Haproxy有几种选择,但在这种情况下,这两种选择最多:

选项forceclose

选项http-server-close

高级差异是forceclose关闭服务器端和客户端保持活动会话。 http-server-close只关闭服务器端保持活动会话,允许客户端使用haproxy维护keepalive。

答案 1 :(得分:0)

这取决于。

您是否正在尝试解决性能或冗余问题?

如果您的数据库( MySQL )和会话处理程序( memcached )在与两个 Apache 服务器分开的一个或多个服务器上运行,然后,您的代码必须做的唯一主要事情是管理转发的IP地址(通过X-FORWARDED-FOR),HAProxy将很乐意在Apache服务器之间循环您的请求。

如果您的数据库和会话处理程序当前正在同一服务器上运行,那么您需要确定您尝试解决的性能或冗余问题是与数据库,会话管理还是Apache本身。

对于数据库/会话密集型Web应用程序的性能问题,最简单的解决方案就是首先将MySQL和memcached放在第二台服务器上以分离您的顾虑。如果这解决了您在一台服务器上遇到的性能问题,那么您可以考虑解决问题。

如果上述解决方案无法解决性能问题,并且您发现Apache在为您的网站文件提供服务时遇到问题,那么您可以选择“混合”方法,其中Apache将存在于两台服务器上,但之后也会在其中一台服务器上运行MySQL / memcached。如果您决定使用此方法,则可以使用HAProxy并为混合服务器设置较低的权重。

如果您正在尝试解决冗余问题,那么最好的办法是将每个部分隔离成逻辑组(例如数据库集群,memcached集群,Apache集群和冗余HAProxy对) ,并根据需要为每个逻辑组添加冗余。