负载均衡:Load Balance,简称LB,是一种服务或基于硬件设备等实现的高可用反向代理技术,负载均衡将特定的业务(web服务、网络流量等)分担给指定的一个或多个后端特定的服务器或设备,从而提高了公司业务的并发处理能力、保证了业务的高可用性、方便了业务后期的水平动态扩展SLB介绍:https://yq.aliyun.com/articles/1803
Web服务器的动态水平扩展---->对用户无感知并发访问及处理能力---->解决单服务器瓶颈问题节约公网IP地址---->降低IT支出成本隐藏内部服务器IP---->提高内部服务器安全性配置简单---->固定格式的配置文件功能丰富---->支持四层和七层,支持动态下线主机性能较强---->并发数万甚至数十万F5:美国F5网络公司Netscaler:美国思杰公司Array:华耀AD-1000:深信服四层负载均衡
ip+端口决定负载均衡的去向流量请求进行nat处理,转发至后台服务器tcp、udp流量分别是由哪台服务器处理,后续该请求连接的流量都通过该服务器处理四层的软件lvs:重量级四层负载均衡器Nginx:轻量级四层负载均衡器,可缓存。(nginx四层是通过upstream模块实现的)Haproxy:模拟四层转发七层负载均衡
虚拟url或主机ip进行流量识别,根据应用层信息进行解析,决定是否需要进行负载均衡代理后台服务器与客户端建立连接,如nginx可代理前后端,与前端客户端tcp连接,与后端服务器建立tcp连接7层代理的软件Nginx:基于http协议(nginx七层是通过proxy_pass)Haproxy:七层代理,会话保持、标记、路径转移等四层到七层负载均衡,就是在对后台的服务器进行负载均衡时,依据四层的信息或七层的信息来决定怎么样转发流量四层的负载均衡,就是通过发布三层的IP地址(vip),然后加四层的端口号,来决定哪些流量需要做负载均衡,对需要处理的流量进行nat处理,转发至后台服务器,并记录下这个TCP或者UDP的流量是由哪台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器上进行处理七层的负载均衡,就是在四层的基础上(没有四层是绝对不可能有七层的),再考虑应用层的特征,比如同一个Web服务器的负载均衡,除了根据vip加80端口辨别是否需要处理的流量,还可根据七层的URL、浏览器类别、语言等来决定是否要进行负载均衡分层位置:四层负载均衡在传输层及以下,七层负载均衡在应用层及以下性能:四层负载均衡架构无需解析报文消息内容,在网络吞吐量与处理能力上较高;七层可支持解析应用层报文消息内容,识别URL、Cookie、HTTP header等信息原理:四层负载均衡是基于ip+端口;七层是基于虚拟的URL或主机IP等功能类比:四层负载均衡类似于路由器;七层类似于代理服务器安全性:四层负载均衡无法识别DDoS攻击;七层可防御SYN Cookie/Flood攻击haproxy介绍HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年使用C语言开发的一个开源软件高并发(万级以上)、高性能的TCP和HTTP负载均衡器cookie的持久性,自动故障切换,支持正则表达式及web状态统计企业版网站:https://www.haproxy.com社区版网站:http://www.haproxy.orggithub:https://github.com/haprox企业版本与社区版本功能对比| 功能 | 社区版 | 企业版 | 
|---|---|---|
高级HTTP / TCP负载平衡和持久性 | 支持 | 支持 | 
高级健康检查 | 支持 | 支持 | 
应用程序加速 | 支持 | 支持 | 
高级安全特性 | 支持 | 支持 | 
高级管理 | 支持 | 支持 | 
HAProxy Dev Branch新功能 | 支持 | 支持 | 
24*7 支持服务 | 支持 | |
实时仪表盘 | 支持 | |
VRRP和Route Health Injection HA工具 | 支持 | |
ACL,映射和TLS票证密钥同步 | 支持 | |
基于应用程序的高级DDoS和Bot保护(自动保护) | 支持 | |
Bot(机器人)监测 | 支持 | |
Web应用防火墙 | 支持 | |
HTTP协议验证 | 支持 | |
实时集群追踪 | 
haproxy基础架构
haproxy的安装rhel9本地yum安装[root@haproxy ~]# yum install haproxy -y  查看版本[root@haproxy ~]# haproxy -v HAProxy version 2.4.17-9f97155 2022/05/13 - https://haproxy.org/ Status: long-term supported branch - will stop receiving fixes around Q2 2026. Known bugs: http://www.haproxy.org/bugs/bugs-2.4.17.html Running on: Linux 5.14.0-162.6.1.el9_1.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Sep 30 07:36:03 EDT 2022 x86_64  haproxy.cfg配置文件HAProxy的配置文件haproxy.cfg由两大部分组成,分别是:
global:全局配置段
进程及安全配置相关的参数性能调整相关参数Debug参数proxies:代理配置段
defaults:是为frontend,backend,listen提供的默认配置frontend:前端,相当于nginx中的server {}backend:后端,相当于nginx中的upstream {}listen:同时拥有frontend前端和backend后端配置,配置简单,生产推荐使用haproxy.cfg文件内容如下:
[root@haproxy ~]# cat /etc/haproxy/haproxy.cfg #--------------------------------------------------------------------- # Example configuration for a possible web application.  See the # full configuration options online. # #   https://www.haproxy.org/download/1.8/doc/configuration.txt # #---------------------------------------------------------------------  #--------------------------------------------------------------------- # Global settings #--------------------------------------------------------------------- global     # to have these messages end up in /var/log/haproxy.log you will     # need to:     #     # 1) configure syslog to accept network log events.  This is done     #    by adding the '-r' option to the SYSLOGD_OPTIONS in     #    /etc/sysconfig/syslog     #     # 2) configure local2 events to go to the /var/log/haproxy.log     #   file. A line like the following can be added to     #   /etc/sysconfig/syslog     #     #    local2.*                       /var/log/haproxy.log     #     log         127.0.0.1 local2         chroot      /var/lib/haproxy         pidfile     /var/run/haproxy.pid       maxconn     4000         user        haproxy       group       haproxy       daemon                    # turn on stats unix socket     stats socket /var/lib/haproxy/stats      # utilize system-wide crypto-policies     ssl-default-bind-ciphers PROFILE=SYSTEM     ssl-default-server-ciphers PROFILE=SYSTEM  #--------------------------------------------------------------------- # common defaults that all the 'listen' and 'backend' sections will # use if not designated in their block #--------------------------------------------------------------------- defaults     mode                    http     log                     global     option                  httplog     option                  dontlognull     option http-server-close     option forwardfor       except 127.0.0.0/8     option                  redispatch     retries                 3     timeout http-request    10s     timeout queue           1m     timeout connect         10s     timeout client          1m     timeout server          1m     timeout http-keep-alive 10s     timeout check           10s     maxconn                 3000  #--------------------------------------------------------------------- # main frontend which proxys to the backends #--------------------------------------------------------------------- frontend main    # main为名字,自定义即可     bind *:5000     acl url_static       path_beg       -i /static /images /javascript /stylesheets     acl url_static       path_end       -i .jpg .gif .png .css .js      use_backend static          if url_static     default_backend             app  #--------------------------------------------------------------------- # static backend for serving up images, stylesheets and such #--------------------------------------------------------------------- backend static    # static为名字,自定义即可     balance     roundrobin     server      static 127.0.0.1:4331 check  #--------------------------------------------------------------------- # round robin balancing between the various backends #--------------------------------------------------------------------- backend app     # app为名字,自定义即可     balance     roundrobin     server  app1 127.0.0.1:5001 check     server  app2 127.0.0.1:5002 check     server  app3 127.0.0.1:5003 check     server  app4 127.0.0.1:5004 check  global     log         127.0.0.1 local2         chroot      /var/lib/haproxy         pidfile     /var/run/haproxy.pid       maxconn     4000         user        haproxy       group       haproxy       daemon                 ....................     ....................     ....................    | 参数 | 类型 | 作用 | 
|---|---|---|
| chroot | 全局 | 锁定运行目录 | 
daemon | 全局 | 以后台守护进程运行 | 
| user | 全局 | 运行haproxy的用户 | 
| group | 全局 | 运行haproxy的组 | 
| log | 全局 | 定义的syslog服务器;日志服务器需要开启udp协议;最多定义两个 | 
| pidfile | 全局 | 指定pid文件路径 | 
maxconn 数字 | 全局 | 每个haproxy进程的最大并发连接数 | 
| stats socket | 全局 | 套接字文件 | 
nbproc 数字 | 全局 | 开启的haproxy worker进程数,默认进程数是一个 | 
nbthread 数字(和nbproc互斥) | 全局 | 指定每个haproxy进程开启的线程数,默认为每个进程一个线程 | 
cpu-map 1 0 | 全局 | 绑定haproxy worker进程至指定CPU,将第1个work进程绑定至0号CPU | 
cpu-map 2 1 | 全局 | 绑定haproxy worker 进程至指定CPU,将第2个work进程绑定至1号CPU | 
maxsslconn 数字 | 全局 | 每个haproxy进程ssl最大连接数,用于haproxy配置了证书的场景下 | 
maxconnrate 数字 | 全局 | 每个进程每秒创建的最大连接数量 | 
spread-checks 数字 | 全局 | 后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间,默认值0 | 
proxies配置说明| 参数 | 类型 | 作用 | 
|---|---|---|
defaults | proxies | 默认配置项,针对以下的frontend、backend和listen生效,可以有多个name也可以没有name | 
frontend | proxies | 前端,相当于nginx中的server {} | 
backend | proxies | 后端,相当于nginx的upstream{}或LVS中的RS服务器 | 
listen | proxies | 将frontend和backend合并在一起配置,相对于frontend和backend配置更简洁,生产常用 | 
defaults     mode                    http    #HAProxy实例使用的连接协议,表示7层负载     log                     global   #指定日志地址和记录日志条目的syslog/rsyslog日志设备,这里设置为global表示继承global配置中log的配置     option                  httplog   #日志记录选项,httplog表示记录与 HTTP会话相关的各种属性值     option                  dontlognull   #dontlognull表示不记录空会话连接日志     option http-server-close      #等待客户端完整HTTP请求的时间,此处为等待10s。     option forwardfor       except 127.0.0.0/8   #透传客户端真实IP到后端web服务器     option                  redispatch    #当server Id对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发     option http-keep-alive   #开启与客户端的会话保持     retries                 3   #连接后端服务器失败次数     timeout http-request    1000s   #等待客户端请求完全被接收和处理的最长时间     timeout queue           60s   #设置删除连接和客户端收到503或服务不可用等提示信息前的等待时间,即失败页面显现前的加载时间     timeout connect         120s   #设置等待服务器连接成功的时间     timeout client          600s    #设置允许客户端处于非活动状态,即既不发送数据也不接收数据的时间     timeout server          600s   #设置服务器超时时间,即允许服务器处于既不接收也不发送数据的非活动时间     timeout http-keep-alive 60s   #session会话保持超时时间,此时间段内会转发到相同的后端服务器     timeout check           10s   #指定后端服务器健康检查的超时时间     maxconn                 3000     default-server inter 1000 weight 3  frontend main    # main为名字,自定义即可     bind *:5000    #指定HAProxy的监听地址和端口,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于listen字段中,*表示监听所有,多个地址使用逗号分割     acl url_static       path_beg       -i /static /images /javascript /stylesheets     acl url_static       path_end       -i .jpg .gif .png .css .js      use_backend static          if url_static     default_backend             app  bind需要绑定非本机的IP,需要设置开启内核参数:net.ipv4.ip_nonlocal_bind=1,1表示启用,0表示禁用