一、HAProxy简介
1.HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。 2.HAProxy 实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。 3.HAProxy 支持全透明代理(已具备硬件防火墙的典型特点): 可以用客户端IP地址或者任何其他地址来连接后端服务器. 这个特性仅在Linux 2.4/2.6内核打了cttproxy补丁后才可以使用. 这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。
二、HAProxy工作原理
HAProxy由前端(frontend)和后端(backend),前端和后端都可以有多个。也可以只有一个listen块来同时实现前端和后端。这里主要讲一下frontend和backend工作模式。
前端(frontend)区域可以根据HTTP请求的header信息来定义一些规则,然后将符合某规则的请求转发到相应后端(backend)进行处理。
三、HAProxy性能
HAProxy借助于OS上几种常见的技术来实现性能的最大化,所有的这些细微之处的优化实现了在中等规模负载之上依然有着相当低的CPU负载,甚至于在非常高的负载场景中,5%的用户空间占用率和95%的系统空间占用率也是非常普遍的现象,这意味着HAProxy进程消耗比系统空间消耗低20倍以上。因此,对OS进行性能调优是非常重要的。即使用户空间的占用率提高一倍,其CPU占用率也仅为10%,这也解释了为何7层处理对性能影响有限这一现象。由此,在高端系统上HAProxy的7层性能可轻易超过硬件负载均衡设备。
在生产环境中,在7层处理上使用HAProxy作为昂贵的高端硬件负载均衡设备故障故障时的紧急解决方案也时长可见。硬件负载均衡设备在“报文”级别处理请求,这在支持跨报文请求(request across multiple packets)有着较高的难度,并且它们不缓冲任何数据,因此有着较长的响应时间。对应地,软件负载均衡设备使用TCP缓冲,可建立极长的请求,且有着较大的响应时间。
四、HAProxy详解配置文件
haproxy 的配置文件由两部分组成:全局设定和对代理的设定,共分为五段:global,defaults,frontend,backend,listen 1.global: (全局配置主要用于设定义全局参数,属于进程级的配置,通常和操作系统配置有关) 2.default : (配置默认参数,这些参数可以被用到frontend,backend,Listen组件) 在此部分中设置的参数值,默认会自动引用到下面的frontend、backend、listen部分中,因引,某些参数属于公用的配置,只需要在defaults部分添加一次即可。而如果frontend、backend、listen部分也配置了与defaults部分一样的参数,Defaults部分参数对应的值自动被覆盖。 3.frontend:( 接收请求的前端虚拟节点,Frontend可以更加规则直接指定具体使用后端的backend) frontend是在haproxy 1.3版本以后才引入的一个组件,同时引入的还有backend组件。通过引入这些组件,在很大程度上简化了haproxy配置文件的复杂性。forntend可以根据ACL规则直接指定要使用的后端backend 4.backend : (后端服务集群的配置,真实服务器,一个Backend对应一个或者多个实体服务器) 在HAProxy1.3版本之前,HAProxy的所有配置选项都在这个部分中设置。为了保持兼容性,haproxy新的版本依然保留了listen组件配置试。两种配置方式任选一中 5.Listen : (Fronted和backend的组合体) 比如haproxy实例状态监控部分配置
关于haproxy时间格式配置说明:
一些包含了值的参数表示时间,如超时时长。这些值一般以毫秒为单位,但也可以使用其它的时间单位后缀。 us: 微秒(microseconds),即1/1000000秒; ms: 毫秒(milliseconds),即1/1000秒; s: 秒(seconds); m: 分钟(minutes); h:小时(hours); d: 天(days);
global部分配置说明
通常主要定义全局配置主要用于设定义全局参数,属于进程级的配置,通常和操作系统配置有关。
global log 127.0.0.1 local3 #定义haproxy日志输出设置 log 127.0.0.1 local1 notice #log loghost local0 info #定义haproxy 日志级别 ulimit-n 82000 #设置每个进程的可用的最大文件描述符 maxconn 20480 #默认最大连接数 chroot /usr/local/haproxy #chroot运行路径 uid 99 #运行haproxy 用户 UID gid 99 #运行haproxy 用户组gid daemon #以后台形式运行harpoxy nbproc 1 #设置进程数量 pidfile /usr/local/haproxy/run/haproxy.pid #haproxy 进程PID文件 #debug #haproxy调试级别,建议只在开启单进程的时候调试 #quiet
log:全局的日志配置,local0是日志输出设置,info表示日志级别(err,waning,info,debug);
maxconn:设定每个HAProxy进程可接受的最大并发连接数,此选项等同于linux命令选项”ulimit -n”;
chroot:修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作,可以提升haproxy的安全级别,不过需要注意的是要确保指定的目录为空目录且任何用户均不能有写权限;
daemon:让haproxy以守护进程的方式工作于后台,其等同于“-D”选项的功能,当然,也可以在命令行中以“-db”选项将其禁用;
nbproc:指定启动的haproxy进程个数,只能用于守护进程模式的haproxy;默认只启动一个进程,鉴于调试困难等多方面的原因,一般只在单进程仅能打开少数文件描述符的场景中才使用多进程模式;
pidfile:将haproxy的进程写入pid文件;
ulimit-n:设定每进程所能够打开的最大文件描述符数目,默认情况下其会自动进行计算,因此不推荐修改此选项;
stats socket <path>定义统计信息保存位置;
如要设置haproxy的日志内容,可参考以下配置:
capture request header Host len 40 capture request header Content-Length len 10 capture request header Referer len 200 capture response header Server len 40 capture response header Content-Length len 10 capture response header Cache-Control len 8
defaults部分配置说明
用于设置配置默认参数,这些参数可以被用到frontend,backend,Listen组件;
此部分中设置的参数值,默认会自动引用到下面的frontend、backend、listen部分中,因引,某些参数属于公用的配置,只需要在defaults部分添加一次即可。而如果frontend、backend、listen部分也配置了与defaults部分一样的参 数,Defaults部分参数对应的值自动被覆盖;
defaults log global #引入global定义的日志格式 mode http #所处理的类别(7层代理http,4层代理tcp) maxconn 50000 #最大连接数 option httplog #日志类别为http日志格式 option httpclose #每次请求完毕后主动关闭http通道 option dontlognull #不记录健康检查日志信息 option forwardfor #如果后端服务器需要获得客户端的真实ip,需要配置的参数, 可以从http header 中获取客户端的IP retries 3 #3次连接失败就认为服务器不可用,也可以通过后面设置 option redispatch
#《---上述选项意思是指serverID 对应的服务器挂掉后,强制定向到其他健康的服务器, 当使用了 cookie时, haproxy将会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性;而此时,如果 后端的服务器宕掉了,但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请求强制定向到另外一个 后端server上,以保证服务的正常---》 stats refresh 30 #设置统计页面刷新时间间隔 option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接 balance roundrobin #设置默认负载均衡方式,轮询方式 #balance source #设置默认负载均衡方式,类似于nginx的ip_hash #contimeout 5000 #设置连接超时时间 #clitimeout 50000 #设置客户端超时时间 #srvtimeout 50000 #设置服务器超时时间 timeout http-request 10s #默认http请求超时时间 timeout queue 1m #默认队列超时时间 timeout connect 10s #默认连接超时时间 timeout client 1m #默认客户端超时时间 timeout server 1m #默认服务器超时时间 timeout http-keep-alive 10s #默认持久连接超时时间 timeout check 10s #设置心跳检查超时时间
mode http:设置haproxy的运行模式,有三种{http|tcp|health}。注意:如果haproxy中还要使用4层的应用(mode tcp)的话,不建议在此定义haproxy的运行模式。
设置HAProxy实例默认的运行模式有tcp、http、health三种可选:
tcp模式:在此模式下,客户端和服务器端之前将建立一个全双工的连接,不会对七层报文做任何检查,默认为tcp模式,经常用于SSL、SSH、SMTP等应用。 http模式:在此模式下,客户端请求在转发至后端服务器之前将会被深度分板,所有不与RFC格式兼容的请求都会被拒绝。 health:已基本不用了。
log global:设置日志继承全局配置段的设置。
option httplog:表示开始打开记录http请求的日志功能。
option dontlognull:如果产生了一个空连接,那这个空连接的日志将不会记录。
option http-server-close:打开http协议中服务器端关闭功能,使得支持长连接,使得会话可以被重用,使得每一个日志记录都会被记录。
option forwardfor except 127.0.0.0/8:如果上游服务器上的应用程序想记录客户端的真实IP地址,haproxy会把客户端的IP信息发送给上游服务器,在HTTP请求中添加”X-Forwarded-For”字段,但当是haproxy自身的健康检测机制去访问上游服务器时是不应该把这样的访问日志记录到日志中的,所以用except来排除127.0.0.0,即haproxy身。
option redispatch:当与上游服务器的会话失败(服务器故障或其他原因)时,把会话重新分发到其他健康的服务器上,当原来故障的服务器恢复时,会话又被定向到已恢复的服务器上。还可以用”retries”关键字来设定在判定会话失败时的尝试连接的次数。
retries 3:向上游服务器尝试连接的最大次数,超过此值就认为后端服务器不可用。
option abortonclose:当haproxy负载很高时,自动结束掉当前队列处理比较久的链接。
timout http-request 10s:客户端发送http请求的超时时间。
timeout queue 1m:当上游服务器在高负载响应haproxy时,会把haproxy发送来的请求放进一个队列中,timeout queue定义放入这个队列的超时时间。
timeout connect 5s:haproxy与后端服务器连接超时时间,如果在同一个局域网可设置较小的时间。
timeout client 1m:定义客户端与haproxy连接后,数据传输完毕,不再有数据传输,即非活动连接的超时时间。
timeout server 1m:定义haproxy与上游服务器非活动连接的超时时间。
timeout http-keep-alive 10s:设置新的http请求连接建立的最大超时时间,时间较短时可以尽快释放出资源,节约资源。
timeout check 10s:健康检测的时间的最大超时时间。
maxconn 3000:最大并发连接数。
contimeout 5000:设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,新版本的haproxy使用timeout connect替代,该参数向后兼容。
clitimeout 3000:设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒,新版本haproxy使用timeout client替代。该参数向后兼容。
srvtimeout 3000:设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,新版本haproxy使用timeout server替代。该参数向后兼容。
balance roundrobin:设置负载算法为:轮询算法rr
balance :用来定义负载均衡算法
1.roundrobin:基于权重进行的轮叫算法,在服务器的性能分布经较均匀时这是一种最公平的,最合量的算法。 2.static-rr:也是基于权重时行轮叫的算法,不过此算法为静态方法,在运行时调整其服务权重不会生效。 3.source:是基于请求源IP的算法,此算法对请求的源IP时行hash运算,然后将结果与后端服务器的权理总数相除后转发至某台匹配的后端服务器,这种方法可以使用一个客户端IP的请求始终转发到特定的后端服务器。 4.leastconn:此算法会将新的连接请求转发到具有最少连接数目的后端服务器。在会话时间较长的场景中推荐使用此算法。例如数据库负载均衡等。此算法不适合会话较短的环境,如基于http的应用。 5.uri:此算法会对部分或整个URI进行hash运算,再经过与服务器的总权重要除,最后转发到某台匹配的后端服务器上。 6.uri_param:此算法会椐据URL路径中的参数时行转发,这样可以保证在后端真实服务器数量不变时,同一个用户的请求始终分发到同一台机器上。 7.hdr:此算法根据httpd头时行转发,如果指定的httpd头名称不存在,则使用roundrobin算法进行策略转发。 8.rdp-cookie(name):示根据据cookie(name)来锁定并哈希每一次TCP请求。
frontend部分配置说明
frontend是在haproxy 1.3版本以后才引入的一个组件,同时引入的还有backend组件。通过引入这些组件,在很大程度上简化了haproxy配置文件的复杂性。frontend根据任意 HTTP请求头内容做ACL规则匹配,然后把请求定向到相关的backend
frontend http_80_in bind 0.0.0.0:80 #设置监听端口,即haproxy提供的web服务端口,和lvs的vip 类似 mode http #http 的7层模式 log global #应用全局的日志设置 option httplog #启用http的log option httpclose #每次请求完毕后主动关闭http通道,HAproxy不支持keep-alive模式 option forwardfor #如果后端服务器需要获得客户端的真实IP需要配置此参数,将可以从HttpHeader中获得客户端IP default_backend wwwpool #设置请求默认转发的后端服务池
frontend http_80_in:定义一个名为http_80_in的frontend。
bind 0.0.0.0:80:定义haproxy前端部分监听的端口。
mode http:定义为http模式。
log global:继承global中log的定义。
option forwardfor:使后端server获取到客户端的真实IP。
backend部分配置说明
用来定义后端服务集群的配置,真实服务器,一个Backend对应一个或者多个实体服务器
backend wwwpool #定义wwwpool服务器组。 mode http #http的7层模式 option redispatch option abortonclose balance source #负载均衡的方式,源哈希算法 cookie SERVERID #允许插入serverid到cookie中,serverid后面可以定义 option httpchk GET /test.html #心跳检测 server web1 10.1.1.2:80 cookie 2 weight 3 check inter 2000 rise 2 fall 3 maxconn 8
cookie:表示充许向cookie插入SERVERID,每台服务器的SERVERID可以下面的server关键字中使用cookie关键字定义。
option httpchk:此选项表示启用HTTP的服务状态检测功能。 HAProxy作为一个专业的负载均衡器,并且它支持对backend部分指定的后端服务节点的 健康检查,以保证在后端的backend中某个节点不能服务时,把从frontend端进来的客户端请求分配至backend中其他健康节点上,从而保证 整体服务的可用性。
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。
weigth:设置后端真实服务器的权重,默认为1,最大值为256,设置为0表示不参与负载均衡。
maxconn:设定每个backend中server进程可接受的最大并发连接数,此选项等同于linux命令选项”ulimit -n”。
backup:设置后端真实服务器的备份服器,仅仅在后端所有真实服务器均不可用的情况下才启用。
listen部分配置说明
常常用于状态页面监控,以及后端server检查,是Fronted和backend的组合体。
如下为haproxy访问状态监控页面配置:
listen admin_status #Frontend和Backend的组合体,监控组的名称,按需自定义名称 bind 0.0.0.0:8888 #监听端口 mode http #http的7层模式 log 127.0.0.1 local3 err #错误日志记录 stats refresh 5s #每隔5秒自动刷新监控页面 stats uri /admin?stats #监控页面的url访问路径 stats realm itnihao\ welcome #监控页面的提示信息 stats auth admin:admin #监控页面的用户和密码admin,可以设置多个用户名 stats auth admin1:admin1 #监控页面的用户和密码admin1 stats hide-version #隐藏统计页面上的HAproxy版本信息 stats admin if TRUE #手工启用/禁用,后端服务器(haproxy-1.4.9以后版本)
HAProxy目前主要有三个版本: 1.3 , 1.4 ,1.5,CentOS6.6 自带的RPM包为 1.5 的。