HAProxy是法国开发者威利塔罗(Willy Tarreau)在2000年使用C语言开发的一个开源软件,是一款具备高并发(一万以上)、高性能的TCP和HTTP负载均衡器,支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计
官网网站
HAProxy分为企业版,社区版。
HAProxy功能:
不具备的功能:
LVS:
Ngnix:
HAProxy:
注:Nginx与Haproxy比较:Nginx支持七层、用户量最大,稳定性高,比较可靠。Haproxy支持四层和七层,支持更多的负载均衡算法,支持session保存等。具体选型看使用场景,目前来说Haproxy由于弥补了一些Nginx的缺点用户量也在不断提升。
默认的base仓库中包含haproxy的安装包文件,但是版本比较旧,是1.5.18的版本,距离当前版本已经有较长时间没有更新,由于版本比较旧所以有很多功能不支持,如果对功能和性能没有要求可以使用此版本,否则推荐使用新版本。
yum install -y haproxy
验证haprovy版本
haproxy -v
HA-Proxy version 1.5.18 2016/05/10
Copyright 2000-2016 Willy Tarreau <[email protected]>
去国外网站下载:https://pkgs.org/search/?q=haproxy
选择centos7
#基于互联网在线安装
# cheese-release-7-1.noarch.rpm 这个包也必须下载 因为是依赖
rpm -ivh cheese-release-7-1.noarch.rpm
会在/etc/yum.repos.d/ 下产生一个新的cheese.repo
yum install -y haproxy-1.8.14-1.el7.x86_64.rpm
#验证haproxy版本
haproxy -v
HA-Proxy version 1.8.26 2020/08/03
Copyright 2000-2020 Willy Tarreau <[email protected]>
cat /lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=network.target
[Service]
Environment="CONFIG=/etc/haproxy/haproxy.cfg" "PIDFILE=/run/haproxy.pid"
EnvironmentFile=-/etc/sysconfig/haproxy
ExecStartPre=/usr/sbin/haproxy -f $CONFIG -c -q
ExecStart=/usr/sbin/haproxy -Ws -f $CONFIG -p $PIDFILE $OPTIONS
ExecReload=/usr/sbin/haproxy -f $CONFIG -c -q
ExecReload=/bin/kill -USR2 $MAINPID
KillMode=mixed
Type=notify
[Install]
WantedBy=multi-user.target
源码包下载地址:https://src.fedoraproject.org/repo/pkgs/haproxy/
我下载的是 haproxy-2.3.5.tar.gz
HAProxy支持基于lua实现功能扩展,lua是一种小巧的脚本语言,于1993年由巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组开发,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua应用场景
游戏开发
独立应用脚本
web应用脚本
扩展和数据库插件,如MySQL Proxy
安全系统,如入侵检测系统
由于centos自带的lua版本比较低并不符合HAProxy要求的lua最低版本(5.3)的要求,因此需要编译安装较新版本的lua环境,然后才能编译安装HAProxy。
curl -R -O https://www.lua.org/ftp/lua-5.4.3.tar.gz
tar xf lua-5.4.3.tar.gz -C /usr/local
cd /usr/local/lua-5.4.3
yum install -y readline-devel
make linux
查看安装版本
./src/lua
lua-5.4.3 Copyright (C) 1994-2020 Lua.org, PUC-Rio
> print('hello world')
hello world
yum install -y gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-tools iotop bc zlib-devel ntpdate lsof tcpdump
进入haproxy源码包目录
make -j `lscpu |awk 'NR==4{print $2}'` ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE
_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 USE_LUA=1 LUA_INC=/usr/local/lua-5.4.3/src/ LUA_LIB=/usr/local/lua-5.4.3/src/ PREFIX=/usr/local/haproxy
echo $? 检查是否成功编译
make install PREFIX=/usr/local/haproxy
cd /usr/local/haproxy/sbin
./haproxy -v
HA-Proxy version 2.3.5-5902ad9 2021/02/06 - https://haproxy.org/
Status: stable branch - will stop receiving fixes around Q1 2022.
Known bugs: http://www.haproxy.org/bugs/bugs-2.3.5.html
Running on: Linux 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64
vim /lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
建立配置文件
创建配置文件目录
mkdir -p /etc/haproxy
将样本配置文件拷贝到/etc/haproxy里
cp examples/haproxy.cfg /etc/haproxy/haproxy.cfg
如果没有haproxy.cfg 可以自己写一个
vim /etc/haproxy/haproxy.cfg
global
user haproxy # 用户
group haproxy
daemon
nbproc 2
#cpu-map 1 0
#cpu-map 2 1
maxconn 100000
chroot /usr/local/haproxy # 锁定家目录
pidfile /var/lib/haproxy/haproxy.pid #pid文件位置
log 127.0.0.1 local0 info
defaults
log global
option httplog
option http-keep-alive
option redispatch
option forwardfor
maxconn 100000
mode http
retries 3
timeout check 5s
timeout connect 5s
timeout client 60s
timeout server 60s
timeout http-request 10s
timeout queue 1m
listen stats
bind 0.0.0.0:1234 # 端口1234
log global
mode http
stats enable
stats hide-version
stats realm Haproxy\ Statistics
stats uri /stats # 查看状态网页后缀
stats refresh 5s
stats auth admin:123 # 授权访问 用户名:密码
创建haproxy用户和组
groupadd haproxy
useradd -M -s /sbin/nologin haproxy -g haproxy
给用户haproxy授权
mkdir -p /var/lib/haproxy
chown -R haproxy:haproxy /usr/local/haproxy/
chown -R haproxy:haproxy /var/lib/haproxy/
systemctl start haproxy
systemctl status haproxy
浏览器输入自己ip:端口/stats
至此 说明HAProxy安装成功
HAPrpxy的配置文件haproxy.cfg由两大部分组成,分别是global和proxies部分。
global:全局配置段
进程及安全配置相关的参数
性能调整相关参数
Debug参数
proxies:代理配置段
defaults:为frontend,backend,listen提供默认配置
frontend:前端,相当于nginx中的server { }
backend:后端,相当于nginx中的upstrea { }
listen:同时拥有前端和后端配置
chroot
锁定运行目录
deamon
以守护进程运行
stats socket
/var/lib/haproxy/haproxy.sock mode 600 level admin # socket文件
user,group,uid,gid 运行haproxy的用户身份
nbproc
开启的haproxy进程数,与CPU保持一致
nbthread
指定每个haproxy进程开启的线程数,默认为每个进程一个线程
cpu-map 1 0 绑定haproxy 进程至指定CPU
cpu-map 2 1
如果nbproc 4
cpu-map 1 0
cpu-map 2 1
cpu-map 3 2
cpu-map 4 3
maxconn
每个haproxy进程的最大并发连接数
maxsslconn
每个haproxy进程ssl最大连接数,用于haproxy配置了证书的场景下
maxconnrate
每个进程每秒创建的最大连接数量
spread-checks
后端server状态check随机提前或延迟百分比时间,建议2-5(28%-50%)之间
pidfile
指定pid文件路径
log 127.0.0.1 local3 info #定义全局的syslog服务器;最多可以定义两个
option redispatch
当server Id对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发(这个选项常用)
option abortonclose
当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
option http-keep-alive
开启与客户端的会话保持
option forwardfor
透传客户端真实IP至后端web服务器
mode http
设置默认工作类型
timeout http-keep-alive 120s
session会话保持超时时间,范围内会转发到相同的后端服务器
timeout connect 120s
客户端请求从haproxy到后端server的最长连接等待时间(TCP之前)
timeout server 600s
客户端请求从haproxy到后端服务端的请求处理超时时长(TCP之后)
timeout client 600s
设置haproxy与客户端的最长非活动时间
timeout check 5s
对后端服务器的默认检测超时时间
bind:指定HAProxy的监听地址,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于listen字段中
bind[<address>] :<port_range> [,...][param*]
listen http_proxy #监听http的多个IP的多个端口和sock文件
bind :80, :443, :8881-8810
bind 10.0.0.1:10080,10.0.0.1:10443
bind /var/run/ss1-frontend.sock user root mode 600 accept-proxy
listen http_https_proxy whttps监听
bind :80
bind :443 ssl crt /etc/haproxy/site.pem
listen http_https_proxy_explicit #监听ipv6.ipv4和unix sock文件
bind ipv6e:80
bind ipv4epublic_ssl:443 ssl crt /etc/haproxy/site.pem
bind [email protected] user root mode 600 accept-proxy
listen external_bind_app1 #监听file descriptor
bind "fdGs{FD_APP1y"
示例:
frontend wEB_PORT
bind :80,:8088
bind 192.168.188.102:10080,:8801-8810,192.168.188.101:9001-9010
mode http/tcp # 指定负载协议类型
use_backend backend_name # 调用的后端服务器组名称
定义一组后端服务器,backend服务器将被frontend进行调用。
mode http/tcp #指定负载协议类型
option #配置选项
server #定义后端real server
check # 对指定real进行健康状态检查,默认不开启
addr IP # 可指定的健康状态监测IP
port num # 指定的健康状态监测端口
inter num # 健康状态检查间隔时间,默认2008 ms
fall num # 后端服务器失效检查次数,默认为3
rise num # 后端服务器从下线恢复检查次数,默认为2
weight # 默认为1。最大值为256,0表示不参与负载均衡
backup # 将后端服务器标记为备份状态
disabled # 将后端服务器标记为不可用状态
redirect prefix http://www.maomao.com/ # 将请求临时重定向至其它URL,只适用于http模式
maxconn <maxconn>:当前后端server的最大并发连接数
backlog <backlog>:当server的连接数达到上限后的后援队列长度
示例:
frontend WEB_PORT
bind :80
use_backend linux88-host
backend linux88-host
server web1 192.168.188.101:80 check inter 2s fall 3 rise 5
server web2 192.168.188.188:8080 check inter 2s fall 3 rise 5
frontend WEB_PORT
bind :80
use_backend linux88-host
backend linux88-host
server web1 192.168.188.101:80 check inter 2s fall 3 rise 5
server web2 192.168.188.188:8080 check addr 192.168.188.188 port 8080 inter 2s fall 3 rise 5
#官网业务访问入口==============================
frontend WEB_PORT_80
bind 192.168.188.10:80
mode http
use_backend web_prot_http_nodes
backend web_prot_http_nodes
mode http
option forwardfor
server 192.168.188.100 192.168.188.100:8080 check inter 3000 fall 3 rise 5
server 192.168.188.101 192.168.188.101:8080 check inter 3000 fall 3 rise 5
listen的方式是最常用的
使用listen替换frontend和backend的配置方式:
#官网业务访问入口=====================================
listen WEB_PORT_80
bind 192.168.188.10:80
mode http
option forwardfor
server webi 192.168.188.100:80 check inter 3000 fall 3 rise 5
server web2 192.168.188.101:80 check inter 3000 fall 3 rise 5
HAProxy通过固定参数balance指明对后端服务器的调度算法,该参数可以配置在listen或backend选项中。
HAProxy的调度算法分为静态和动态调度算法,但是有些算法可以根据参数在静态和动态算法中相互转换。
服务器动态权重调整:
yum install socat
Socat 是 Linux下的一个多功能的网络工具,名字来由是Socket CAT,
Socat 的主要特点就是在两个数据流之间建立通道,且支持众多协议和链接方式。
如IP、TCP、UDP、IPv6、Socket文件等。
echo "show info" | socat stdio /var/lib/haproxy/haproxy.sock
echo "get weight web_host/web1" | socat stdio /var/lib/haproxy/haproxy. sock1 (initial 1)
echo "set weight web_host/web1 2" socat stdio /var/lib/haproxy/haproxy.sockBackend is using a static LB algorithm and only accepts weights ' e%' and '100%"
static-rr
:基于权重的轮询调度,不支持权重的运行时调整及后端服务器慢启动,其后端主机数量没有限制
listen web_host
bind 192.168.188.10:80,:8801-8810,192.168.188.10:9001-9010
mode http
log global
balance static-rr
server web1 192.168,188.100:80 weight 1 check inter 3000 fall 2 rise 5
server web2 192.168.188.101:80 weight 2 check inter 3000 fall 2 rise 5
动态算法:基于后端服务器状态进行调度适当调整,比如优先调度至当前负载较低的服务器,且权重可以在haproxy运行时动态调整 无需重启
roundrobin
:基于权重的轮询动态调度算法,支持权重的运行时调整,不完全等于lvs中的rr轮训模式,HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),其每个后端backend中最多支持4095个realserver,roundrobin为默认调度算法,且支持对real server权重动态调整。
listen web_host
bind 192.168.188.10:80,:8801-8810,192.168.188.10:9001-9010
mode http
log global
balance roundrobin
server web1 192.168.188.100:80 weight 1 check inter 3000 fall 2 rise 5
server web2 192.168.188.101:80 weight 2 check inter 3000 fall 2 rise 5
leastconn
加权的最少连接的动态,支持权重的运行时调整和慢启动,即当前后端服务器连接最少的优先调度(新客户端连接),比较适合长连接的场景使用,比如MySQL等场景。
listen web_host
bind 192.168.188.10:80,:8801-8810,192.168.188.10:9001-9010
mode http
log global
balance leastconn
server web1 192.168.188.100:80 weight 1 check inter 3000 fall 2 rise 5
server web2 192.168.188.101:80 weight 1 check inter 3000 fall 2 rise 5
其他部分算法即可作为静态算法,又可以通过选项成为动态算法
源地址hash,基于用户源地址hash并将请求转发到后端服务器,默认为静态即取模方式,但是可以通过hash-type支持的选项更改,后续同一个源地址请求将被转发至一个后端web服务器,比较适用于session保持/缓存业务等场景
源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法和一致性hash
map-based:取模法,基于服务器总权重的hash数组取模,该hash是静态的即不支持在线调整权重,不支持慢启动,其对后端服务器调度均衡,缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因权重发生变化而导致调度结果整体改变。
所谓取模运算,就是计算两个数相除之后的余数,10%7=3,7%4=3,基于权重取模:(2^32-1)%(1+1+2)
取模法配置示例:
listen web_host
bind 192.168.188.10:80, :8801-8810,192.168.188.10:9001-9010
mode tcp
log global
balance source
server web1 192.168.188.100:80 weight 1 check inter 3000 fall 2 rise 5
server web2 192.168.188.101:80 weight 1 check inter 3000 fall 2 rise 5
一致性哈希,该hash是动态的,支持在线调整权重,支持慢启动,优点在于当服务器的总权重发生变化时,厨调度结果影响是局部的,不会引起大的变动,hash (o)mod n。
listen web_host
bind 192.168.188.10:80,:8801-8810,192.168.188.10:9001-9010
mode tcp
log global
balance source
hash-type consistent
server web1 192.168.188.100:80 weight 1 check inter 3000 fall 2 rise 5
server web2 192.168.188.101:80 weight 1 check inter 3000 fall 2 rise 5
详细的HAProxy搭建集群可以参考我另一篇文章:
AProxy+Keepalived 负载均衡高可用配置