Web服务器群集——HAProxy 搭建Web群集

HAProxy介绍

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

官网网站

HAProxy分为企业版,社区版。

HAProxy功能

HAProxy功能:

  • TCP和HTTP反向代理
  • 可作为SSL/TSL服务器
  • 可以针对HTTP请求添加cookie,进行路由后端服务器
  • 可平衡负载至后端服务器,并支持持久连接
  • 支持所有主服务器故障切换至备用服务器
  • 支持专用端口实现监控服务
  • 支持不影响现有连接情况下停止接受新连接请求
  • 可以在双向添加,修改或删除HTTP报文首部
  • 响应报文压缩
  • 支持基于pattern实现连接请求的访问控制
  • 通过特定的URI为授权用户提供详细的状态信息

不具备的功能:

  • 正向代理 squid,nginx
  • 缓存代理 varnish
  • web服务 nginx.tengine.apache. php.tomcat
  • UDP 目前不支持UDP协议,2.1版本会支持UDP协议代理
  • 单机性能–LVS

三大软件负载均衡器对比(LVS Nginx Haproxy)

LVS:

  1. 抗负载能力强。抗负载能力强、性能高,能达到F5硬件的60%;对内存和cpu资源消耗比较低
  2. 工作在网络4层,通过vrrp协议转发(仅作分发之用),具体的流量由linux内核处理,因此没有流量的产生
  3. 稳定性、可靠性好,自身有完美的热备方案;(如:LVS+Keepalived)
  4. 应用范围比较广,可以对所有应用做负载均衡
  5. 不支持正则处理,不能做动静分离
  6. 支持负载均衡算法:rr(轮循)、wrr(加权轮循)、lc(最小连接)、wlc(加权最小连接)
  7. 配置较复杂,对网络依赖比较大,稳定性很高

Ngnix:

  1. 工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构
  2. Nginx对网络的依赖比较小,理论上能ping通就就能进行负载功能
  3. Nginx安装和配置比较简单,测试起来比较方便
  4. 也可以承担高的负载压力且稳定,一般能支撑超过1万次的并发
  5. 对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测
  6. Nginx对请求的异步处理可以帮助节点服务器减轻负载
  7. Nginx仅能支持http、https和E-mail协议,这样就使得其在适用范围上较窄
  8. 不支持Session的直接保持,但能通过ip_hash来解决。对Big request header的支持不是很好
  9. 支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(加权轮循)、Ip-hash(Ip哈希)
  10. Nginx还能做Web缓存服务器即:Cache功能

HAProxy:

  1. 支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机
  2. 能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作
  3. 支持url检测,对后端服务器出问题的检测会有很好的帮助
  4. 更多的负载均衡策略比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现
  5. 单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度
  6. HAProxy可以对Mysql进行负载均衡,对后端的DB节点进行检测和负载均衡
  7. 支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
  8. 不能做Web缓存服务器即Cache

三大软件负载均衡器适用业务场景

  1. 网站建设初期,可以选用Nigix/HAproxy作为反向代理负载均衡(或者流量不大都可以不选用负载均衡),因为其配置简单,性能也能满足一般的业务场景。如果考虑到负载均衡器是有单点问题,可以采用Nginx+Keepalived/HAproxy+Keepalived避免负载均衡器自身的单点问题。
  2. 网站并发达到一定程度之后,为了提高稳定性和转发效率,可以使用LVS、毕竟LVS比Nginx/HAproxy要更稳定,转发效率也更高。不过维护LVS对运维人员的要求也会更高,投入成本也更大。

注:Nginx与Haproxy比较:Nginx支持七层、用户量最大,稳定性高,比较可靠。Haproxy支持四层和七层,支持更多的负载均衡算法,支持session保存等。具体选型看使用场景,目前来说Haproxy由于弥补了一些Nginx的缺点用户量也在不断提升。

扫描二维码关注公众号,回复: 13141004 查看本文章

HAProxy安装及基础配置

默认yum源

默认的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

编译安装HAProxy

源码包下载地址:https://src.fedoraproject.org/repo/pkgs/haproxy/
我下载的是 haproxy-2.3.5.tar.gz

解决HAProxy的依赖环境

解决lua环境

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

进入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

验证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


HAProxy启动脚本

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/

启动HAProxy

systemctl start haproxy
systemctl enable 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:同时拥有前端和后端配置

global配置参数

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服务器;最多可以定义两个

Proxies配置

Proxies配置-defaults

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 对后端服务器的默认检测超时时间

Proxies配置-frontend

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 # 调用的后端服务器组名称

Proxies配置-backend

定义一组后端服务器,backend服务器将被frontend进行调用。

mode http/tcp	#指定负载协议类型
option	#配置选项
server	#定义后端real server
  • 注意:option后面加httpchk,smtpchk, mysql-check, pgsql-check,ssl-hello-chk方法,可用于实现更多应用层检测功能。
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+backend配置实例

#官网业务访问入口==============================
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

Proxies配置-listen替代frontend+backend

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调度算法

HAProxy通过固定参数balance指明对后端服务器的调度算法,该参数可以配置在listenbackend选项中。
HAProxy的调度算法分为静态动态调度算法,但是有些算法可以根据参数在静态和动态算法中相互转换。

静态算法

  • 静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、链接数和响应速度等,且无法实时修改权重,只能靠重启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

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

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

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

其他算法

其他部分算法即可作为静态算法,又可以通过选项成为动态算法

source

源地址hash,基于用户源地址hash并将请求转发到后端服务器,默认为静态即取模方式,但是可以通过hash-type支持的选项更改,后续同一个源地址请求将被转发至一个后端web服务器,比较适用于session保持/缓存业务等场景

源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法和一致性hash

map-base取模法

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是动态的,支持在线调整权重,支持慢启动,优点在于当服务器的总权重发生变化时,厨调度结果影响是局部的,不会引起大的变动,hash (o)mod n。

hash对象
hash对象到后端服务器的映射关系
在这里插入图片描述
配置示例

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搭建集群

详细的HAProxy搭建集群可以参考我另一篇文章:
AProxy+Keepalived 负载均衡高可用配置

猜你喜欢

转载自blog.csdn.net/Cantevenl/article/details/115427708