学习目标:
1、掌握haproxy的功能和配置
学习内容:
介绍
HAProxy是一个开源的、高性能的基于TCP和HTTP应用代理的高可用的,负载均衡服务软件,它支持双机热备、高可用、负载均衡、虚拟主机、基于TCP和HTTP的应用代理、图形界面查看信息等功能。配置简单、维护方便、而且拥有很好的服务器节点的健康检查功能(相当于keepalived健康检查),当其代理的后端服务器出现故障时,HAProxy会自动的将该故障服务器摘除,当故障的服务器恢复后,HAProxy还会自动将该服务器自动加入进来提供服务
和LVS/NGINX对比
HAProxy特别适用高负载、高访问量,但又需要会话保持及七层代理的业务应用,HAProxy的代理模式使服务器不暴露公网,即后面的节点服务器不需要公网ip
两种代理模式
- 基于4层tcp应用代理
- 基于7层http代理
HAProxy配置文件说明
- HAProxy配置文件总体
haproxy配置可以分为五个部分:
global:全局配置参数段,主要用来控制haproxy启动前的进程及系统相关设置
defaults:配置一些参数,如果frontend、backend,listen等段未设置则使用defaults段配置
listen:
frontend:用来匹配接受客户端所请求的域名,url等,并针对不同的匹配做不同的请求处理
backend:定义后端服务器集群,以及对后端服务器的一些权重、队列、连接数等选项的设置 - haproxy配置文件示例注释说明
global #全局配置参数段
daemon #以守护进程的方式运行
group haproxy #设置运行haproxy的用户组
user haproxy #设置运行haproxy的用户
log 127.0.0.1:514 local0 info #全局的日志配置,log关键字,指定127.0.0.1:514的syslog服务中local0日志设备,日志级别为info的日志
pidfile /application/haproxy/var/run/haproxy.pid #haproxy进程号的文件路径
maxconn 20480 #定义每个haproxy进程的最大连接数,由于每个连接包括一个客户端和一个服务端,所以单个TCP会话最大数目将是该值的两倍
nbproc 8 #设置haproxy启动时的进程数,该值的设置应该和服务器的cpu核数一致,创建多个进程可以减少每个进程的任务队列,但是过多的进程数也可能会导致进程的崩溃
defaults #默认部分的定义
log global
#log 127.0.0.1 local3 error
#使用127.0.0.1上的syslog服务的local3设备记录错误日志或者选择全局参数
mode http #mode语法:mode {http|tcp|health},http是七层模式,tcp是四层模式,health是健康检查
retries 3 #设置连接后端服务器的失败重试次数,连接失败的次数如果超过这里设置的值,HAProxy会将对应的后端服务器标记为不可用
timeout connect 300s #设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,但也可以使用其他的时间单位后缀
timeout client 300s #设置连接客户端发送数据时最长等待时间,默认单位是毫秒,也可以使用其他的时间单位后缀
timeout server 300s #设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,也可以使用其他的时间单位后缀
timeout check 3s #设置对后端服务器的检测超时时间,默认单位是毫秒,也可以使用其他的时间单位后缀
option dontlognull #日志不记录空连接
frontend www #通过frontend关键字定义了一个名为“www”的前端虚拟节点
bind *:80 #此选项只能在frontend和listen部分进行定义,用于定义一个或几个监听的套接字
mode http
option httplog #在默认情况下,haproxy日志是不记录HTTP请求的,这样很不方便HAProxy问题的排查与监控。通过此选项可以启用日志记录HTTP请求
option forwardfor #如果后端服务器需要获得客户端的真实IP,就需要配置此参数。由于HAProxy工作于反向代理模式,因此发往后端真实服务器的请求中的客户端IP均为HAProxy主机的IP,而非真正访问客户端的地址,这就导致真实服务器端无法记录客户端真正请求来源的IP,而“X-Forwarded-For”则可用于解决此问题
option httpclose #此选项表示在客户端和服务器端完成一次连接请求后,HAProxy将主动关闭此TCP连接。这是对性能非常有帮助的一个参数
log global #表示使用全局的日志配置,这里的“global”表示引用在HAProxy配置文件global部分中定义的log选项配置格式
default_backend htmpool #指定默认的后端服务器池,也就是指定一组后端真实服务器,而这些真实服务器组将在backend段进行定义。这里的htmpool就是一个后端服务器组
backend htmpool #通过 backend 关键字定义了一个名为“htmpool”的后端真实服务器组,在上面 “frontend”中也有定义
mode http
option redispatch #此参数用于cookie保持的环境中。在默认情况下,HAProxy会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性。而如果后端的服务器出现故障,客户端的cookie是不会刷新的,这就出现了问题。此时,如果设置此参数,就会将客户的请求强制定向到另外一个健康的后端服务器上,以保证服务的正常
option abortonclose #此参数,可以在服务器负载很高的情况下,自动结束掉当前队列中处理时间比较长的链接
balance roundrobin
#此关键字用来定义负载均衡算法。目前HAProxy支持多种负载均衡算法,常用的有如下几种:
roundrobin:是基于权重进行轮叫调度的算法,在服务器的性能分布比较均匀的时候,这是一种最公平、最合理的算法。此算法经常使用。
static-rr:也是基于权重进行轮叫的调度算法,不过此算法为静态方法,在运行时调整其服务器权重不会生效。
source:是基于请求源IP的算法。此算法先对请求的源IP进行hash运算,然后将结果与后端服务器的权重总数相除后转发至某个匹配的后端服务器。这种方式可以使同一个客户端IP的请求始终被转发到某特定的后端服务器。
leastconn:此算法会将新的连接请求转发到具有最少连接数目的后端服务器。在会话时间较长的场景中推荐使用此算法,例如数据库负载均衡等。此算法不适合会话较短的环境中,例如基于HTTP的应用。uri:此算法会对部分或整个URI进行hash运算,再经过与服务器的总权重相除,最后转发到某台匹配的后端服务器上。
uri_param:此算法会根据URL路径中的参数进行转发,这样可保证在后端真实服务器数量不变时,同一个用户的请求始终分发到同一台机器上。
hdr():此算法根据http头进行转发,如果指定的 http 头名称不存在,则使用 roundrobin 算法进行策略转发。
cookie SERVERID #表示允许向cookie插入SERVERID,每台服务器的SERVERID可在下面的server关键字中使用cookie关键字定义
option httpchk GET /index.php
#此选项表示启用HTTP的服务状态检测功能,它支持对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 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
#这个关键字用来定义多个后端真实服务器,不能用于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 admin_stats #通过 listen 关键字定义了一个名为“admin_stats”的实例,其实就是定义了一个 HAProxy 的监控页面
bind 0.0.0.0:9188
mode http
log 127.0.0.1 local0 err
stats refresh 30s #设置HAProxy监控统计页面自动刷新的时间
stats uri /haproxy-status #设置HAProxy监控统计页面的URL路径,可随意指定。例如,指定“stats uri /haproxy-status”,就可以通过http://IP:9188/haproxy-status 查看
stats realm welcome login\ Haproxy #设置登录HAProxy统计页面时密码框上的文本提示信息
stats auth admin:admin~!@ #设置登录HAProxy统计页面的用户名和密码。用户名和密码通过冒号分割。可为监控页面设置多个用户名和密码,每行一个
stats hide-version #用来隐藏统计页面上HAProxy的版本信息
stats admin if TRUE #通过设置此选项,可以在监控页面上手工启用或禁用后端真实服务器,仅在 haproxy1.4.9 以后版本有效