Haproxy

简介

HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年使用C语言开发的一个开源软件
是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器
支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计
企业版网站:https://www.haproxy.com
社区版网站:https://www.haproxy.org
github:https://github.com/haproxy

版本对比

功能社区版企业版
高级HTTP / TCP负载平衡和持久性支持支持
高级健康检查支持支持
应用程序加速支持支持
高级安全特性支持支持
高级管理支持支持
HAProxy Dev Branch新功能支持
24*7 支持服务支持
实时仪表盘支持
VRRP和Route Health Injection HA工具支持
ACL,映射和TLS票证密钥同步支持
基于应用程序的高级DDoS和Bot保护(自动保护)支持
Bot(机器人)监测支持
Web应用防火墙支持
HTTP协议验证支持
实时集群追踪支持

基本配置信息

官方文档:[HAProxy version 2.2.22 - Configuration Manual]

HAProxy 的配置文件haproxy.cfg由两大部分组成,分别是global和proxies部分

global:
全局配置段
进程及安全配置相关的参数  
性能调整相关参数  
Debug参数

proxies:代理配置段
 defaults:为frontend, backend, listen提供默认配置  
frontend:前端,相当于nginx中的server {}  
backend:后端,相当于nginx中的upstream {}  
listen:同时拥有前端和后端配置

global配置参数

Proxies配置

defaults

defaults 配置参数:

 option redispatch       #当server Id对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发
 option abortonclose     #当服务器负载很高时,自动结束掉当前队列处理比较久的链接,针对业务情况选择开启
 option http-keep-alive  #开启与客户端的会话保持
 option  forwardfor      #透传客户端真实IP至后端web服务器
 mode http|tcp           #设置默认工作类型,使用TCP服务器性能更好,减少压力
 timeout http-keep-alive 120s #session 会话保持超时时间,此时间段内会转发到相同的后端服务器
 timeout connect 120s    #客户端请求从haproxy到后端server最长连接等待时间(TCP连接之前),默认单位ms
 timeout server  600s    #客户端请求从haproxy到后端服务端的请求处理超时时长(TCP连接之后),默认单位ms,如果超时,会出现502错误,此值建议设置较大些,访止502错误
 timeout client  600s    #设置haproxy与客户端的最长非活动时间,默认单位ms,建议和timeout server相同
 timeout  check   5s     #对后端服务器的默认检测超时时间
 default-server inter 1000 weight 3   #指定后端服务器的默认设置
frontend

frontend 配置参数:

 bind:   #指定HAProxy的监听地址,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于listen字段中
 ​
 #格式:
 bind [<address>]:<port_range> [, ...] [param*]
 ​
 #注意:如果需要绑定在非本机的IP,需要开启内核参数:net.ipv4.ip_nonlocal_bind=1
backend
定义一组后端服务器,backend服务器将被frontend进行调用。

mode http|tcp      #指定负载协议类型,和对应的frontend必须一致  
option              #配置选项  
server              #定义后端real server

socat工具

对服务器动态权重和其它状态可以利用socat工具进行调整,Socat 是Linux 下的一个多功能的网络工具,名字由来是Socket CAT,相当于netCAT的增强版.Socat 的主要特点就是在两个数据流之间建立双向通道,且支持众多协议和链接方式。如IP、TCP、UDP、IPv6、Socket文件等。
使用案例:

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 
......
listen webcluster
    bind *:80  
    mode http     
    balance roundrobin
    server web1 172.25.254.10:80
    server web2 172.25.254.20:80
......
 
#socat使用
#查看haproxy状态
[root@haproxy ~]#echo "show info" | socat stdio /var/lib/haproxy/stats
#查看serer服务器的状态
[root@haproxy ~]#echo "show servers state" | socat stdio /var/lib/haproxy/stats
#查看server权重
[root@haproxy ~]#echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats
#更改server的权重
[root@haproxy ~]#echo "set weight webcluster/web1 1 " | socat stdio /var/lib/haproxy/stats 
#让指定的server服务器disable
[root@haproxy ~]#echo "disable server webcluster/web1" | socat stdio /var/lib/haproxy/stats 

Haproxy算法

静态算法

按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、链接数和响应速度等,且无法实时修改权重,只能靠重启HAProxy生效。

static-rr

基于权重的轮询调度,不支持权重的运行时利用socat进行动态调整及后端服务器慢启动,其后端主机数量没有限制,相当于LVS中的 wrr

listen webcluster
    bind *:80
    mode http
    balance static-rr
    server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2
    server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
first

根据服务器在列表中的位置,自上而下进行调度,但是其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务,因此会忽略服务器的权重设置,此方式使用较少

listen webcluster
    bind *:80
    mode http
    balance first
    server web1 172.25.254.10:80 maxconn 1 check inter 2 fall 3 rise 5 weight 2
    server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1

动态算法

基于后端服务器状态进行调度适当调整,优先调度至当前负载较低的服务器,且权重可以在haproxy运行时动态调整无需重启。

roundrobin

基于权重的轮询动态调度算法,支持权重的运行时调整,不同于lvs中的rr轮训模式,HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),其每个后端backend中最多支持4095个real server,支持对real server权重动态调整,roundrobin为默认调度算法

listen webcluster
    bind *:80
    mode http
    balance roundrobin
    server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 1
    server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
leastconn

加权的最少连接的动态,支持权重的运行时调整和慢启动,即当前后端服务器连接最少的优先调度(新客户端连接),比较适合长连接的场景使用,比如:MySQL等场景。

listen webcluster
    bind *:80
    mode http
    balance leastconn
    server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 3
    server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1

高级功能实验

基于cookie的会话保持

不支持 tcp mode,使用 http mode

#cookie
listen webcluster
    bind *:80
    mode http      
    balance roundrobin
    cookie WEBCOOKIE insert nocache indirect
    server web1 172.25.254.10:80 cookie lee1 check inter 2 fall 3 rise 5  weight 1
    server web2 172.25.254.20:80 cookie lee2 check inter 2 fall 3 rise 5  weight 1
    server web3_sorry 172.25.254.100:8080 backup
 验证cookie信息

点击刷新一直是同一个网页内容则成功

IP透传

四层:IP+PORT转发

七层:协议+内容交换

四层负载

在四层负载设备中,把client发送的报文目标地址(原来是负载均衡设备的IP地址),根据均衡设备设置的选择web服务器的规则选择对应的web服务器IP地址,这样client就可以直接跟此服务器建立TCP连接并发送数据,而四层负载自身不参与建立连接,而和LVS不同,haproxy是伪四层负载均衡,因为haproxy 需要分别和前端客户端及后端服务器建立连接

七层代理

七层负载均衡服务器起了一个反向代理服务器的作用,服务器建立一次TCP连接要三次握手,而client要访问webserver要先与七层负载设备进行三次握手后建立TCP连接,把要访问的报文信息发送给七层负载均衡;然后七层负载均衡再根据设置的均衡规则选择特定的webserver,然后通过三次握手与此台webserver建立TCP连接,然后webserver把需要的数据发送给七层负载均衡设备,负载均衡设备再把数据发送给client;所以,七层负载均衡设备起到了代理服务器的作用,七层代理需要和Client和后端服务器分别建立连接

七层ip透传

HAProxy配置

default增加forwardfor选项

webserver1服务器配置文件(apache)

[root@webserver2 ~]# systemctl restart httpd

webserver2服务器配置文件(nginx)

[root@webserver2 ~]# vim /etc/nginx/nginx.conf

[root@webserver2 ~]# systemctl restart nginx.service 

测试

apache

nginx

四层透传

修改mode 为tcp

listen webcluster
    bind *:80
    mode tcp
    balance roundrobin
    server web1 172.25.254.10:80 send-proxy check inter 2 fall 3 rise 5 weight 1
    server web2 172.25.254.20:80 send-proxy check inter 2 fall 3 rise 5 weight 1

在NGINX配置内添加变量proxy_protocol_addr 记录透传过来的客户端IP,并启用proxy_protocol代理功能

测试

HAProxy状态页面

 可以通过 Web界面监测状态

状态页配置项

stats enable                #基于默认的参数启用stats page
stats hide-version          #将状态页中haproxy版本隐藏
stats refresh <delay>         #设定自动刷新时间间隔,默认不自动刷新
stats uri <prefix>        #自定义stats page uri,默认值:/haproxy?stats 
stats realm <realm>       #账户认证时的提示信息,示例:stats realm   HAProxy\ Statistics
stats auth <user>:<passwd>  #认证时的账号和密码,可使用多次,默认:no authentication,可有多行用户
stats admin { if | unless } <cond> #启用stats page中的管理功能

实例

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 
listen stats
    mode http
    bind *:9999
    stats enable
    stats hide-version
    stats refresh 3
    stats uri /status
    stats auth ran:ran
[root@haproxy ~]# systemctl restart haproxy.service

测试

sorry server

在后端服务器全部无法访问时,提供错误响应

        HAProxy

        下载HTTPD,修改端口,启动httpd

        关闭后端服务器进行测试

自定义错误页面

[root@haproxy ~]#mkdir -p /etc/haproxy/errorpage/
[root@haproxy ~]#vim /etc/haproxy/errorpage/badpage.http
HTTP/1.0 503 Service Unavailable
Cache-Control: no-cache
Connection: close
Content-Type: text/html

<html>
<meta charset="UTF-8">
<body><h1>这是一个错误页面 Service Unavailable</h1>
No server is available to handle this request.
</body></html>
~                

配置到default区域

重启haproxy服务

测试(关闭两台web服务器)

  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值