HAProxy---高性能负载均衡软件

HAProxy---高性能负载均衡软件

HAProxy是一款开源的、高性能的、基于TCP(第四层)和HTTP(第七层)应用的负载均衡软件,借助HAProxy可以快速、可靠地提供基于TCP和HTTP应用的负载均衡解决方案。

本文将从以下几个方面来阐述HAProxy:

  1. HAProxy简介
  2. 四层和七层负载均衡的区别
  3. HAProxy与LVS的异同
  4. HAProxy的安装
  5. HAProxy的日志输出配置
  6. 常用负载均衡器算法
  7. 配置文件详解
  8. 管理与维护HAProxy
  9. 实际配置文件演示





HAProxy简介

HAProxy作为一款专业的负载均衡软件,它的显著优点如下:
可靠性和稳定性非常好,可以与硬件级的F5负载均衡设备相媲美。
最高可以同时维护40000~50000个并发连接,单位时间内处理的最大请求数为20000个,最大数据处理能力可达10Gbps。作为软件级别的负载均衡来说,HAProxy的性能强大可见一斑。
支持多于8种负载均衡算法,同时也支持session保持。
支持虚拟主机功能,这样实现Web负载均衡更加灵活。
从HAProxy1.3版本后开始支持连接拒绝、全透明代理等功能,这些功能是其他负载均衡器所不具备的。
HAProxy拥有一个功能强大的服务器状态监控页面,通过此页面可以实时了解系统的运行状况。
HAProxy拥有功能强大的ACL支持,能给使用者带来很大方便。
HAProxy是借助于操作系统的技术特性来实现性能最大化的,因此,在使用HAProxy时,对操作系统进行性能调优是非常重要的。在业务系统方面,HAProxy非常适用于那些并发量特别大且需要持久连接或七层处理机制的Web系统,例如门户网站或电商网站等。另外HAProxy也可用于Mysql数据库(读操作)的负载均衡。



四层和七层负载均衡的区别

所谓的四层就是OSI参考模型中的第四层。四层负载均衡也称为四层交换机,它主要是通过分析IP层及TCP/UDP层的流量实现的基于IP加端口的负载均衡。常见的基于四层的负载均衡器有LVS、F5等。
以常见的TCP应用为例,负载均衡器在接收到第一个来自客户端的SYN请求时,会通过设定的负载均衡算法选择一个最佳的后端服务器,同时将报文中目标IP地址修改为后端服务器IP,然后直接转发给该后端服务器,这样一个负载均衡请求就完成了。从这个过程来看,一个TCP连接是客户端和服务器直接建立的,而负载均衡器只不过完成了一个类似路由器的转发动作。在某些负载均衡策略中,为保证后端服务器返回的报文可以正确传递给负载均衡器,在转发报文的同时可能还会对报文原来的源地址进行修改。整个过程如下图所示:



同理,七层负载均衡器也称为七层交换机,位于OSI的最高层,即应用层,此时负载均衡器支持多种应用协议,常见的有HTTP、FTP、SMTP等。七层负载均衡器可以根据报文内容,再配合负载均衡算法来选择后端服务器,因此也称为“内容交换器”。比如,对于Web服务器的负载均衡,七层负载均衡器不但可以根据“IP+端口”的方式进行负载分流,还可以根据网站的URL、访问域名、浏览器类别、语言等决定负载均衡的策略。例如,有两台Web服务器分别对应中英文两个网站,两个域名分别是A、B,要实现访问A域名时进入中文网站,访问B域名时进入英文网站,这在四层负载均衡器中几乎是无法实现的,而七层负载均衡可以根据客户端访问域名的不同选择对应的网页进行负载均衡处理。常见的七层负载均衡器有HAproxy、Nginx等。
这里仍以常见的TCP应用为例,由于负载均衡器要获取到报文的内容,因此只能先代替后端服务器和客户端建立连接,接着,才能收到客户端发送过来的报文内容,然后再根据该报文中特定字段加上负载均衡器中设置的负载均衡算法来决定最终选择的内部服务器。纵观整个过程,七层负载均衡器在这种情况下类似于一个代理服务器。整个过程如下图所示。



HAProxy与LVS的异同

1、 两者都是软件负载均衡产品,但是LVS是基于Linux操作系统实现的一种软负载均衡,而HAProxy是基于第三应用实现的软负载均衡。
2、 LVS是基于四层的IP负载均衡技术,而HAProxy是基于四层和七层技术、可提供TCP和HTTP应用的负载均衡综合解决方案。
3、 LVS工作在ISO模型的第四层,因此其状态监测功能单一,而HAProxy在状态监测方面功能强大,可支持端口、URL、脚本等多种状态检测方式。
4、 HAProxy虽然功能强大,但是整体处理性能低于四层模式的LVS负载均衡,而LVS拥有接近硬件设备的网络吞吐和连接负载能力。
综上所述,HAProxy和LVS各有优缺点,没有好坏之分,要选择哪个作为负载均衡器,要以实际的应用环境来决定。




HAProxy的安装

haproxy.org/

[root@iZ2zej7q90l28tqdr8j60nZ haproxy]# tar -zxvf haproxy-2.5.1.tar.gz
[root@iZ2zej7q90l28tqdr8j60nZ haproxy]# ls
haproxy-2.5.1  haproxy-2.5.1.tar.gz
[root@iZ2zej7q90l28tqdr8j60nZ haproxy]# cd haproxy-2.5.1/
[root@iZ2zej7q90l28tqdr8j60nZ haproxy-2.5.1]# ls
addons  BRANCHES   CONTRIBUTING  doc       include  LICENSE      Makefile  reg-tests  scripts  SUBVERS  VERDATE
admin   CHANGELOG  dev           examples  INSTALL  MAINTAINERS  README    ROADMAP    src      tests    VERSION
[root@iZ2zej7q90l28tqdr8j60nZ haproxy-2.5.1]# make TARGET=linux-glibc  PREFIX=/usr/local/haproxy 
[root@iZ2zej7q90l28tqdr8j60nZ haproxy-2.5.1]# make install PREFIX=/usr/local/haproxy
[root@iZ2zej7q90l28tqdr8j60nZ haproxy-2.5.1]# mkdir  /usr/local/haproxy/conf
[root@iZ2zej7q90l28tqdr8j60nZ haproxy-2.5.1]# mkdir  /usr/local/haproxy/logs
#haproxy默认不创建配置文件目录和日志目录,这里是创建haproxy配置文件目录和日志文件目录
[root@iZ2zej7q90l28tqdr8j60nZ haproxy-2.5.1]# cp examples/option-http_proxy.cfg /usr/local/haproxy/conf/haproxy.cfg
#haproxy安装完成后,默认安装目录中没有配置文件,这里是将源码包里面的示例配置文件拷贝到配置文件目录。
这样,HAProxy就安装完成了。




HAProxy的日志输出配置

hapaoxy默认没有日志输出功能,所以需要我们额外的配置。

编写日志输出文件

rsyslog是linux系默认的日志输出系统,配置文件为/etc/rsyslog.conf,此主配置文件默认会读取/etc/rsyslog.d/*.conf目录下所有已.conf结尾的文件。
[root@localhost logs]# cat /etc/rsyslog.conf|grep IncludeConfig
$IncludeConfig /etc/rsyslog.d/*.conf
因此,这里我们为haproxy单独创建一个独立的配置文件,将文件命名为haproxy.conf,并放到/etc/rsyslog.d目录下,然后添加如下内容:
$ModLoad imudp
$UDPServerRun 514
local0.* /usr/local/haproxy/logs/haproxy.log
&~ #如果不加这个配置,则除了在/var/log/haproxy.log中写入日志外,也会将haproxy日志写入message文件中。
[root@iZ2zej7q90l28tqdr8j60nZ haproxy-2.5.1]#  cat /etc/rsyslog.conf|grep IncludeConfig
$IncludeConfig /etc/rsyslog.d/*.conf
[root@iZ2zej7q90l28tqdr8j60nZ haproxy-2.5.1]# vim /etc/rsyslog.d/haproxy.conf
[root@iZ2zej7q90l28tqdr8j60nZ haproxy-2.5.1]# cat $_
$ModLoad imudp
$UDPServerRun 514
local0.*     /usr/local/haproxy/logs/haproxy.log
&~
[root@iZ2zej7q90l28tqdr8j60nZ haproxy-2.5.1]# 


配置rsyslog的主配置文件,开启远程日志

打开 /etc/sysconfig/rsyslog文件,将SYSLOGD_OPTIONS修改为如下内容:
SYSLOGD_OPTIONS=”-c 2 -r -m 0″
其中:
-c 2 使用兼容模式,默认是 -c 5。
-r 开启远程日志。
-m 0 标记时间戳。单位是分钟,为0时,表示禁用该功能。
[root@iZ2zej7q90l28tqdr8j60nZ haproxy-2.5.1]# vim /etc/sysconfig/rsyslog
[root@iZ2zej7q90l28tqdr8j60nZ haproxy-2.5.1]# cat $_
# Options for rsyslogd
# Syslogd options are deprecated since rsyslog v3.
# If you want to use them, switch to compatibility mode 2 by "-c 2"
# See rsyslogd(8) for more details
SYSLOGD_OPTIONS="-c 2 -r -m 0"


重启rsyslog服务

配置完成后,需要重启rsyslog服务,以保证配置生效。
systemctl restart rsyslog




常用负载均衡器算法

HAProxy负载均衡器算法与使用技巧
1、HAProxy支持的负载均衡算法
(1)、roundrobin,表示简单的轮询,负载均衡基础算法(静态web系统)
(2)、static-rr,表示根据权重(静态web系统)
(3)、leastconn,表示最少连接者先处理(db系统)
(4)、source,表示根据请求源IP(动态web系统)
(5)、uri,表示根据请求的URI;
(6)、url_param,表示根据请求的URl参数来进行调度
(7)、hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
(8)、rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。
2、常用的负载均衡算法
(1)轮询算法:roundrobin
(2)根据请求源IP算法:source
(3)最少连接者先处理算法:lestconn




配置文件详解

HAProxy配置文件的组成部分

HAProxy配置文件根据功能和用途,主要有5个部分组成,但有些部分并不是必须的,可以根据需要选择相应的部分进行配置。
(1) global部分
用来设定全局配置参数,属于进程级的配置,通常和操作系统配置有关。
(2) defaults部分
默认参数的配置部分。在此部分设置的参数值,默认会自动被引用到下面的frontend、backend和listen部分中,因此,如果某些参数属于公用的配置,只需在defaults部分添加一次即可。而如果在frontend、backend和listen部分中也配置了与defaults部分一样的参数,那么defaults部分参数对应的值自动被覆盖。
(3) frontend部分
此部分用于设置接收用户请求的前端虚拟节点。frontend是在HAProxy1.3版本之后才引入的一个组件,同时引入的还有backend组件。通过引入这些组件,在很大程度上简化了HAProxy配置文件的复杂性。frontend可以根据ACL规则直接指定要使用的后端backend。
(4) backend部分
此部分用于设置集群后端服务集群的配置,也就是用来添加一组真实服务器,以处理前端用户的请求。添加的真实服务器类似于LVS中的real server节点。
(5) listen部分
此部分是frontend部分和backend部分的结合体。在HAProxy1.3版本之前,HAProxy的所有配置选项都在这个部分中设置。为了保持兼容性,HAProxy新的版本仍然保留了listen组件的配置方式。目前在HAProxy中,两种配置方式任选其一即可。


global部分

配置示例如下:
global
        log 127.0.0.1 local0 info
        maxconn 4096
        user nobody
        group nobody
        daemon
        nbproc 1
        pidfile /usr/local/haproxy/logs/haproxy.pid
下面介绍每个选项的含义。
	log:全局的日志配置,local0是日志设备,info表示日志级别。其中日志级别有err、warning、info、debug四种可选。这个配置表示使用127.0.0.1上的rsyslog服务中的local0日志设备,记录日志等级为info。
	maxconn:设定每个haproxy进程可接受的最大并发连接数,此选项等同于Linux命令行选项“ulimit  -n”。
	user/ group:设置运行haproxy进程的用户和组,也可使用用户和组的uid和gid值来替代。
	daemon:设置HAProxy进程进入后台运行。这是推荐的运行模式。
	nbproc:设置HAProxy启动时可创建的进程数,此参数要求将HAProxy运行模式设置为“daemon”,默认只启动一个进程。根据使用经验,该值的设置应该小于服务器的CPU核数。创建多个进程,能够减少每个进程的任务队列,但是过多的进程可能会导致进程的崩溃。
	pidfile:指定HAProxy进程的pid文件。启动进程的用户必须有访问此文件的权限。

defaults部分

配置示例如下:
defaults
        mode http
retries 3
        timeout connect 10s
        timeout client 20s
        timeout server 30s
        timeout check 5s

	mode:设置HAProxy实例默认的运行模式,有tcp、http、health三个可选值。
	tcp模式:在此模式下,客户端和服务器端之间将建立一个全双工的连接,不会对七层报文做任何类型的检查,默认为tcp模式,经常用于SSL、SSH、SMTP等应用。
	http模式:在此模式下,客户端请求在转发至后端服务器之前将会被深度分析,所有不与RFC格式兼容的请求都会被拒绝。
	health模式:目前此模式基本已经废弃,不在多说。
	retries:设置连接后端服务器的失败重试次数,连接失败的次数如果超过这里设置的值,HAProxy会将对应的后端服务器标记为不可用。此参数也可在后面部分进行设置。
	timeout connect:设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,但也可以使用其他的时间单位后缀。
	timeout client:设置连接客户端发送数据时最长等待时间,默认单位是毫秒,也可以使用其他的时间单位后缀。
	timeout server:设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,也可以使用其他的时间单位后缀。
	timeout check:设置对后端服务器的检测超时时间,默认单位是毫秒,也可以使用其他的时间单位后缀。

frontend部分

frontend www
         bind *:80
         mode   http
         option  httplog
         option  forwardfor
         option  httpclose
         log     global
         default_backend htmpool
	这部分通过frontend关键字定义了一个名为“www”的前端虚拟节点,下面介绍每个选项的含义。
		bind:此选项只能在frontend和listen部分进行定义,用于定义一个或几个监听的套接字。bind的使用格式为:
	 bind [<address>:<port_range>]  interface  <interface>
	其中,address为可选选项,其可以为主机名或IP地址,如果将其设置为“*”或“0.0.0.0”,将监听当前系统的所有IPv4地址。port_range可以是一个特定的TCP端口,也可是一个端口范围,小于1024的端口需要有特定权限的用户才能使用。interface为可选选项,用来指定网络接口的名称,只能在Linux系统上使用。
		option  httplog:在默认情况下,haproxy日志是不记录HTTP请求的,这样很不方便HAProxy问题的排查与监控。通过此选项可以启用日志记录HTTP请求。
		option  forwardfor:如果后端服务器需要获得客户端的真实IP,就需要配置此参数。由于HAProxy工作于反向代理模式,因此发往后端真实服务器的请求中的客户端IP均为HAProxy主机的IP,而非真正访问客户端的地址,这就导致真实服务器端无法记录客户端真正请求来源的IP,而“X-Forwarded-For”则可用于解决此问题。通过使用“forwardfor”选项,HAProxy就可以向每个发往后端真实服务器的请求添加“X-Forwarded-For”记录,这样后端真实服务器日志可以通过“X-Forwarded-For”信息来记录客户端来源IP。
		option httpclose:此选项表示在客户端和服务器端完成一次连接请求后,HAProxy将主动关闭此TCP连接。这是对性能非常有帮助的一个参数。
		log  global:表示使用全局的日志配置,这里的“global”表示引用在HAProxy配置文件global部分中定义的log选项配置格式。
		default_backend:#指定默认的后端服务器池,也就是指定一组后端真实服务器,而这些真实服务器组将在backend段进行定义。这里的htmpool就是一个后端服务器组。

backend部分

backend htmpool
        mode    http
        option   redispatch
        option   abortonclose
        balance  roundrobin
        cookie   SERVERID
        option   httpchk GET /index.php
        server  web1 10.200.34.181:80  cookie server1 weight 6 check inter 2000 rise 2 fall 3
        server  web2 10.200.34.182:8080 cookie server2 weight 6 check inter 2000 rise 2 fall 3

	这个部分通过backend关键字定义了一个名为“htmpool”的后端真实服务器组。


option  redispatch:此参数用于cookie保持的环境中。在默认情况下,HAProxy会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性。而如果后端的服务器出现故障,客户端的cookie是不会刷新的,这就出现了问题。此时,如果设置此参数,就会将客户的请求强制定向到另外一个健康的后端服务器上,以保证服务的正常。
option  abortonclose:如果设置了此参数,可以在服务器负载很高的情况下,自动结束掉当前队列中处理时间比较长的链接。
balance:此关键字用来定义负载均衡算法。目前HAProxy支持多种负载均衡算法,常用的有如下几种:
roundrobin:是基于权重进行轮叫调度的算法,在服务器的性能分布比较均匀的时候,这是一种最公平、最合理的算法。此算法经常使用。
static-rr:也是基于权重进行轮叫的调度算法,不过此算法为静态方法,在运行时调整其服务器权重不会生效。
source:是基于请求源IP的算法。此算法先对请求的源IP进行hash运算,然后将结果与后端服务器的权重总数相除后转发至某个匹配的后端服务器。这种方式可以使同一个客户端IP的请求始终被转发到某特定的后端服务器。
leastconn:此算法会将新的连接请求转发到具有最少连接数目的后端服务器。在会话时间较长的场景中推荐使用此算法,例如数据库负载均衡等。此算法不适合会话较短的环境中,例如基于HTTP的应用。
uri:此算法会对部分或整个URI进行hash运算,再经过与服务器的总权重相除,最后转发到某台匹配的后端服务器上。
uri_param:此算法会根据URL路径中的参数进行转发,这样可保证在后端真实服务器数量不变时,同一个用户的请求始终分发到同一台机器上。
hdr(<name>): 此算法根据http头进行转发,如果指定的http头名称不存在,则使用roundrobin算法进行策略转发。
cookie:表示允许向cookie插入SERVERID,每台服务器的SERVERID可在下面的server关键字中使用cookie关键字定义。


option httpchk:此选项表示启用HTTP的服务状态检测功能。HAProxy作为一款专业的负载均衡器,它支持对backend部分指定的后端服务节点的健康检查,以保证在后端backend中某个节点不能服务时,把从frotend端进来的客户端请求分配至backend中其他健康节点上,从而保证整体服务的可用性。“option httpchk”的用法如下:
	option httpchk <method> <uri> <version>
	其中,各个参数的含义如下:
method:表示HTTP请求的方式,常用的有OPTIONS、GET、HEAD几种方式。一般的健康检查可以采用HEAD方式进行,而不是才采用GET方式,这是因为HEAD方式没有数据返回,仅检查Response的HEAD是不是200状态。因此相对与GET来说,HEAD方式更快,更简单。
uri:表示要检测的URL地址,通过执行此URL,可以获取后端服务器的运行状态。在正常情况下将返回状态码200,返回其他状态码均为异常状态。
version:指定心跳检测时的HTTP的版本号。


server:这个关键字用来定义多个后端真实服务器,不能用于defaults和frontend部分。使用格式为:
  	 server <name> <address>[:port] [param*]
其中,每个参数含义如下:
<name>:为后端真实服务器指定一个内部名称,随便定义一个即可。
<address>:后端真实服务器的IP地址或主机名。
<port>:指定连接请求发往真实服务器时的目标端口。在未设定时,将使用客户端请求时的同一端口。
[param*]:为后端服务器设定的一系参数,可用参数非常多,这里仅介绍常用的一些参数:
check:表示启用对此后端服务器执行健康状态检查。
inter:设置健康状态检查的时间间隔,单位为毫秒。
rise:设置从故障状态转换至正常状态需要成功检查的次数,例如。“rise 2”表示2次检查正确就认为此服务器可用。
fall:设置后端服务器从正常状态转换为不可用状态需要检查的次数,例如,“fall 3”表示3次检查失败就认为此服务器不可用。
cookie:为指定的后端服务器设定cookie值,此处指定的值将在请求入站时被检查,第一次为此值挑选的后端服务器将在后续的请求中一直被选中,其目的在于实现持久连接的功能。上面的“cookie server1”表示web1的serverid为server1。同理,“cookie server2”表示web2的serverid为server2。
weight:设置后端真实服务器的权重,默认为1,最大值为256。设置为0表示不参与负载均衡。
backup:设置后端真实服务器的备份服务器,仅仅在后端所有真实服务器均不可用的情况下才启用。

listen部分

listen admin_stats
        bind 0.0.0.0:9188
        mode http
        log 127.0.0.1 local0 err
        stats refresh 30s
        stats uri /haproxy-status
        stats realm welcome login\ Haproxy
        stats auth admin:admin~!@
        stats hide-version
        stats admin if TRUE

	这个部分通过listen关键字定义了一个名为“admin_stats”的实例,其实就是定义了一个HAProxy的监控页面,每个选项的含义如下:


stats refresh:设置HAProxy监控统计页面自动刷新的时间。
	stats uri:设置HAProxy监控统计页面的URL路径,可随意指定。例如,指定“stats uri /haproxy-status”,就可以通过http://IP:9188/haproxy-status 查看。
	stats realm:设置登录HAProxy统计页面时密码框上的文本提示信息。
	stats auth:设置登录HAProxy统计页面的用户名和密码。用户名和密码通过冒号分割。可为监控页面设置多个用户名和密码,每行一个。
	stats hide-version:用来隐藏统计页面上HAProxy的版本信息。
	stats admin if TRUE:通过设置此选项,可以在监控页面上手工启用或禁用后端真实服务器,仅在haproxy1.4.9以后版本有效。




管理与维护HAProxy

HAProxy安装完成后,会在安装根目录的sbin目录下生成一个可执行的二进制文件haproxy,对HAProxy的启动、关闭、重启等维护操作都是通过这个二进制文件来实现的,执行“haproxy -h”即可得到此文件的用法。
haproxy [-f < 配置文件>] [ -vdVD ] [-n 最大并发连接总数] [-N 默认的连接数]
haproxy常用的参数以及含义如下所示。

参数 含义
-v 显示当前版本信息;“-vv”显示已知的创建选项。
-d 表示让进程运行在debug模式;“-db”表示禁用后台模式,让程序跑在前台。
-D 让程序以daemon模式启动,此选项也可以在HAProxy配置文件中设置。
-q 表示安静模式,程序运行不输出任何信息。
-c 对HAProxy配置文件进行语法检查。此参数非常有用。如果配置文件错误,会输出对应的错误位置和错误信息。
-n 设置最大并发连接总数。
-m 限制可用的内存大小,以MB为单位。
-N 设置默认的连接数,
-p 设置HAProxy的PID文件路径。
-de 不使用epoll模型。
-ds 不使用speculative epoll
-dp 不使用poll模型。
-sf 程序启动后向PID文件里的进程发送FINISH信号,这个参数需要放在命令行的最后。
-st 程序启动后向PID文件里的进程发送TERMINATE信号,这个参数放在命令行的最后,经常用于重启HAProxy进程。


介绍完haproxy常用的参数后,下面开始启动HAProxy,操作如下:
[root@haproxy-server haproxy]#/usr/local/haproxy/sbin/haproxy -f  \
> /usr/local/haproxy/conf/haproxy.cfg

如果要关闭HAProxy,执行执行如下命令即可:
[root@haproxy-server haproxy]#killall -9 haproxy

而如果要平滑重启HAProxy,可执行如下命令:
[root@haproxy-server haproxy]# /usr/local/haproxy/sbin/haproxy -f  \
/usr/local/haproxy/conf/haproxy.cfg -st `cat /usr/local/haproxy/logs/haproxy.pid`

Haproxy安装完成后,会在/etc/init.d/目录下生成一个haproxy的脚本文件,这个脚本也可以用来启动和管理haproxy服务。
[root@localhost keepalived]# /etc/init.d/haproxy    
Usage: /etc/init.d/haproxy {start|stop|status|checkconfig|restart|try-restart|reload|force-reload}




实际配置文件演示



以上就是本次的全部内容,haproxy的基础用法。

发布于 2022-02-05 11:03