目录
一.常见的Web集群调度器
二.HAProxy基本介绍
1.HAProxy是什么?
2.HAProxy的特性
3.HAProxy常用的8种负载均衡调度算法
3.1 轮询:RR(Round Robin)
3.2 最小连接数:LC(Least Connections)
3.3 基本来源访问:SH(Source Hashing)
3.4 uri
3.5 url_param
3.7 source
3.8 static-rr
三.HAProxy对比分析
1.LVS与HAProxy
2.LVS、Nginx与HAproxy
3.HAProxy的优点
四、安装haproxy
1、yum 安装
2、第三方yum仓库安装haproxy
3、编译安装
3.1 解决lua环境
3.2 编译安装haproxy
五、配置文件介绍
1.全局设置(global)
2.默认参数(defaults)
3.监听设置(listen)
一.常见的Web集群调度器
Web集群调度器分为软件和硬件:
常用软件调度器:
- LVS:性能最好,搭建复杂
- Nginx:性能较好,但集群节点健康检查功能呢不强,高并发性能较弱
- Haproxy:高并发性能好
常用硬件调度器:
梭子鱼、绿盟、F5、Array等
二.HAProxy基本介绍
1.HAProxy是什么?
HAProxy 是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
是免费、快速并且可靠的一种解决方案。HAProxy非常适用于并发(并发达1w以上)web站点,这些站点通常又需要会话保持或七层处理。
HAProxy的运行模式使得它可以很简单安全的整合至当前的架构中,同时可以保护web服务器不被暴露到网络上。
2.HAProxy的特性
- 可靠性和稳定性非常好,可以与硬件级的F5负载均衡设备相媲美;
- 最高可以同时维护40000-50000个并发连接,单位时间内处理的最大请求数为20000个,最大处理能力可达10Git/s;
- 支持多达8种负载均衡算法,同时也支持会话保持;
- 支持虚机主机功能,从而实现web负载均衡更加灵活;
- 支持连接拒绝、全透明代理等独特的功能;
- 拥有强大的ACL支持,用于访问控制;
- 其独特的弹性二叉树数据结构,使数据结构的复杂性上升到了0(1),即数据的查寻速度不会随着数据条目的增加而速度有所下降;
- 支持客户端的keepalive功能,减少客户端与haproxy的多次三次握手导致资源浪费,让多个请求在一个tcp连接中完成;
- 支持TCP加速,零复制功能,类似于mmap机制;
- 支持响应池 (response buffering);
- 支持RDP协议;
- 基于源的粘性,类似nginx的ip hash功能,把来自同一客户端的请求在一定时间内始终调度到上游的同一服务器;
- 更好统计数据接口,其web接口显示后端集群中各个服务器的接收、发送、拒绝、错误等数据的统计信息;
- 详细的健康状态检测,web接口中有关于对上游服务器的健康检测状态, 并提供了一定的管理功能;
- 基于流量的健康评估机制;
- 基于http认证;
- 基于命令行的管理接口;
- 日志分析器,可对日志进行分析
3.HAProxy常用的8种负载均衡调度算法
Haproxy支持多种调度算法,最常用的有8种
3.1 轮询:RR(Round Robin)
RR算法是最简单最常用的一种算法,即轮询调度
理解举例:有三个节点A、B、C
第一个用户访问会被指派到节点A
第二个用户访问会被指派到节点B
第三个用户访问会被指派到节点C
第四个用户访问继续指派到节点A,轮询分配访问请求实现负载均衡效果
3.2 最小连接数:LC(Least Connections)
最小连接数算法,根据后端的节点连接数大小动态分配前端请求
理解举例: 有三个节点A、B、C,各节点的连接数分别为A:4 B:5 C:6
第一个用户连接请求,会被指派到A上,连接数变为A:5 B:5 C:6
第二个用户请求会继续分配到A上,连接数变为A:6 B:5 C:6;再有新的请求会分配给B,每次将新的请求指派给连接数最小的客户端
由于实际情况下A、B、C的连接数会动态释放,很难会出现一样连接数的情况
此算法相比较rr算法有很大改进,是米钱用到比较多的一种算法
3.3 基本来源访问:SH(Source Hashing)
基于来源访问调度算法,用于一些有Session会话记录在服务端的场景,可以基于来源的IP、Cookie等做集群调度
理解举例 有三个节点A、B、C,第一个用户第一次访问被指派到了A,第二个用户第一次访问被指派到了B
当第一个用户第二次访问时会被继续指派到A,第二个用户第二次访问时依旧会被指派到B,只要负载均衡器不重启,第一个用户都会被指派到A,第二个用户访问都会被指派到B,实现集群的调度
此调度算法好处是实现会话保持,但某些IP访问量非常大时会引起负载不均衡,部分节点访问量超大,影响业务使用
3.4 uri
表示根据请求的URI,做cdn需使用
3.5 url_param
表示根据HTTP请求头来锁定每 一 次HTTP请求。
3.6 rdp—cookie(name)
表示根据据cookie (name)来锁定并哈希每一次TCP请求。
3.7 source
表示根据请求的源IP,类似Nginx的IP hash机制。
3.8 static-rr
表示根据权重,轮询
三.HAProxy对比分析
1.LVS与HAProxy
LVS在企业应用中抗负载能力很强,但存在不足
- LVS不支持正则处理,不能实现动静分离
- 对于大型网站,LVS的实施配置复杂,维护成本相对较高
Haproxy是一款可提供高可用性、负载均衡、及基于TCP和HTTP应用的代理软件
- 适用于负载大的web站点
- 运行在硬件上可支持数以万计的并发连接的连接请求
2.LVS、Nginx与HAproxy
- LVS基于Linux操作系统实现软负载均衡,而Haproxy和Nginx是基于第三方应用实现的软负载均衡
- LVS是可实现4层的IP负载均衡技术,无法实现基于目录、URL的转发。而实现Haproxy和Nginx都可以实现4层和7层技术,Haproxy可提供TCP和Http应用的负载均衡综合解决方案
- LVS因为工作在ISO模型的第四层,其状态监测功能单一,而Haproxy在状态监测方面功能更丰富、强大,可支持端口、URL、脚本等多种状态监测方式
- Haproxy功能强大,但整体性能低于4层模式的LVS负载均衡
- Nginx主要用于web服务器或缓存服务器
3.HAProxy的优点
- Haproxy也是支持虚拟主机的
- Haproxy支持8种负载均衡器策略
- Haproxy的优点能补充nginx的一些缺点,比如支持Session的保持,Cookie的引导,同时支持通过获取指定url来检测后端服务器的状态
- Haproxy跟LVS类似,本身就只是一款负载均衡软件,单纯从效率上来讲Haproxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的
- Haproxy支持TCP协议的负载均衡转发
四、安装haproxy
1、yum 安装
CentOS 7 的默认的base仓库中包含haproxy的安装包文件,但是版本比较旧,是1.5.18的版本,距离当前版本已经有较长时间没有更新,由于版本比较旧所以有很多功能不支持,如果对功能和性能没有要求可以使用此版本,否则推荐使用新版【】。
yum install -y haproxy.x86_64
#安装haproxy
haproxy -v
#查看haproxy版本
yum info haproxy
#版本信息更详细
##yum安装的haproxy服务版本过于老旧,很多功能不支持
2、第三方yum仓库安装haproxy
yum install centos-release-scl-rh
yum install rh-haproxy18-haproxy
#使用第三方仓库安装haproxy
systemctl start rh-haproxy18-haproxy.service
#开启服务
3、编译安装
3.1 解决lua环境
HAProxy 支持基于lua实现功能扩展,lua是一种小巧的脚本语言,于1993年由巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组开发,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua 官网:www.lua.org
Lua 应用场景
- 游戏开发
- 独立应用脚本
- Web 应用脚本
- 扩展和数据库插件,如MySQL Proxy
- 安全系统,如入侵检测系统
由于CentOS7 之前版本自带的lua版本比较低并不符合HAProxy要求的lua最低版本(5.3)的要求,因此需要编译安装较新版本的lua环境,然后才能编译安装HAProxy,过程如下:
#当前系统版本
lua -v
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
https://www.lua.org
##登录lua官方网站,选择download,查看下载安装步骤
curl -L -R -O https://www.lua.org/ftp/lua-5.4.6.tar.gz
tar zxf lua-5.4.6.tar.gz
cd lua-5.4.6
make all test
yum groupinstall 'Development Tools'
#安装gcc命令
make all test
cd src
./lua -v
3.2 编译安装haproxy
ln -s lua-5.4.6 lua
#做软链接
yum -y install gcc openssl-devel pcre-devel systemd-devel
#安装依赖环境
tar xf haproxy-2.4.25.tar.gz
#上传需要的haproxy安装包,解压
cd haproxy-2.4.25/
#切换目录
cat INSTALL
#查看安装方法
make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_LUA=1 LUA_INC=/data/lua/src/ LUA_LIB=/data/lua/src/
#安装
########################参数详解########################
make ARCH=x86_64
#指定要构建的目标处理器架构为x86_64,即适用于64位Intel/AMD处理器的版本。
TARGET=linux-glibc
#设置目标平台为基于glibc的Linux系统,glibc是Linux系统中最常用的C语言标准库实现。
USE_PCRE=1
#启用PCRE支持,这将允许软件使用复杂的正则表达式进行匹配和处理。
USE_OPENSSL=1
#启用OpenSSL支持,提供加密算法、SSL/TLS协议等功能。
USE_ZLIB=1
#启用Zlib支持,用于数据压缩和解压缩功能。
USE_SYSTEMD=1
#启用Systemd支持
USE_LUA=1
#启用Lua脚本语言支持,允许在软件中编写和运行Lua脚本来扩展功能。
LUA_INC=/usr/local/lua/src/
#指定Lua头文件目录,编译时需要用到这些头文件来链接到Lua库。
LUA_LIB=/usr/local/lua/src/
#指定Lua库文件目录,编译时会链接到这个目录下的库文件以支持Lua功能
###############################################################
make install PREFIX=/apps/haproxy
#安装并指定目录
ln -s /apps/haproxy/sbin/haproxy /usr/sbin/
#做软连接
haproxy -v
#查看haproxy版本
#多行重定向,编辑配置文件,可以使用systemctl管理
tee /usr/lib/systemd/system/haproxy.service <<eof
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
eof
mkdir /etc/haproxy
#建立配置文件夹
#编辑配置文件
vim /etc/haproxy/haproxy.cfg
global
maxconn 100000
chroot /apps/haproxy
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
uid 99
gid 99
daemon
#nbproc 4
#cpu-map 1 0
#cpu-map 2 1
#cpu-map 3 2
#cpu-map 4 3
pidfile /var/lib/haproxy/haproxy.pid
log 127.0.0.1 local3 info
defaults
option http-keep-alive
option forwardfor
maxconn 100000
mode http
timeout connect 300000ms
timeout client 300000ms
timeout server 300000ms
listen stats
mode http
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status
stats auth haadmin:123456
listen web_port
bind 0.0.0.0:8899
mode http
log global
server web1 127.0.0.1:8080 check inter 3000 fall 2 rise 5
mkdir /var/lib/haproxy
#建立pid文件路径
useradd -r -s /sbin/nologin haproxy
#新建用户,设置目录权限(-r表示随机生成pid号)
systemctl enable --now haproxy
#自启并立即启动
systemctl status haproxy.service
#查看haproxy状态
五、配置文件介绍
编译安装完毕后。它的默认配置文件位置是源码包目录下的examples/option-http_proxy.cfg文件
而在system管理文件中并没有加载此目录,而是指向了/etc/haproxy/haproxy.cfg,新建的文件,便于自定义信息。
1.全局设置(global)
global #全局,表示该段信息为全局配置
maxconn 100000 #置全局的最大并发连接数为100000
chroot /usr/local/haproxy
#使运行中的haproxy进程被限制在/usr/local/haproxy目录下,以增强安全性。
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
#创建一个Unix套接字用于本地管理统计信息,权限为0600,只允许管理员访问。
uid 99 gid 99 #设置HAProxy进程运行时的用户ID和组ID
daemon #使haproxy以守护进程模式运行于后台。
pidfile /var/lib/haproxy/haproxy.pid
log 127.0.0.1 local3 info
#定义日志记录,将日志信息发送到本地IP地址127.0.0.1,并使用syslog标识符local3,
#记录级别为info以上的日志信息
2.默认参数(defaults)
defaults #定义默认的参数设置
option http-keep-alive #用HTTP长连接支持
option forwardfor #开启X-Forwarded-For头部的插入
maxconn 100000 #设置每个frontend或backend的最大并发连接数为100000
mode http #指定默认的模式为HTTP
timeout connect 300000ms #设置建立连接超时时间为300秒
timeout client 300000ms #设置客户端超时时间也为300秒
timeout server 300000ms #置后端服务器超时时间同样为300秒
3.监听设置(listen)
listen stats #监听范围
mode http #设置监听器的工作模式为HTTP。
bind 0.0.0.0:9999 #将监听器绑定到所有网络接口的9999端口,用于接收外部请求。
stats enable #启用统计信息收集和展示功能,允许通过HTTP访问查看自身状态信息
log global #使用全局日志设置记录与该监听器相关的活动
stats uri /status #设置访问统计信息页面的URI路径为/status。
stats auth hauser:123456
#配置基本的HTTP身份验证,用户名为 hauser密码为 123456
#这意味着只有知道此凭据的用户才能访问统计信息。
listen web_port
bind 0.0.0.0:8899 #创建另一个监听器并将其绑定到所有网络接口的8899端口,对外提供服务
mode http #设置该监听器也以HTTP模式工作。
log global #使用全局日志设置记录与该监听器相关的活动