当前位置: 首页 > news >正文

Haproxy搭建Web集群

目录

一、Haproxy

1.什么是Haproxy

2.Haproxy的特性 

3.Haproxy负载均衡的策略(常见) 

4.Haproxy、LVS、Nginx的区别 

二、部署Haproxy

1.Haproxy服务器部署 

1.1关闭防火墙以及增强功能

1.2编译安装

1.3配置Haproxy 

1.4添加Haproxy服务 

2.节点服务器部署(2台) 

2.1关闭防火墙以及增强功能

2.2安装工具

2.3编译安装Nginx 

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

2.5测试Web集群 

三、日志分析 

1.修改Haproxy配置文件 

2.配置rsyslog 

3.查看Haproxy日志 


一、Haproxy

1.什么是Haproxy

HAProxy(High Availability Proxy)是一款开源、高性能的负载均衡器和代理服务器软件。它主要用于提升网站和应用程序的可扩展性、可靠性和性能,尤其在高流量环境下表现出色HAProxy通常用于分发流量到多个后端服务器,从而确保应用的高可用性和负载均衡

2.Haproxy的特性 

1.可靠性和稳定性
HAProxy以其稳定性著称,可以与硬件负载均衡设备(如 F5)媲美,特别适合高并发、高可用
性需求的场景
2.高并发处理能力
最高可以同时处理40000-50000个并发连接,每秒处理最大20000个请求,最大吞量达到
10Gbps,非常适合大规模的 Web 服务和应用
3.多种负载均衡算法
支持多达8种负载均衡算法,如轮询、最小连接、源地址哈希等,还支持会话保持,确保来自同一客户端的请求可以持续调度到同一服务器,适合需要状态保持的应用
4.虚拟主机支持
支持虚拟主机功能,提供灵活的Web负载均衡,允许在单个HAProxy实例上为多个域名或应用服务
5.连接拒绝和全透明代理
支持连接拒绝功能,当特定条件满足时,可以直接拒绝请求,防止对后端资源的浪费
全透明代理允许客户端与后端服务器保持直接通信,前端代理仅用于转发请求,提升安全性和透明度

6.强大的 ACL 支持
访问控制列表(ACL)功能可以灵活定义和应用,支持基于 IP 地址、请求头、路径等多种条件进行访问控制,提高系统的安全性
7.弹性二叉树数据结构
HAProxy使用了一种优化的弹性二叉树数据结构,其时间复杂度为0(1),即查找速度不会因为数据量增加而减慢,保证了高效的性能
8.Keepalive 功能
支持客户端的keepalive功能,减少了客户端和HAProxy之间的多次TCP握手,从而节省资
源,并允许多个请求在一个TCP连接中完成,提升效率
9.TCP加速和零复制(zero-copy)
支持TCP加速和零复制功能,类似于mmap机制,可以有效减少CPU开销,提升数据传输效率
10.响应缓冲池
支持响应缓冲池(response buffering),使得响应请求可以在返回客户端之前先缓冲,提升传
输稳定性
11.RDP 协议支持
支持RDP协议,适用于需要负载均衡远程桌面服务的场景
12.基于源的粘性
通过类似于Nginx的 ip hash 功能,实现基于源的粘性调度,将来自同一客户端的请求分配到
同一台后端服务器,确保负载均衡的同时保持连接一致性

13.丰富的统计数据接口
提供强大的Web统计界面,显示后端集群中服务器的接收、发送、拒绝、错误等数据,便于监控和分析
14.健康状态检测
详细的健康检查,通过 Web 接口可以查看后端服务器的健康状态,支持多种健康检查策略,如HTTP 响应状态检测、TCP 连接检测等
15.基于流量的健康评估
基于流量进行健康评估,允许根据流量负载动态调整服务器的权重和调度方式
16.HTTP 认证
支持基于 HTTP 的认证机制,可以通过用户名和密码来限制访问
17.命令行管理接口
提供基于命令行的管理接口,可以实时对 HAProxy 进行操作和监控,方便集成到自动化运维工具中
18.日志分析器
提供日志分析功能,允许对系统日志进行详细分析,帮助诊断问题或优化性能

3.Haproxy负载均衡的策略(常见) 

roundrobin-轮询
说明:

轮询是最简单的负载均衡策略,它会依次将请求分发到每个服务器节点上。当所有服务器都收到一个请求后,轮询从头开始
适用场景:

适用于后端服务器性能相近且没有特殊调度需求的场景

static-rr-静态权重轮询
说明:

该策略基于服务器的权重进行轮询,权重较高的服务器会分配更多的请求。它可以有效利用服务器的不同处理能力进行调度
适用场景:

适用于服务器性能差异较大、需要根据服务器的处理能力来分配负载的场景

leastconn-最少连接优先
说明:

此策略将请求分配给当前活跃连接最少的服务器,确保新请求被分配到负载最小的服务器上
适用场景:

适用于长连接或请求时间较长的场景,例如数据库连接、WebSocket等。能够平衡服务器负载,避免某些服务器因长连接过多而超载

source-基于源IP
说明:

根据请求的源IP地址进行哈希,确保同一IP地址的请求在一定时间内始终路由到同一台后端服务器。这种策略可以帮助保持客户端会话的一致性
适用场景:

适用于需要客户端 IP 粘性、会话保持的场景,例如在线购物车系统、用户认证系统

uri-基于URI
说明:
根据请求的URl(Uniform Resource ldentifier)进行哈希,确保相同URl的请求分配到相同的服务器。这种方式适合CDN(内容分发网络)或缓存系统,以便服务器缓存相同的内容,减少重复工作
适用场景:

适用于CDN、内容分发系统,或需要根据URI进行一致性哈希分配的场景

url param-基于 URL 参数
说明:

根据请求的 URL中指定的参数来进行负载均衡。例如,可以指定某个 URL参数(如id ),确保带有相同参数的请求被发送到同一个服务器上
适用场景:

适用于带有特定 URL参数的请求需要保持一致的场景,比如根据用户 ID 或会话 ID将请求路由到相同的服务器 

hdr(name)-基于 HTTP 请求头
说明:

根据 HTTP 请求头的值来进行负载均衡,可以根据某个特定的请求头(如user-Agent、Host等)来锁定请求,确保具有相同请求头的请求分配到同一台服务器
适用场景:

适用于基于 HTTP 请求头来进行一致性路由的场景,常用于复杂的 HTTP 应用程序

rdp-cookie(name)-基于 RDP Cookie
说明:
此策略用于RDP(远程桌面协议)连接,通过RDP协议的cookie来锁定并哈希每次TCP请求,确保来自同一客户端的连接分配到相同的服务器
适用场景:

主要用于负载均衡远程桌面服务(RDP),确保RDP会话的持续性  

4.Haproxy、LVS、Nginx的区别 

LVS(Linux Virtual Server)
负载均衡层级:

LVS是一个4层(网络层)负载均衡技术,工作在OSI模型的第四层(TCP/IP层),主要基于IP地址和端口进行负载均衡
转发能力:

只能实现基于 IP 和端口的负载均衡,无法直接进行基于URL或目录的转发
状态监测:

状态监测功能相对单一,主要检测 IP 层面的可达性,支持简单的 TCP 连接检测
性能:

由于其工作在内核空间,能够处理高性能、高并发的负载均衡,适合需要高吞吐量和低延迟的场景
应用范围:

广泛应用于需要高性能、低延迟的场景,如大规模数据中心、云计算环境等

Nginx
负载均衡层级:

Nginx支持4层(TCP)和7层(HTTP)负载均衡,既可以进行基于IP和端口的负载均衡,也可以基于请求的URL、头部等进行负载均衡
正则支持:
支持正则表达式,可以进行复杂的 URL 重写和请求处理
健康检查:

Nginx的健康检査功能主要是基于端口的检査,不支持基于 URL 的健康检查,健康检查功能不如 HAProxy 强大
会话保持:

不支持直接的会话保持,但可以通过 ip_hash 实现类似功能,将来自同一 IP 的请求始终路由到同一台后端服务器
反向代理能力:

Nginx在反向代理和缓存方面表现优异,适合高性能的Web服务器和缓存解决方案
性能:
在处理静态内容和反向代理方面表现良好,但在高并发的负载均衡方面性能不及HAProxy

HAProxy

负载均衡层级:

HAProxy支持4层(TCP)和7层(HTTP)负载均衡,提供多种负载均衡策略,包括轮询、最少连接、源 IP 哈希、URL 哈希等
负载均衡策略:

支持多达 8 种负载均衡策略,可以根据请求的不同特征进行精细化调度
状态监测:

HAProxy提供丰富的状态监测功能,支持基于端口、URL、脚本等多种检测方式,能够实时监控和管理后端服务器的健康状态
会话保持:

支持会话保持,能够根据请求的属性(如 Cookies、URL 参数)将请求路由到相同的后端服务器
性能:

在高并发情况下表现优异,相较于 Nginx 的负载均衡能力,HAProxy 在处理复杂负载均衡需求方面性能更好
功能:

功能丰富,提供详细的统计数据接口、健康状态检测、日志分析等工具,适合需要高级负载均衡和流量管理的场景

二、部署Haproxy

环境需求

Haproxy服务器:172.16.58.10
Nginx 服务器1:172.16.58.20
Nginx 服务器2:172.16.58.30
客户端:172.16.58.40

1.Haproxy服务器部署 

1.1关闭防火墙以及增强功能

systemctl stop firewalld
setenforce 0

1.2编译安装

安装工具
yum install -y pcre-devel bzip2-devel gcc gcc-c++ make解压压缩包(将安装Haproxy所需软件包传到/opt目录下)
tar zxvf haproxy-1.5.19.tar.gz
cd /opt/haproxy-1.5.19/编译安装
make TARGET=linux2628 ARCH=x86_64
make install参数说明
TARGET=linux2628  #指定内核版本,大于2.6.28的用TARGET=linux2628
ARCH=x86_64 	  #系统位数,64位系统

1.3配置Haproxy 

创建配置目录并复制配置文件
mkdir /etc/haproxy
cp examples/haproxy.cfg /etc/haproxy/
编辑Haproxy配置文件
vim /etc/haproxy/haproxy.cfg全局配置
global		log /dev/log   local0 info		#修改   sysloglog /dev/log   local0 notice	#修改#log loghost    local0 infomaxconn 4096			#最大连接数,需考虑ulimit -n限制,推荐使用10240       #chroot /usr/share/haproxyuid 99					#用户UIDgid 99					#用户GIDdaemon					#守护进程模式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				#负载均衡调度算法使用轮询算法roundrobinserver inst1 172.16.58.20:80 check inter 2000 fall 3		#定义在线节点server inst2 172.16.58.30:80 check inter 2000 fall 3参数说明
balance roundrobin:负载均衡调度算法使用轮询
check inter 2000:健康检查间隔 2000 毫秒
fall 3:节点失效判断为连续三次检测失败

1.4添加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.节点服务器部署(2台) 

2.1关闭防火墙以及增强功能

systemctl stop firewalld
setenforce 0

2.2安装工具

yum install -y pcre-devel zlib-devel gcc gcc-c++ make

2.3编译安装Nginx 

解压软件包(将nginx软件包全部放到/opt下面)
cd /opt
tar zxvf nginx-1.12.0.tar.gz编译安装
cd nginx-1.12.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginxmake && make install创建Nginx用户
useradd -M -s /sbin/nologin nginx
查看是否创建成功
tail -2 /etc/passwd
设置符号链接并启动Nginx
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
nginx   #启动nginx服务

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

172.16.58.20
echo "this is wm" > /usr/local/nginx/html/test.html172.16.58.30
echo "this is fzx" > /usr/local/nginx/html/test.html

2.5测试Web集群 

在客户端使用浏览器打开 http://172.16.58.10/test.html ,不断刷新浏览器测试负载均衡效果

三、日志分析 

在实际的生产环境中,HAProxy 是一种常用的负载均衡器,通常我们希望能够更好地管理其生成的日志信息。默认情况下,HAProxy 的日志输出到系统的 syslog 中,为了更方便地查看和分析日志,我们可以单独定义 HAProxy 的日志输出,并通过 rsyslog 进行配置,将不同级别的日志记录到不同的文件中

1.修改Haproxy配置文件 

vim /etc/haproxy/haproxy.cfggloballog /dev/log local0 infolog /dev/log local0 notice修改完之后重启Haproxy
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
&~修改完之后重启Haproxy
service haproxy restart参数说明
$programname == 'haproxy':筛选出由 HAProxy 生成的日志
$syslogseverity-text == 'info' 和 $syslogseverity-text == 'notice':过滤出相应级别的日志
-:表示将日志写入到指定文件
&~:表示在日志写入后停止处理这条日志

3.查看Haproxy日志 

Haproxy 的 info 级别和 notice 级别的日志会分别记录在 /var/log/haproxy/haproxy-info.log 和 /var/log/haproxy/haproxy-notice.log 文件中

使用 tail 命令查看日志文件,确保配置正确并查看实时日志信息

tail -f /var/log/haproxy/haproxy-info.log    # 查看 info 级别的 HAProxy 日志
tail -f /var/log/haproxy/haproxy-notice.log  # 查看 notice 级别的 HAProxy 日志

http://www.mrgr.cn/news/30368.html

相关文章:

  • 在 ALV 报表中使用 CL_SALV 类时,如何处理多行?
  • 13、DHCP和FTP协议
  • 丹摩征文活动 | 0基础带你上手经典目标检测模型 Faster-Rcnn
  • Transformer(三):论文 Attention Is All You Need
  • 通过MT4调用Windows API进行文件读写操作
  • Ubuntu 的 ROS 操作系统turtlebot3环境搭建
  • Python 中的异步编程:从入门到实践
  • 打破转化阻碍:Xinstall实现全渠道一键拉起
  • C++ —— 关于vector
  • vue2.0+ts注册全局函数和几个递归查找
  • vue h5 蓝牙连接 webBluetooth API
  • 对 JavaScript 原型的理解
  • ELK企业级日志分析系统
  • 从工厂打螺丝到数据库专家(上)
  • 把设计模式用起来!(4) 用不好模式?之原理不明
  • FortiGate 透明模式下配置注意事项和故障排错技巧
  • 维钧团队与广东能源集团携手共创未来
  • 华为、思科、新华三,三大厂商认证到底选择哪一个?
  • 力扣438 找到字符串中所有字母异位词 Java版本
  • 设计模式之外观设计模式
  • 教师专属:高效查询学生考试成绩系统 - 立即体验吧
  • C++:动态内存分配(new、delete 相比 malloc、free的优势)与运算符重载
  • 完美解决 Async/await 不按预期工作 的正确解决方法,亲测有效!!!
  • python+flask+mongodb+vue撸一个实时监控linux服务资源的网站
  • 从 InnoDB 到 Memory:MySQL 存储引擎的多样性
  • 更换UFS绑定固件与“工程固件”的区别 小米10s机型更换cpu绑定包对比 写入以及修复基带