带你走进haproxy的世界

avatar
作者
筋斗云
阅读量:0

华子目录

前言

什么是负载均衡

  • 负载均衡Load Balance,简称LB,是一种服务或基于硬件设备等实现的高可用反向代理技术负载均衡将特定的业务(web服务、网络流量等)分担给指定一个个后端特定的服务器设备,从而提高了公司业务并发处理能力、保证了业务的高可用性、方便了业务后期的水平动态扩展
  • 阿里云SLB介绍:https://yq.aliyun.com/articles/1803

在这里插入图片描述

为什么用负载均衡

  • Web服务器的动态水平扩展---->对用户无感知
  • 增加业务并发访问处理能力---->解决单服务器瓶颈问题
  • 节约公网IP地址---->降低IT支出成本
  • 隐藏内部服务器IP---->提高内部服务器安全性
  • 配置简单---->固定格式配置文件
  • 功能丰富---->支持四层七层,支持动态下线主机
  • 性能较强---->并发数万甚至数十万

负载均衡公司

  • F5美国F5网络公司
  • Netscaler美国思杰公司
  • Array华耀
  • AD-1000深信服

负载均衡类型

四层负载均衡

在这里插入图片描述

  • 通过ip+端口决定负载均衡去向
  • 流量请求进行nat处理,转发至后台服务器
  • 记录tcpudp流量分别是由哪台服务器处理,后续该请求连接的流量都通过该服务器处理
  • 支持四层软件
    • lvs重量级四层负载均衡器
    • Nginx轻量级四层负载均衡器,可缓存。(nginx四层是通过upstream模块实现的)
    • Haproxy:模拟四层转发

七层负载均衡

在这里插入图片描述

  • 通过虚拟url主机ip进行流量识别,根据应用层信息进行解析决定是否需要进行负载均衡
  • 代理后台服务器客户端建立连接,如nginx代理前后端,与前端客户端tcp连接,与后端服务器建立tcp连接
  • 支持7层代理的软件
    • Nginx:基于http协议(nginx七层是通过proxy_pass)
    • Haproxy:七层代理会话保持、标记、路径转移

四层和七层的区别

  • 所谓的四层到七层负载均衡,就是在对后台服务器进行负载均衡时,依据四层信息七层信息来决定怎么样转发流量
  • 四层负载均衡,就是通过发布三层IP地址vip),然后加四层端口号,来决定哪些流量需要做负载均衡,对需要处理的流量进行nat处理,转发至后台服务器,并记录下这个TCP或者UDP流量是由哪台服务器处理的,后续这个连接所有流量都同样转发到同一台服务器上进行处理
  • 七层负载均衡,就是在四层基础上(没有四层是绝对不可能有七层的),再考虑应用层特征,比如同一个Web服务器负载均衡,除了根据vip80端口辨别是否需要处理的流量,还可根据七层URL浏览器类别语言等来决定是否要进行负载均衡
  • 分层位置四层负载均衡在传输层及以下七层负载均衡在应用层及以下
  • 性能四层负载均衡架构无需解析报文消息内容,在网络吞吐量与处理能力上较高七层可支持解析应用层报文消息内容,识别URLCookieHTTP header等信息
  • 原理四层负载均衡是基于ip+端口七层是基于虚拟的URL主机IP
  • 功能类比四层负载均衡类似于路由器七层类似于代理服务器
  • 安全性四层负载均衡无法识别DDoS攻击七层可防御SYN Cookie/Flood攻击

haproxy介绍

  • HAProxy法国开发者 威利塔罗(Willy Tarreau) 在2000年使用C语言开发的一个开源软件
  • 是一款具备高并发(万级以上)、高性能TCPHTTP负载均衡器
  • 支持基于cookie持久性自动故障切换,支持正则表达式web状态统计
  • 企业版网站https://www.haproxy.com
  • 社区版网站http://www.haproxy.org
  • githubhttps://github.com/haprox

企业版本社区版本功能对比

功能社区版企业版
高级HTTP / TCP负载平衡和持久性支持支持
高级健康检查支持支持
应用程序加速支持支持
高级安全特性支持支持
高级管理支持支持
HAProxy Dev Branch新功能支持支持
24*7 支持服务支持
实时仪表盘支持
VRRPRoute 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:是为frontendbackendlisten提供的默认配置
    • 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配置说明

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,将第1work进程绑定至0号CPU
cpu-map 2 1全局绑定haproxy worker 进程至指定CPU,将第2work进程绑定至1号CPU
maxsslconn 数字全局每个haproxy进程ssl最大连接数,用于haproxy配置了证书的场景下
maxconnrate 数字全局每个进程每秒创建的最大连接数量
spread-checks 数字全局后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间,默认值0

proxies配置说明

参数类型作用
defaultsproxies默认配置项,针对以下的frontendbackendlisten生效,可以有多个name可以没有name
frontendproxies前端,相当于nginx中的server {}
backendproxies后端,相当于nginxupstream{}LVS中的RS服务器
listenproxiesfrontendbackend合并在一起配置,相对于frontendbackend配置更简洁,生产常用

defaults配置段

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配置段

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=11表示启用,0表示禁用

socat工具

haproxy算法

静态算法

动态算法

其他算法

高级功能及配置

基于cookie的会话保持

HAProxy状态页

IP透传

ACL

自定义HAProxy 错误界面

HAProxy 四层负载

HAProxy https 实现

    广告一刻

    为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!