HAProxy与负载均衡概念介绍

提供:ZStack云计算

系列教程

本教程为利用HAProxy实现WordPress负载均衡四篇中的第一篇。

内容介绍

HAProxy的全称为高可用性代理,这是一套高人气开源软件TCP/HTTP负载均衡器,且可运行在Linux、Solaris以及FreeBSD。其能够将工作负载分发至多台服务器,从而提升服务器环境的性能与可靠性。众多高知名度环境皆使用HAProxy,其中包括GitHub、Imgur、Instagram以及Twitter。

在本教程中,我们将了解HAProxy的总体概述、基本负载均衡术语并通过示例掌握如何利用其改善服务器环境的性能与可靠性。

HAProxy术语

在探讨负载均衡与代理机制时,我们需要接触大量术语与概念。我们将通过以下各章节加以了解。

在讨论基础负载均衡类型之前,我们首先来看ACL、backend与frontend。

访问控制列表(ACL)

在负载均衡当中,ACL用于测试某些状况,并根据测试结果执行某些操作(例如选定一套服务器或者屏蔽某条请求)。

下面来看ACL示例:

acl url_blog path_beg /blog

如果用户请求的路径以/blog开头,则匹配这条ACL。举例来说,http://yourdomain.com/blog/blog-entry-1请求即符合这一条件。

要了解更为具体的AC使用方法,请参阅HAProxy配置指南

Backend

所谓backend是指一组服务器,负责接收各转发请求。Backend在HAProxy配置中的backend部分进行定义。一般来讲,backend的定义主要包括:

  • 使用哪种负载均衡算法
  • 一套服务器与端口列表

一条backend能够容纳一套或者多套服务器——总体而言向backend中添加更多服务器将能够将负载扩散至更多服务器,从而增加潜在负载容量。这种方式也能够提升可靠性,从而应对部分后端服务器发生故障的情况。

下面来看一套双backend配置示例,分别为web-backend与blog-backend,其各自包含两套Web服务器,且监听端口80:

backend web-backend
balance roundrobin
server web1 web1.yourdomain.com:80 check
server web2 web2.yourdomain.com:80 check

backend blog-backend
   balance roundrobin
mode http
server blog1 blog1.yourdomain.com:80 check
server blog1 blog1.yourdomain.com:80 check

其中balance roundrobin行指定负载均衡算法,具体细节请参阅负载均衡算法部分。

mode http则指定所使用的7层代理机制,具体请参阅负载均衡类型部分。

其中结尾处的check选项指定在这些后端服务器上执行运行状态检查。

Frontend

一条frontend负责定义请求如何被转发至backend。Frontend在HAProxy配置中的frontend部分进行定义。其定义由以下几部分组成:

  • 一组IP地址与一个端口(例如10.1.1.7:80, *:443,等等)
  • ACL
  • use_backend规则,其负责根据当前ACL条件定义使用哪个backend,而default_backend规则处理一切其它情况

我们可以将同一frontend配置至多种不同网络流量类型,具体将在下一章节解释。

负载均衡类型

现在我们已经理解了负载均衡中的基本组件,下面了解负载均衡的基本类型。

无负载均衡

简单的无负载均衡Web应用环境可能如下所示:

在本示例中,用户会直接接入Web服务器,即yourdomain.com且其中不存在负载均衡机制。如果大家的单一Web服务器发生故障,用户将无法接入该服务器。另外,如果多位用户同时访问该服务器,且其无法处理该负载,则可能出现响应缓慢或者无法接入的情况。

4层负载均衡

最为简单的负载均衡方式,将网络流量引导至多台服务器以使用4层(即传输层)负载均衡。这种方式会根据IP范围与端口进行用户流量转发(如果有请求指向http://yourdomain.com/anything,则该流量将被转发至backend,并由其处理全部指向yourdomain.com在端口80上的请求)。了解更多细节信息,请参阅网络介绍一文中的TCP章节。

下图所示为4层负载均衡的简单示例:

用户访问负载均衡器,后者将用户请求转发至后端服务器的web-backend组。被选定的后端服务器将直接响应用户请求。总体而言,web-backend中的全部服务器都应当拥有同样的内容——否则用户可能会遭遇内容不一致问题。请注意,两套Web服务器都接入同样的数据库服务器。

7层负载均衡

另一种更为复杂的负载均衡方式,网络流量使用7层(即应用层)负载均衡。使用7层意味着负载均衡器能够根据用户的请求内容将请求转发至不同后端服务器。这种方式允许大家在同一域名及端口上运行多套Web应用服务器。欲了解更多细节,请参阅网络介绍一文中的HTTP章节。

下图为一套简单的7层负载均衡示例:

在本示例中,如果用户向yourdomain.com/blog发送请求,则会被转发至blog后端,其包含一组运行有同一blog应用的服务器。其它请求则会被转发至web-backend,其负责运行其它应用。本示例中的两套backend皆使用同样的数据库服务器。

下面来看本示例中frontend配置片段:

frontend http
  bind *:80
  mode http

  acl url_blog path_beg /blog
  use_backend blog-backend if url_blog

  default_backend web-backend

这部分片段配置一套名为http的frontend,其负责处理端口80上的所有输入流量。

acl url_blog path_beg /blog匹配那些用户请求路径以/blog开头的请求。

use_backend blog-backend if url_blog采用该ACL将流量代理至blog-backend。

default_backend web-backend指定全部其它流量被转发至web-backend。

负载均衡算法

负载均衡算法用于检测后端中的哪套服务器被负载均衡机制选定进行请求响应。HAProxy提供多种算法选项。除了负载均衡算法之外,我们还能够为服务器分配一个weight参数以指定该服务器被选定的频率。

由于HAProxy提供多种负载均衡算法,因此我们下面只提及其中的一部分。请参阅HAProxy配置指南一文以查看完整的算法列表。

下面来看几种常用算法:

roundrobin

Round Robin会对服务器进行轮流选定,亦为HAProxy的默认算法。

leastconn

选定连接数量最少的服务器——建议在周期较长的会话中使用这一算法。同一后端中的服务器亦会以轮循方式进行轮流选定。

source

其根据源IP(即用户IP地址)进行服务器选定。通过这种方式,我们可以确定同一用户接入同一服务器。

粘性会话

部分应用要求用户始终接入同一后端服务器,这一点需要利用粘性会话实现,其要求在backend中使用appsession参数。

运行状态检查

HAProxy利用运行状态检查来检测后端服务器是否可用于处理请求。通过这种方式,我们不必以手动方式撤下不可用的后端服务器。默认运行状态检查会与目标服务器建立一条TCP连接,即检查后端服务器是否在监听所配置的IP地址与端口。

如果某套服务器未能通过运行状态检查,并因此无法响应请求,则其会在后端中被自动禁用——意味着流量将不再被转发到该服务器处,直到其重新恢复正常。如果后端中的全部服务器皆发生故障,则服务将不再可用,直到至少一套后端服务器重新恢复正常。

对于特定后端类型,例如特定状态下的数据库服务器,默认运行状态检查可能无法正确识别其正常与否。

其它解决方案

如果大家认为HAProxy可能太过复杂,那么以下解决方案同样值得考虑:

  • Linux虚拟服务器(LVS) - 一套简单且快速的4层负载均衡器,多数Linux发行版都内置有这套方案。
  • Nginx - 一套快速且可靠的Web服务器,亦可用于代理及负载均衡。Nginx通常与HAProxy相结合以实现缓存及压缩功能。

高可用性

4层与7层负载均衡设置都会利用一套负载均衡机制将流量引导至多套后端服务器中的一套。不过,我们的负载均衡器在此类设置中亦会带来单点故障; 如果该系统发生故障或者被请求所压倒,则可能引发高延迟甚至服务停机。

高可用性设置是一套基础设施,其中不存在任何单点故障因素。它能够为架构中的每个层添加冗余机制,从而避免单点故障。负载均衡器能够为后端层(Web/应用服务器)提供冗余,但在真正的高可用性设置当中,大家需要为负载均衡器也提供冗余设计。

以下为基础高可用性设置示例:

在本示例中,大家在同一静态IP地址后拥有多套负载均衡器(其一为主动,另一或者多个则为被动),可在不同服务器间进行重新映射。当用户访问网站时,请求会通过外部IP地址指向主动负载均衡器。如果该负载均衡器发生故障,则故障转移机制会检测到问题并自动将该IP地址重新分配给被动服务器之一。我们可以通过多种方式实现这种主动/被动高可用性设置,详情请参阅如何使用Floating IP一文。

总结

现在大家已经对负载均衡机制有了基本了解,同时亦掌握了多种利用HAProxy满足负载均衡需求的方式。以此为基础,大家将能够着手对服务器环境的性能与可靠性加以有效提升。

本文来源自DigitalOcean Community。英文原文:An Introduction to HAProxy and Load Balancing Concepts By Mitchell Anicas

翻译:diradw

猜你喜欢

转载自blog.csdn.net/zstack_org/article/details/70308147