目录
一、Haproxy概述
1、Haproxy概念
HAProxy是可提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,是免费、快速并且可靠的一种解决方案。HAProxy非常适用于并发大(并发达1w以上)web站点,这些站点通常又需要会话保持或七层处理。HAProxy的运行模式使得它可以很简单安全的整合至当前的架构中,同时可以保护web服务器不被暴露到网络上。
官网:https://www.haproxy.org/
2、Haproxy主要特性
可靠性和稳定性:HAProxy 具有极高的可靠性和稳定性,能够与硬件级的 F5 负载均衡设备相媲美。
高并发处理能力:
- 同时维护 40000-50000 个并发连接。
- 单位时间内处理的最大请求数为 20000 个。
- 最大处理能力可达 10 Gbps。
负载均衡算法:
- 支持多达 8 种负载均衡算法。
- 支持会话保持功能,确保同一会话始终分配到同一服务器。
虚拟主机支持:支持虚拟主机功能,实现更加灵活的 Web 负载均衡。
独特功能:
- 支持连接拒绝功能。
- 支持全透明代理。
ACL 支持:拥有强大的 ACL(访问控制列表)支持,用于细粒度的访问控制。
高效的数据结构:采用弹性二叉树数据结构,查找速度不随数据条目的增加而下降,查找复杂度为 O(1)。
客户端 Keepalive 支持:支持客户端的 Keepalive 功能,减少多次 TCP 三次握手带来的资源浪费,让多个请求在一个 TCP 连接中完成。
TCP 加速与零复制:支持 TCP 加速和零复制功能,类似于 mmap 机制,提升性能。
响应池支持:支持响应缓冲(response buffering),提高响应速度。
协议支持:支持 RDP 协议。
基于源的粘性:类似 Nginx 的 ip_hash 功能,将来自同一客户端的请求在一定时间内始终调度到同一服务器。
统计数据接口:提供完善的统计数据接口,Web 界面显示后端集群中各个服务器的接收、发送、拒绝、错误等统计信息。
健康状态检测:详细的健康状态检测,Web 界面提供上游服务器的健康检测状态,并具备一定的管理功能。
基于流量的健康评估:根据流量情况进行健康状态评估。
HTTP 认证:支持基于 HTTP 的认证机制。
命令行管理接口:提供强大的命令行管理接口,便于管理和配置。
日志分析器:内置日志分析器,可对日志进行详细分析。
3、Haproxy负载均衡均衡的策略
-
roundrobin:简单的轮询方式,将请求依次分配给后端服务器。
-
static-rr:基于权重的轮询,根据服务器权重分配请求。
-
leastconn:最少连接者优先,将请求分配给当前连接数最少的服务器。
-
source:基于请求源 IP,将来自同一 IP 的请求始终分配给同一台服务器,适合会话保持。
-
uri:基于请求的 URI 进行负载均衡,常用于 CDN 场景。
-
url_param:根据请求的 URL 参数进行负载均衡,需指定一个 URL 参数名称,如
balance url_param <name>
。 -
hdr(name):基于 HTTP 请求头进行负载均衡,每次 HTTP 请求都会根据指定的请求头值进行分配。
-
rdp-cookie(name):基于 RDP 协议中的 Cookie 进行负载均衡,通过哈希每次 TCP 请求中的指定 Cookie 值来锁定请求。
4、Haproxy、LVS、Nginx的区别
-
实现方式:LVS 基于 Linux 操作系统内核实现软负载均衡,而 HAProxy 和 Nginx 是基于第三方应用实现的软负载均衡。
-
层次支持:LVS 实现 4 层的 IP 负载均衡技术,无法实现基于目录、URL 的转发。HAProxy 和 Nginx 都可以实现 4 层和 7 层技术,HAProxy 可提供 TCP 和 HTTP 应用的负载均衡综合解决方案。
-
状态监测:LVS 工作在 ISO 模型的第 4 层,状态监测功能较为单一。HAProxy 在状态监测方面功能更为丰富,支持端口、URL、脚本等多种状态检测方式。
-
性能对比:HAProxy 功能强大,但整体性能低于 4 层模式的 LVS 负载均衡。
-
应用场景:Nginx 主要用于 Web 服务器或缓存服务器。虽然 Nginx 的 upstream 模块支持集群功能,但集群节点的健康检查功能不如 HAProxy,性能也稍逊色于 HAProxy。
①、LVS
- 基于 Linux 操作系统内核实现软负载均衡。
- 实现 4 层的 IP 负载均衡技术,无法基于目录、URL 转发。
- 仅在 4 层做分发,抗负载能力强,适用于广泛的应用场景。
- 状态监测功能较为单一,只支持基于端口的健康检查。
②、Nginx:
- 基于第三方应用实现软负载均衡,主要用于 Web 服务器或缓存服务器。
- 支持 4 层和 7 层技术,具备强大的反向代理能力。
- 支持正则匹配,但只支持基于端口的健康检查。
- 不支持直接的 session 保持,但可以通过
ip_hash
解决。 - 对网络稳定性要求不高,upstream 模块支持集群功能,但健康检查功能较弱,性能逊色于 HAProxy。
③、HAProxy:
- 基于第三方应用实现软负载均衡,提供 TCP 和 HTTP 应用的综合负载均衡解决方案。
- 支持 8 种负载均衡策略,功能强大。
- 支持 4 层和 7 层技术,支持 URL 检测和 session 保持。
- 状态监测功能丰富,支持端口、URL、脚本等多种检测方式。
- 在高并发情况下,性能优于 Nginx,但整体性能低于 4 层模式的 LVS。
二、编译部署Haproxy
环境配置:
- HAProxy 服务器 IP:
172.16.88.22
- Nginx 服务器1 IP:
172.16.88.33
- Nginx 服务器2 IP:
172.16.88.44
- 客户端 IP:
172.16.88.55
1、Haproxy 服务器部署
首先关闭防火墙和临时和防护
[root@fuzai ~]# systemctl stop firewalld
[root@fuzai ~]#
[root@fuzai ~]# setenforce 0
1.1、编译安装 Haproxy
安装软件,开发工具
[root@fuzai ~]# yum install -y pcre-devel bzip2-devel gcc gcc-c++ make
解压安装包
tar zxvf haproxy-1.5.19.tar.gz
cd /opt/haproxy-1.5.19/
编译和安装 HAProxy
make TARGET=linux2628 ARCH=x86_64
make install
参数说明:
TARGET=linux2628
:指定内核版本,大于 2.6.28 的内核使用此参数。ARCH=x86_64
:指定系统位数,64 位系统使用此参数。
1.2、配置 Haproxy
创建配置目录并复制示例配置文件
[root@fuzai haproxy-1.5.19]# mkdir /etc/haproxy
[root@fuzai haproxy-1.5.19]#
[root@fuzai haproxy-1.5.19]# cp /opt/haproxy-1.5.19/examples/haproxy.cfg /etc/haproxy/
[root@fuzai haproxy-1.5.19]#
编辑Haproxy配置文件
vim /etc/haproxy/haproxy.cfg
①、全局配置部分
②、默认配置部分
③、负载均衡配置部分
其余配置全部删掉!
参数说明:
balance roundrobin
:负载均衡调度算法使用轮询。check inter 2000
:健康检查间隔 2000 毫秒。fall 3
:节点失效判断为连续三次检测失败。
1.3、添加 Haproxy 系统服务
添加初始化脚本并设置权限
cp /opt/haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy
chmod +x /etc/init.d/haproxy
添加到系统服务并启动
chkconfig --add /etc/init.d/haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
service haproxy start
2、节点服务器部署
首先关闭防火墙和临时防护
[root@jie01 ~]# systemctl stop firewalld
[root@jie01 ~]# setenforce 0
2.1、安装软件和开发工具
[root@jie01 sbin]# yum install -y pcre-devel zlib-devel gcc gcc-c++ make
创建 Nginx 用户
[root@jie01 sbin]# useradd -M -s /sbin/nologin nginx
2.2、安装Nginx
cd /opt
tar zxvf nginx-1.12.0.tar.gz
cd nginx-1.12.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
make && make install
设置符号链接并启动 Nginx
[root@jie01 sbin]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@jie01 sbin]# nginx
2.3、在节点服务器上设置网页内容
172.16.88.33:
echo "this is cxc" > /usr/local/nginx/html/test.html
172.16.88.44:
echo "this is zmx" > /usr/local/nginx/html/test.html
3、测试web集群
打开浏览器访问负载均衡服务器地址
http://172.16.88.22/test.html
不断刷新浏览器,测试负载均衡效果!
三、日志分析
在实际的生产环境中,HAProxy 是一种常用的负载均衡器,通常我们希望能够更好地管理其生成的日志信息。默认情况下,HAProxy 的日志输出到系统的 syslog 中,为了更方便地查看和分析日志,我们可以单独定义 HAProxy 的日志输出,并通过 rsyslog 进行配置,将不同级别的日志记录到不同的文件中。
1、修改 Haproxy 配置文件
在 global
部分添加以下配置,将 info
级别的日志记录到 /var/log/haproxy/haproxy-info.log
,将 notice
级别的日志记录到 /var/log/haproxy/haproxy-notice.log
:
vim /etc/haproxy/haproxy.cfg
global
log /dev/log local0 info
log /dev/log local0 notice
service haproxy restart
2、配置 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
&~
$programname == 'haproxy'
:筛选出由 HAProxy 生成的日志。$syslogseverity-text == 'info'
和$syslogseverity-text == 'notice'
:过滤出相应级别的日志。-
:表示将日志写入到指定文件。&~
:表示在日志写入后停止处理这条日志。
systemctl restart rsyslog.service //重启服务
3、查看 Haproxy 日志
现在,Haproxy 的 info
级别和 notice
级别的日志会分别记录在 /var/log/haproxy/haproxy-info.log
和 /var/log/haproxy/haproxy-notice.log
文件中。
tail -f /var/log/haproxy/haproxy-info.log # 查看 info 级别的 HAProxy 日志
tail -f /var/log/haproxy/haproxy-notice.log # 查看 notice 级别的 HAProxy 日志