一、HAProxy概述
HAProxy是可提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,是免费、快速并且可靠的一种解决方案。HAProxy非常适用于并发大(并发达1w以上)web站点,这些站点通常又需要会话保持或七层处理。HAProxy的运行模式使得它可以很简单安全的整合至当前的架构中,同时可以保护web服务器不被暴露到网络上
官网:https://www.haproxy.org/
1. HAProxy的主要功能
-
负载均衡:
- TCP 和 HTTP 负载均衡:支持第 4 层 (TCP) 和第 7 层 (HTTP) 的负载均衡,可以在网络和应用层分发流量。
- 多种负载均衡算法:支持轮询 (Round Robin)、最少连接 (Least Connections)、源地址哈希 (Source IP Hash) 等多种调度算法,灵活分配流量。
-
高可用性:
- 健康检查:自动检测后端服务器的健康状态,如果某台服务器出现故障,HAProxy 会将流量重新分配到其他健康的服务器上。
- 会话保持 (Session Persistence):支持基于 IP、Cookie 或其他标识的会话保持,确保用户的会话数据一致性。
-
安全性:
- SSL/TLS 终止:可以在负载均衡器处终止 SSL/TLS 连接,减少后端服务器的负载,并集中管理证书。
- 访问控制:基于 IP 地址、用户代理等条件的访问控制,限制不合法的流量。
-
流量管理:
- 内容交换:根据 URL、头部信息等 HTTP 内容来决定将请求转发到哪个服务器。
- 请求/响应修改:支持修改 HTTP 请求和响应,例如添加、删除或替换头部信息。
-
性能和扩展性:
- 高并发处理:HAProxy 可以处理数千到数百万的并发连接,是高流量网站的理想选择。
- 分布式架构支持:可以与其他负载均衡器和代理软件集成,形成分布式处理架构。
-
日志和监控:
- 详细日志:支持生成详细的访问日志和错误日志,用于分析流量和故障排查。
- 内置监控:提供统计信息和状态页面,实时监控后端服务器和流量状况。
2. HAProxy的负载均衡策略
-
Round Robin(轮询):
- 策略描述:默认的负载均衡算法,按照服务器列表的顺序依次分发请求。每个新的连接或请求会被依次分配到下一个服务器,直到再次回到第一个服务器。
- 适用场景:所有服务器具有相同的处理能力,适用于大多数情况。
-
Least Connections(最小连接数):
- 策略描述:将请求分配给当前连接数最少的服务器。这样可以避免将请求分配到负载较高的服务器上,从而实现负载均衡。
- 适用场景:服务器间的处理能力不均衡或者有长时间连接的应用场景,如长连接的 WebSocket 或者长时间保持连接的 HTTP 请求。
-
Source IP(源IP地址):
- 策略描述:根据客户端的 IP 地址将请求分配到特定的服务器。同一个 IP 地址的请求总是被分配到相同的服务器,这有助于保持会话一致性。
- 适用场景:需要维护会话状态或者保持与客户端的某种关联时,如缓存服务器或者特定的应用场景。
-
URI(基于URI的请求):
- 策略描述:根据请求的 URI(Uniform Resource Identifier,统一资源标识符)将请求分配到服务器。例如,所有以
/api
开头的请求分配给特定的服务器。 - 适用场景:根据不同的请求路径将流量路由到不同的服务器,如分流 API 请求和静态资源请求。
- 策略描述:根据请求的 URI(Uniform Resource Identifier,统一资源标识符)将请求分配到服务器。例如,所有以
-
Static-RR(静态轮询):
- 策略描述:与标准 Round Robin 类似,但在每个配置周期内,服务器列表不会更改。即使某些服务器不可用或者新增服务器,也不会影响当前周期内的分发。
- 适用场景:当需要确保在整个周期内,同一请求总是被分配到同一个服务器时,可以使用这种策略。
-
Weighted Round Robin(加权轮询):
- 策略描述:根据服务器的权重值分配请求。具有较高权重的服务器会接收到更多的请求。权重可以根据服务器的性能或者配置进行调整。
- 适用场景:用于区分服务器性能不同的情况,确保资源更高效地利用。
-
Custom(自定义策略):
- 策略描述:可以根据特定的需求和条件,通过配置 HAProxy 的 ACL(Access Control List,访问控制列表)和规则,实现自定义的负载均衡策略。
- 适用场景:当以上内置策略无法满足特定需求时,通过自定义逻辑来实现更精确的负载均衡控制。
3.LVS、Nginx、HAProxy的区别
LVS(Linux Virtual Server)
-
类型:
- LVS 是一个基于 Linux 内核的负载均衡解决方案,属于四层(传输层)负载均衡器,工作在 OSI 模型的传输层。
-
工作原理:
- LVS 通过网络地址转换(NAT)、直接路由(DR)或 IP 隧道(Tunneling)等方式,将客户端请求分发到多台后端服务器上。它可以通过调度算法实现请求的分发,如轮询、加权轮询、最少连接等。
-
优点:
- 高性能:LVS 直接运行在 Linux 内核空间,处理效率高。
- 可靠性:基于 Linux 内核的稳定性和成熟度。
-
适用场景:
- 大规模高并发的网络环境,如互联网服务提供商(ISP)、大型网站等。
Nginx
-
类型:
- Nginx 最初设计作为高性能的 Web 服务器,后来增加了反向代理和负载均衡的功能,既可以作为 Web 服务器,也可以作为负载均衡器。
-
工作原理:
- Nginx 作为反向代理和负载均衡器,可以通过 HTTP、HTTPS、TCP 和 UDP 协议进行流量转发和负载均衡。它支持的负载均衡策略包括轮询、IP 哈希、最少连接等。
-
优点:
- 多功能性:可以同时充当 Web 服务器和负载均衡器。
- 易配置和灵活性:配置简单,性能稳定,支持的功能和模块丰富。
-
适用场景:
- Web 应用负载均衡、反向代理、静态文件服务等。
HAProxy
-
类型:
- HAProxy 是一个高性能的第七层(应用层)负载均衡器,工作在 OSI 模型的应用层。
-
工作原理:
- HAProxy 主要用于 HTTP 和 TCP 应用的负载均衡,支持高级的负载均衡算法和 ACL(访问控制列表)功能。它能够处理 HTTP、HTTPS、TCP 和 UDP 协议。
-
优点:
- 强大的负载均衡能力:支持多种负载均衡算法,如轮询、加权轮询、最少连接、源IP 等。
- 高性能和稳定性:专注于负载均衡功能,性能优异。
-
适用场景:
- Web 应用负载均衡、应用程序负载均衡、SSL 加速等。
主要区别总结
- 层次:LVS 是四层负载均衡器,Nginx 和 HAProxy 是七层负载均衡器。
- 设计目标:Nginx 最初作为 Web 服务器设计,具备反向代理和负载均衡功能;HAProxy 专注于高级负载均衡功能;LVS 则是基于 Linux 内核的负载均衡解决方案。
- 应用场景:LVS 适用于大规模网络环境;Nginx 适用于 Web 服务器和反向代理;HAProxy 适用于应用层的负载均衡需求。
二、HAProxy搭建Web群集
Haproxy服务器:192.168.192.20
Nginx 服务器1:192.168.192.30
Nginx 服务器2:192.168.192.40
1.haproxy 服务器部署
1.关闭防火墙,将安装Haproxy所需软件包传到/opt目录下
systemctl stop firewalld
setenforce 0
haproxy-1.5.19.tar.gz
2.编译安装 Haproxy
yum install -y pcre-devel bzip2-devel gcc gcc-c++ make
tar zxvf haproxy-1.5.19.tar.gz
cd haproxy-1.5.19/
make TARGET=linux3100 ARCH=x86_64
make install
TARGET=linux26 #内核版本,
#使用uname -r查看内核,如:2.6.18-371.el5,此时该参数用TARGET=linux26;kernel大于2.6.28的用TARGET=linux2628ARCH=x86_64 #系统位数,64位系统
3.Haproxy服务器配置
mkdir /etc/haproxy
cp examples/haproxy.cfg /etc/haproxy/
cd /etc/haproxy/
vim haproxy.cfg
global #全局配置,主要用于定义全局参数,属于进程级的配置,通常和操作系统配置有关
--4~5行--修改,定义haproxy日志输出设置和日志级别,local0为日志设备,默认存放到系统日志
log /dev/log local0 info #修改 syslog
log /dev/log local0 notice #修改
#log loghost local0 info
maxconn 4096 #最大连接数,需考虑ulimit -n限制,推荐使用10240
--8行--注释,chroot运行路径,为该服务自设置的根目录,一般需将此行注释掉
#chroot /usr/share/haproxy
uid 99 #用户UID
gid 99 #用户GID
daemon #守护进程模式
nbproc 1 #添加,设置并发进程数,建议与当前服务器CPU核数相等或为其2倍
defaults #配置默认参数,这些参数可以被用到Listen,frontend,backend组件
log global #引入global定义的日志格式
mode http #模式为http(7层代理http,4层代理tcp)
option httplog #日志类别为http日志格式
option dontlognull #不记录健康检查日志信息
retries 3 #检查节点服务器失败次数,连续达到三次失败,则认为节点不可用
redispatch #当服务器负载很高时,自动结束当前队列处理比较久的连接
maxconn 2000 #最大连接数,“defaults”中的值不能超过“global”段中的定义
#contimeout 5000 #设置连接超时时间,默认单位是毫秒
#clitimeout 50000 #设置客户端超时时间,默认单位是毫秒
#srvtimeout 50000 #设置服务器超时时间,默认单位是毫秒
timeout http-request 10s #默认http请求超时时间
timeout queue 1m #默认队列超时时间
timeout connect 10s #默认连接超时时间,新版本中替代contimeout,该参数向后兼容
timeout client 1m #默认客户端超时时间,新版本中替代clitimeout,该参数向后兼容
timeout server 1m #默认服务器超时时间,新版本中替代srvtimeout,该参数向后兼容
timeout http-keep-alive 10s #默认持久连接超时时间
timeout check 10s #设置心跳检查超时时间
--删除下面所有listen项--,添加
listen webcluster 0.0.0.0:80 #haproxy实例状态监控部分配置,定义一个名为webcluster的应用
option httpchk GET /test.html #检查服务器的test.html文件
balance roundrobin #负载均衡调度算法使用轮询算法roundrobin
server inst1 192.168.10.16:80 check inter 2000 fall 3 #定义在线节点
server inst2 192.168.10.17:80 check inter 2000 fall 3
4.添加haproxy 系统服务
cp /opt/haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy
chmod +x haproxy
chkconfig --add /etc/init.d/haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
service haproxy start 或 /etc/init.d/haproxy start
(启动失败原因可能是①配置文件问题,②端口被占用,关闭占用服务)
(此页面是没有检测到后端的网页文件,也有可能是无法连接到后端服务器)
2.节点服务器部署
(192.168.192.30)
echo “this is 30” > /var/www/html/kgc.html
(192.168.192.40)
echo “this is 40” > /var/www/html/kgc.html
注意网页文件名称一定要和配置文件中一致
3.测试
访问haproxy服务器时需要加网页路径
不停刷新测试负载均衡效果
4.日志定义
①默认haproxy的日志是输出到系统的syslog中,查看起来不是非常方便,为了更好的管理haproxy的日志,我们在生产环境中一般单独定义出来。需要将haproxy的info及notice日志分别记录到不同的日志文件中。
vim /etc/haproxy/haproxy.cfg
global
log /dev/log local0 info
log /dev/log local0 notice
service haproxy restart
②需要修改rsyslog配置,为了便于管理。将haproxy相关的配置独立定义到haproxy.conf,并放到/etc/rsyslog.d/下,rsyslog启动时会自动加载此目录下的所有配置文件。
vim /etc/rsyslog.d/haproxy.conf
if ($programname == 'haproxy' and $syslogseverity-text == 'info')
then -/var/log/haproxy/haproxy-info.log
&~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~
#说明:
这部分配置是将haproxy的info日志记录到/var/log/haproxy/haproxy-info.log下,将notice日志记录到/var/log/haproxy/haproxy-notice.log下。“&~”表示当日志写入到日志文件后,rsyslog停止处理这个信息。
③systemctl restart rsyslog.service #重启日志服务
访问网页多刷新几次,系统自动生成文件
tail -f /var/log/haproxy/haproxy-info.log #查看haproxy的访问请求日志信息