Bootstrap

Haproxy搭建web集群

目录

一、Haproxy概述

1、Haproxy概念

2、Haproxy主要特性

3、Haproxy负载均衡均衡的策略

4、Haproxy、LVS、Nginx的区别

二、编译部署Haproxy

1、Haproxy 服务器部署

1.1、编译安装 Haproxy

1.2、配置 Haproxy

1.3、添加 Haproxy 系统服务

2、节点服务器部署

2.1、安装软件和开发工具

2.2、安装Nginx

2.3、在节点服务器上设置网页内容

3、测试web集群

三、日志分析

1、修改 Haproxy 配置文件

2、配置 rsyslog

3、查看 Haproxy 日志


一、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 日志
;