专业视频网站开发公司,微信商城如何开通,飞阳建设网站,观山湖制作网站一 HAProxy介绍
#xff08;一#xff09;发展历史
HAProxy是法国开发者威利塔罗(Willy Tarreau)在2000年使用C语言开发的一个开源软件#xff0c;是一款具备高并发(一万以上)、高性能的TCP和HTTP负载均衡器#xff0c;支持基于cookie的持久性#xff0c;自动故障切换…一 HAProxy介绍
一发展历史
HAProxy是法国开发者威利塔罗(Willy Tarreau)在2000年使用C语言开发的一个开源软件是一款具备高并发(一万以上)、高性能的TCP和HTTP负载均衡器支持基于cookie的持久性自动故障切换支持正则表达式及web状态统计目前最新TLS版本为2.2。
HAProxy是可提供高可用性、负载均衡以及基于TcP和HTTP应用的代理是免费、快速并且可靠的一种解决方案。HProxy非常适用于并发大(并发达1w以上) web站点这些站点通常又需要会话保持或七层处理。HAProxy的运行模式使得它可以很简单安全的整合至当前的架构中同时可以保护web服务器不被暴露到网络上。 二 支持功能功能 TCP 和 HTTP反向代理 SSL/TSL服务器 可以针对HTTP请求添加cookie进行路由后端服务器 可平衡负载至后端服务器并支持持久连接 支持所有主服务器故障切换至备用服务器 keepalive 支持专用端口实现监控服务 支持停止接受新连接请求而不影响现有连接 可以在双向添加修改或删除HTTP报文首部字段 响应报文压缩 支持基于pattern实现连接请求的访问控制 通过特定的URIurl为授权用户提供详细的状态信息 三 主要特性 可靠性和稳定性非常好可以与硬件级的F5负载均衡设备相媲美; 最高可以同时维护40000-50000个并发连接单位时间内处理的最大请求数为20000个最大处理能力可达10Git/s; 支持多达8种负载均衡算法,同时也支持会话保持; 支持虚拟机主机功能从而实现web负载均衡更加灵活; 支持连接拒绝、全透明代理等独特的功能; 拥有强大的ACL支持,用于访问控制; sendfile 其独特的弹性二x树数据结构使数据结构的复杂性上升到了0(1)即数据的查寻速度不会随着数据条日的增加而速度有所下降;·支持客户端的keepalive功能减少客户端与haproxy的多次三次握手导致资源浪费让多个请求在一个tcp连接中完成; 支持TCP加速,零复制功能,类似于mmap机制; 支持响应池(response buffering) ; 支持RDP协议; 基于源的粘性类似nginx的ip hash功能把来自同一客户端的请求在一定时间内始终调度到上游的同一服务器;·更好统计数据接口其web接口显示后端集群中各个服务器的接收、发送、拒绝、错误等数据的统计信息; 详细的健康状态检测web接口中有关于对上游服务器的健康检测状态并提供了一定的管理功能; 基于流量的健康评估机制; 基于http认证; 基于命令行的管理接口; 日志分析器,可对日志进行分析 四 负载均衡策略
静态调度算法不管后端按照调度器的算法进行 分配
动态调度算法会考虑后端服务器的负载情况
调度动态时服务在运行 也可以不影响服务 不需要重新加载 直接生效
(1) roundrobin表示简单的轮询 rr
(2) static-rr表示根据权重
(3 leastconn表示最少连接者先处理
( 4) source表示根据请求源IP
(5) uri表示根据请求的URI,做cdn需使用;
(6) url param表示根据请求的URl参数 balance url param’requires an URL parameter name
(7) hdr(name)表示根据HTTP请求头来锁定每一次HTTP请求;
(8 rdp-cookie (name)表示根据据cookie(name)来锁定并哈希每一次TCP请求。 五 LVS、Nginx、HAproxy的区别
1 IVS基于Linux操作系统实现软负载均衡而HAProxy和Nginx是基于第三方应用实现的软负载均衡;
lvs 是内核中的功能 nginx haproxy 是第三方实现的功能
2. LVS是可实现4层的IP负载均衡技术无法实现基于目录、URL的转发。而HAProxy和Nginx都可以实现4层和7层技术HAProxy可提供TCP和HTTP应用的负载均衡综合解决方案;
Ivs只能提供四层负载均衡无法提供7层负载(无法控制 7层协议 http 头部 url 等)功能单一 nginx haproxy 可以实现 4层和7层负载功能较多但是 性能不如lvs
3 LVs因为工作在TCP模型的第四层其状态监测功能单一而HAProxy在状态监测方面功能更丰富、强大可支持端口、URI等多种状态检测方式;
4 HAProxy功能强大,但整体性能低于4层模式的IVS负载均衡。
5 Ngrinx主要用于web服务器或缓存服务器。Nginx的upstream模块虽然也支持群集功能但是对群集节点健康检查功能不强性能没有Haproxy好。
性能haproxy 对比 nginx 性能优越功能又单一了haprox只做反向代理。
性能排序Ivs haproxy nginx
Ivs 没有 后端服务器健康性检测 nginx和haproxy 有后端服务器健康性检测 六 调度算法对比 二 安装haproxy
一下载源码包
本地yum源的版本比较老旧可以从官方下载较新版本的源码包进行编译安装
将源码包解压后可以看到与之前的nginx、php等编译安装不同它没有configure执行文件
configuse执行文件主要生成的是Makefile文件解压完源码包后就已经生成了该文件。 可以查看INSTALL文件查看如何安装 make clean
#清除之前编译过程中产生的目标文件和临时文件确保从一个干净的状态开始新的编译过程。make -j $(nproc) TARGETlinux-glibc USE_OPENSSL1 USE_LUA1 USE_PCRE1 USE_SYSTEMD1-j $(nproc)
#使用系统的逻辑处理器数量同时进行编译以加快编译速度。TARGETlinux-glibc
#指定目标平台为基于glibc的Linux系统。USE_OPENSSL1
#启用OpenSSL库支持使得软件可以利用OpenSSL提供的加密和安全功能。USE_LUA1
#启用Lua脚本语言支持允许在软件中编写和运行Lua脚本来扩展功能。USE_PCRE1
#启用PCREPerl Compatible Regular Expressions库支持提供强大的正则表达式处理能力。USE_SYSTEMD1
#启用Systemd支持使软件能够更好地与Systemd初始化系统集成例如注册systemd服务等。sudo make install
#完成编译后使用管理员权限执行此命令将编译好的软件安装到系统预设的安装路径下。在安装之前需要解决依赖环境的问题 二 解决依赖环境
yum -y install gcc openssl-devel pcre-devel systemd-devel 由于CentOS7 之前版本自带的lua版本比较低并不符合HAProxy要求的lua最低版本(5.3)的要求因此需要编译安装较新版本的lua环境然后才能编译安装HAProxy 下载方法在官方文档Lua 官网www.lua.org 安装LUA 三编译安装 make ARCHx86_64
#指定要构建的目标处理器架构为x86_64即适用于64位Intel/AMD处理器的版本。TARGETlinux-glibc
#设置目标平台为基于glibc的Linux系统glibc是Linux系统中最常用的C语言标准库实现。USE_PCRE1
#启用PCRE支持这将允许软件使用复杂的正则表达式进行匹配和处理。USE_OPENSSL1
#启用OpenSSL支持提供加密算法、SSL/TLS协议等功能。USE_ZLIB1
#启用Zlib支持用于数据压缩和解压缩功能。USE_SYSTEMD1
#启用Systemd支持USE_LUA1
#启用Lua脚本语言支持允许在软件中编写和运行Lua脚本来扩展功能。LUA_INC/usr/local/lua/src/
#指定Lua头文件目录编译时需要用到这些头文件来链接到Lua库。LUA_LIB/usr/local/lua/src/
#指定Lua库文件目录编译时会链接到这个目录下的库文件以支持Lua功能四配置system管理文件
需要在/usr/lib/systemd/system/目录下建立管理文件 DescriptionHAProxy Load Balancer
#这一行定义了服务的简要描述说明该服务是用于提供负载均衡功能的HAProxy
Aftersyslog.target network.target
#表示此服务在syslog日志系统和网络服务完全启动之后开始启动。[Service] #服务部分包含了与服务运行相关的各种设置。ExecStartPre/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
#指定服务启动前执行haproxy命令。表示启动HAProxy前检查配置文件/etc/haproxy/haproxy.cfg
#是否有效-c表示仅检查配置文件-q表示静默模式不输出多余信息。
#该文件需要手动建立并配置信息。
具体信息在下一目录介绍ExecStart/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
#执行haproxy命令并指定配置文件路径为 /etc/haproxy/haproxy.cfg
#-Ws表示以守护进程模式运行并打开Unix套接字以便进行管理操作
#同时将PID写到/var/lib/haproxy/haproxy.pid 文件中。该文件也需要手动创建ExecReload/bin/kill -USR2 $MAINPID
#设置当服务收到reload信号时需要执行的操作这里是发送USR2信号给主进程$MAINPID
#使得haproxy能够平滑重载配置文件而无需停止服务。LimitNOFILE100000
#服务的最大打开文件数量限制为100000[Install]
#安装部分定义了如何将此服务与系统的启动目标关联WantedBymulti-user.target#表明该服务应随多用户目标启动即在系统进入多用户模式时自动启动haproxy服务 建立system管理时需要加载的文件及相关配置信息 建立完毕后启动服务systemctl enable --now 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_portbind 0.0.0.0:8899 #创建另一个监听器并将其绑定到所有网络接口的8899端口对外提供服务mode http #设置该监听器也以HTTP模式工作。log global #使用全局日志设置记录与该监听器相关的活动 三、haproxy调优
一进程
服务启动以后可以看到默认开启一个主进程带一个工作进程以及三个线程 可以根据cpu个数来决定开机时启动的work进程数量在全局配置中添加nbproc参数
nbproc n #开启的haproxy work 进程数默认进程数是一个 重启之后打开的工作进程就是设置的数量 二cpu亲缘性
CPU亲缘性CPU Affinity是指将进程或线程绑定到特定的CPU核心上运行的技术。通过设置CPU亲缘性可以避免进程在不同核心之间频繁迁移从而减少缓存失效、上下文切换等开销提高系统的整体性能和效率 通过添加cpu-map参数将工作进程与cpu绑定cpu-map n(work) n(cpu) 这样设置后haproxy的工作进程将会在指定的核心上运行有利于优化并行处理能力和减少资源竞争。使得每个进程都在固定的核心上执行有助于提升数据包处理的稳定性和一致性尤其在多核处理器环境中更为重要。当然实际应用时需要根据具体的硬件环境和负载情况合理配置CPU亲缘性。
三状态页
可以通过http服务来查看状态页在写配置文件时就已经添加好了 使用浏览器进行访问 可以看到服务的一些状态信息所以需要妥善保管密码 四日志管理
1.本地日志
haproxy服务没有单独的日志管理文件它的默认日志文件位置在/var/log/messages 由于该文件的日志信息相对比较重要建议单独存放
在配置文件的第14行已经定义的日志的格式只需要在rsyslog日志管理的配置文件中指定信息即可 取消/etc/rsyslog.conf文件中的1516行的注释信息 $ModLoad imudp 这是在rsyslog配置文件中加载UDP模块的命令。imudp表示输入模块Input Module用于处理UDP协议的数据。通过此命令系统将能够监听并接收通过UDP端口发送过来的日志消息。
$UDPServerRun 514 这个指令告诉rsyslog服务在指定的UDP端口这里为514上启动一个UDP服务器以监听日志事件。默认情况下许多网络设备和服务会使用514端口通过UDP协议发送syslog日志信息给日志收集服务器 在第74行添加日志配置 修改完毕后重启服务systemctl restart haproxy.service rsyslog.service 重启完毕后会在/var/log/目录下自动生成日志文件 、 2.远端日志
由于haproxy服务只能做代理服务对资源消耗较大建议将日志文件放在远程的日志文件服务器上专门建立日志文件查看
在haproxy服务的配置文件中首先定义日志的标识符及信息 修改完毕后重启服务systemctl restart haproxy.service
在远端服务器上设置同样修改rsyslog日志管理服务的配置文件 有访问时日志就会记录在该文件中想要把只记录在远端服务去只需要把haproxy服务器中的日志配置删除即可 四、Proxies配置
Proxies配置通常是指对网络流量进行负载均衡和管理的代理设置。具体选项有以下几种 defaults [name] #默认配置项针对以下的frontend、backend和listen生效可以多个name也可以没有name frontend name #前端servername类似于Nginx的一个虚拟主机 server和LVS服务集群。frontend是haproxy接收客户端请求的地方它定义了对外暴露的服务端口、协议以及处理请求的方式。 backend name #后端服务器组等于nginx的upstream和LVS中的RS服务器 #Backend包含了实际提供服务的一组服务器haproxy会根据预设的负载均衡算法将来自前#端的请求分发到这些后端服务器上。 listen name #将frontend和backend合并在一起配置相对于frontend和backend配置更简洁生产常用 一defaults配置
defaults配置基本为一些调优选项 option redispatch #当server Id对应的服务器挂掉后强制定向到其他健康的服务器重新派发 option abortonclose #当服务器负载很高时自动结束掉当前队列处理比较久的连接针对业务情况选择开启 option http-keep-alive #开启与客户端的会话保持 option forwardfor #透传客户端真实IP至后端web服务器 mode http|tcp #设置默认工作类型,使用TCP服务器性能更好减少压力 timeout http-keep-alive 120s #session 会话保持超时时间此时间段内会转发到相同的后端服务器 timeout connect 120s #客户端请求从haproxy到后端server最长连接等待时间(TCP连接之前)默认单位ms timeout server 600s #客户端请求从haproxy到后端服务端的请求处理超时时长(TCP连接之后)默认单位ms如#果超时会出现502错误此值建议设置较大些访止502错误 timeout client 600s #设置haproxy与客户端的最长非活动时间默认单位ms建议和timeout server相同 timeout check 5s #对后端服务器的默认检测超时时间 default-server inter 1000 weight 3 #指定后端服务器的默认设置 二frontend与backend
1.基本服务
frontend与backend定义了haproxy服务的反向代理与负载均衡
在配置文件中添加frontend与backend语句块 frontend
#定义了一个名为 apache 的前端代理它监听来自客户端的请求。bind 192.168.83.40:80
#表示该前端代理将绑定到IP地址为 192.168.83.40 的服务器上的80端口对外提供HTTP服务。use_backend web
#指定当接收到请求时应将请求转发到名称为 web 的后端集群进行处理。backend web
#定义了一个名为 web 的后端集群server rs1 192.168.83.30:80 和 server rs2 192.168.83.50:80
#分别定义了两台后端服务器。其中rs1 对应的实际服务器IP地址是 192.168.83.30
#并且在该服务器上运行的服务也监听80端口同样地rs2 对应的服务器IP地址是 192.168.83.50。 修改完毕后重启服务systemctl restart haproxy.servic
开服后端服务器 使用客户端进行访问 2.开启健康性检测
当一台服务器意外掉线后haproxy并不能自动进行健康性检测 需要手动在backend后端语句块中添加check开启 添加完毕后重启服务systemctl restart haproxy.service
再去访问就会自动过滤不在线的后端服务器 三listen配置
listen 配置块是用于定义虚拟服务Virtual Service或前端代理Frontend。这个配置项结合了frontend和backend的概念可以简化配置并集中管理同一逻辑服务的所有相关设置
在配置文件中将frontend和backend删除防止端口与地址冲突再去配置listen语句 listen web
#创建一个名为 web 的监听器这个监听器将处理相关的网络流量。bind 192.168.83.40:80
#绑定到IP地址为 192.168.83.40本机的服务器上的80端口以接收HTTP请求。mode http
#设置工作模式为HTTP在defaults配置中已经设置完毕在此可以不用添加log global
#在全局配置中定义了日志参数该监听器使用全局日志设置记录与该监听器相关的活动server rs1 192.168.83.30:80 check inter 3000 fall 2 rise 5
#定义后端服务器rs1其IP地址为 192.168.83.30 并且监听80端口。
#check启用健康检查健康
#inter 3000检查间隔时间为30秒 (默认单位为ms毫秒)。
#fall 2表示如果服务器在两次连续的健康检查中失败则标记为不可用
#rise 5而当服务器在连续5次健康检查中成功响应则恢复其为可用状态server rs2 192.168.83.50:80 check inter 3000 fall 2 rise 5
#原理同上一个后端服务器 使用客户端进行访问同样达到了反向代理与负载均衡的效果