Haproxy 介绍与参数详解

1、什么是HAProxy

HAproxy是一个免费的负载均衡的软件,可以运行在大部分主流的Linux操作系统上

HAProxy提供了L4(TCP)和L7(HTTP)两种负载均衡能力,具备丰富的功能。HAProxy的社区非常活跃,版本更新快速(最新稳定版1.7.2于2017/01/13推出)。最关键的是,HAProxy具备媲美商用负载均衡器的性能和稳定性。

因为其专注于负载均衡,因此与Nginx相比,在这方面更专业,更好。

参考文献:https://blog.csdn.net/qq_34556414/article/details/107280964

 

2、HAProxy的特点

功能

  • 负载均衡:L4和L7两种模式,支持RR/静态RR/LC/IP Hash/URI Hash/URL_PARAM Hash/HTTP_HEADER Hash等 8种 丰富的负载均衡算法
  • 健康检查:支持TCP和HTTP两种健康检查模式
  • 会话保持:对于未实现会话共享的应用集群,可通过Insert Cookie/Rewrite Cookie/Prefix Cookie,以及上述的多种Hash方式实现会话保持
  • SSL:HAProxy可以解析HTTPS协议,并能够将请求解密为HTTP后向后端传输
  • HTTP请求重写与重定向
  • 监控与统计:HAProxy提供了基于Web的统计信息页面,展现健康状态和流量数据。基于此功能,使用者可以开发监控程序来监控HAProxy的状态

性能

  • 采用单线程、事件驱动、非阻塞模型,减少上下文切换的消耗,能在1ms内处理数百个请求。并且每个会话只占用数KB的内存。
  • 大量精细的性能优化,如O(1)复杂度的事件检查器、延迟更新技术、Single-buffereing、Zero-copy forwarding等等,这些技术使得HAProxy在中等负载下只占用极低的CPU资源。
  • HAProxy大量利用操作系统本身的功能特性,使得其在处理请求时能发挥极高的性能,通常情况下,HAProxy自身只占用15%的处理时间,剩余的85%都是在系统内核层完成的。
  • HAProxy作者在8年前(2009)年使用1.4版本进行了一次测试,单个HAProxy进程的处理能力突破了10万请求/秒,并轻松占满了10Gbps的网络带宽。

稳定性

作为建议以单进程模式运行的程序,HAProxy对稳定性的要求是十分严苛的。按照作者的说法,HAProxy在13年间从未出现过一个会导致其崩溃的BUG,HAProxy一旦成功启动,除非操作系统或硬件故障,否则就不会崩溃(我觉得可能多少还是有夸大的成分)。

在上文中提到过,HAProxy的大部分工作都是在操作系统内核完成的,所以HAProxy的稳定性主要依赖于操作系统,作者建议使用2.6或3.x的Linux内核,对sysctls参数进行精细的优化,并且确保主机有足够的内存。这样HAProxy就能够持续满负载稳定运行数年之久。

3、HAProxy的算法

  • roundrobin:基于权重进行轮询,在服务器的处理时间保持均匀分布时,这是最平衡、最公平的算法,其权重可以在运行时进行调整。
  • static-rr:     基于权重进行轮询,与roundrobin类似,但是在运行时调整不会生效,其在后端服务器连接数上没有限制。
  • leastconn: 新的连接请求被派发至具有最少连接数目的后端服务器。

4、HAProxy的安装

yum install -y haproxy

5、HAProxy详解配置文件

#---------------------------------------------------------------------
# Example configuration for a possible web application.  See the
# full configuration options online.
#
#   http://haproxy.1wt.eu/download/1.4/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

#---------------------------------------------------------------------
# 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 *: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
    balance     roundrobin
    server      static 127.0.0.1:4331 check

#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend 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

总体介绍

haproxy的配置文件由两部分组成:全局设置和对代理的设定,共分为五段:globaldefaultsfrontendbackendlisten

  1. global: 全局配置,主要用于定义全局参数,属于进程级的配置,通常和操作系统配置有关。
  2. default: 配置默认参数,这些参数可以被用到frontend,backend,Listen组件。
  3. frontend:接收请求的前端虚拟节点,frontend可以指定具体使用后端的backend。
  4. backend : 后端服务集群的配置,真实服务器,一个backend对应一个或者多个实体服务器。
  5. listen: fronted和backend的组合体,比如haproxy实例状态监控部分配置。Haproxy1.3之前的唯一配置方式。

时间格式

一些包含了值的参数表示时间,如超时时长。这些值一般以毫秒为单位,但也可以使用其它的时间单位后缀。

  • us: 微秒(microseconds),即1/1000000秒;
  • ms: 毫秒(milliseconds),即1/1000秒;
  • s: 秒(seconds);
  • m: 分钟(minutes);
  • h:小时(hours);
  • d: 天(days);

global配置

通常主要定义全局配置主要用于设定义全局参数,属于进程级的配置,通常和操作系统配置有关。

   global
         log 127.0.0.1 local3        #定义haproxy日志输出设置
         log 127.0.0.1   local1 notice        
         #log loghost    local0 info #定义haproxy 日志级别
         ulimit-n 82000              #设置每个进程的可用的最大文件描述符
         maxconn 20480               #默认最大连接数
         chroot /usr/local/haproxy   #chroot运行路径
         uid 99                      #运行haproxy 用户 UID
         gid 99                      #运行haproxy 用户组gid
         daemon                      #以后台形式运行harpoxy
         nbproc 1                    #设置进程数量
         pidfile /usr/local/haproxy/run/haproxy.pid  #haproxy 进程PID文件
         #debug                      #haproxy调试级别,建议只在开启单进程的时候调试
         #quiet
  • log:全局的日志配置,local0是日志输出设置,info表示日志级别(err,waning,info,debug);
  • maxconn:设定每个HAProxy进程可接受的最大并发连接数,此选项等同于linux命令选项”ulimit -n”;
  • chroot:修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作,可以提升haproxy的安全级别,不过需要注意的是要确保指定的目录为空目录且任何用户均不能有写权限;
  • daemon:让haproxy以守护进程的方式工作于后台,其等同于“-D”选项的功能,当然,也可以在命令行中以“-db”选项将其禁用;
  • nbproc:指定启动的haproxy进程个数,只能用于守护进程模式的haproxy;默认只启动一个进程,鉴于调试困难等多方面的原因,一般只在单进程仅能打开少数文件描述符的场景中才使用多进程模式;
  • pidfile:将haproxy的进程写入pid文件;
  • ulimit-n:设定每进程所能够打开的最大文件描述符数目,默认情况下其会自动进行计算,因此不推荐修改此选项;
  • stats socket 定义统计信息保存位置;

defaults配置

用于设置配置默认参数,这些参数可以被用到frontend,backend,listen组件。

在此部分中设置的参数值,默认会自动引用到下面的frontend、backend、listen部分中。如果某些参数属于公用的配置,只需要在defaults部分添加一次即可。而如果frontend、backend、listen部分也配置了与defaults部分一样的参数,defaults部分参数对应的值自动被覆盖。

defaults
         log    global         #引入global定义的日志格式
         mode    http          #所处理的类别(7层代理http,4层代理tcp)
         maxconn 50000         #最大连接数
         option  httplog       #日志类别为http日志格式
         option  httpclose     #每次请求完毕后主动关闭http通道
         option  dontlognull   #不记录健康检查日志信息
         option  forwardfor    #如果后端服务器需要获得客户端的真实ip,需要配置的参数,
                               可以从http header 中获取客户端的IP
         retries 3             #3次连接失败就认为服务器不可用,也可以通过后面设置
         
         option redispatch  
#《---上述选项意思是指serverID 对应的服务器挂掉后,强制定向到其他健康的服务器, 当使用了cookie时,
haproxy将会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性;而此时,如果
后端的服务器宕掉了,但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请求强制定向到另外一个
后端server上,以保证服务的正常---》
         
         stats refresh 30       #设置统计页面刷新时间间隔
         option abortonclose    #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
         balance roundrobin     #设置默认负载均衡方式,轮询方式
         #balance source        #设置默认负载均衡方式,类似于nginx的ip_hash      
         #contimeout 5000        #设置连接超时时间
         #clitimeout 50000       #设置客户端超时时间
         #srvtimeout 50000       #设置服务器超时时间
         timeout http-request    10s  #默认http请求超时时间
         timeout queue           1m   #默认队列超时时间
         timeout connect         10s  #默认连接超时时间
         timeout client          1m   #默认客户端超时时间
         timeout server          1m   #默认服务器超时时间
         timeout http-keep-alive 10s  #默认持久连接超时时间
         timeout check           10s  #设置心跳检查超时时间
  • mode http:设置haproxy的运行模式,有三种{http|tcp|health}。注意:如果haproxy中还要使用4层的应用(mode tcp)的话,不建议在此定义haproxy的运行模式。
    •   tcp模式:在此模式下,客户端和服务器端之前将建立一个全双工的连接,不会对七层报文做任何检查,默认为tcp模式,经常用于SSL、SSH、SMTP等应用。
    •   http模式:在此模式下,客户端请求在转发至后端服务器之前将会被深度分板,所有不与RFC格式兼容的请求都会被拒绝。
    •   health:已基本不用了。
  • log global:设置日志继承全局配置段的设置。
  • option httplog:表示开始打开记录http请求的日志功能。
  • option dontlognull:如果产生了一个空连接,那这个空连接的日志将不会记录。
  • option http-server-close:打开http协议中服务器端关闭功能,使得支持长连接,使得会话可以被重用,使得每一个日志记录都会被记录。
  • option forwardfor except 127.0.0.0/8:如果上游服务器上的应用程序想记录客户端的真实IP地址,haproxy会把客户端的IP信息发送给上游服务器,在HTTP请求中添加”X-Forwarded-For”字段,但当是haproxy自身的健康检测机制去访问上游服务器时是不应该把这样的访问日志记录到日志中的,所以用except来排除127.0.0.0,即haproxy身。
  • option redispatch:当与上游服务器的会话失败(服务器故障或其他原因)时,把会话重新分发到其他健康的服务器上,当原来故障的服务器恢复时,会话又被定向到已恢复的服务器上。还可以用”retries”关键字来设定在判定会话失败时的尝试连接的次数。
  • retries 3:向上游服务器尝试连接的最大次数,超过此值就认为后端服务器不可用。
  • option abortonclose:当haproxy负载很高时,自动结束掉当前队列处理比较久的链接。
  • timout http-request 10s:客户端发送http请求的超时时间。
  • timeout queue 1m:当上游服务器在高负载响应haproxy时,会把haproxy发送来的请求放进一个队列中。timeout queue定义放入这个队列的超时时间。
  • timeout connect 5s:haproxy与后端服务器连接超时时间,如果在同一个局域网可设置较小的时间。
  • timeout client 1m:定义客户端与haproxy连接后,数据传输完毕,不再有数据传输,即非活动连接的超时时间。
  • timeout server 1m:定义haproxy与上游服务器非活动连接的超时时间。
  • timeout http-keep-alive 10s:设置新的http请求连接建立的最大超时时间,时间较短时可以尽快释放出资源,节约资源。
  • timeout check 10s:健康检测的时间的最大超时时间。
  • maxconn 3000:最大并发连接数。
  • contimeout 5000:设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,新版本的haproxy使用timeout connect替代,该参数向后兼容。
  • clitimeout 3000:设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒,新版本haproxy使用timeout client替代。该参数向后兼容。
  • srvtimeout 3000:设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,新版本haproxy使用timeout server替代。该参数向后兼容。
  • balance roundrobin:设置负载算法为:轮询算法,balance :用来定义负载均衡算法
  • roundrobin:基于权重进行的轮叫算法,在服务器的性能分布经较均匀时这是一种最公平的,最合量的算法。
  • static-rr:也是基于权重时行轮叫的算法,不过此算法为静态方法,在运行时调整其服务权重不会生效。
  • source:是基于请求源IP的算法,此算法对请求的源IP时行hash运算,然后将结果与后端服务器的权理总数相除后转发至某台匹配的后端服务器,这种方法可以使用一个客户端IP的请求始终转发到特定的后端服务器。
  • leastconn:此算法会将新的连接请求转发到具有最少连接数目的后端服务器。在会话时间较长的场景中推荐使用此算法。例如数据库负载均衡等。此算法不适合会话较短的环境,如基于http的应用。
  • uri:此算法会对部分或整个URI进行hash运算,再经过与服务器的总权重要除,最后转发到某台匹配的后端服务器上。
  • uri_param:此算法会椐据URL路径中的参数时行转发,这样可以保证在后端真实服务器数量不变时,同一个用户的请求始终分发到同一台机器上。
  • hdr:此算法根据httpd头时行转发,如果指定的httpd头名称不存在,则使用roundrobin算法进行策略转发。
  • rdp-cookie(name):示根据据cookie(name)来锁定并哈希每一次TCP请求。

frontend配置

frontend是在haproxy 1.3版本以后才引入的一个组件,同时引入的还有backend组件。通过引入这些组件,在很大程度上简化了haproxy配置文件的复杂性。forntend可以根据ACL规则直接指定要使用的后端backend

frontend http_80_in
     bind 0.0.0.0:80    #设置监听端口,即haproxy提供的web服务端口,和lvs的vip 类似
     mode http          #http 的7层模式
     log global         #应用全局的日志设置
     option httplog     #启用http的log
     option httpclose   #每次请求完毕后主动关闭http通道,HAproxy不支持keep-alive模式     
     option forwardfor  #如果后端服务器需要获得客户端的真实IP需要配置此参数,将可以从HttpHeader中获得客户端IP
     default_backend wwwpool   #设置请求默认转发的后端服务池
  • frontend http_80_in:定义一个名为http_80_in的frontend。
  • bind 0.0.0.0:80:定义haproxy前端部分监听的端口。
  • mode http:定义为http模式。
  • log global:继承global中log的定义。
  • option forwardfor:使后端server获取到客户端的真实IP。

backend配置

用来定义后端服务集群的配置,真实服务器,一个Backend对应一个或者多个实体服务器。

backend wwwpool      #定义wwwpool服务器组。
  mode http           #http的7层模式
  option  redispatch
  option  abortonclose
  balance source      #负载均衡的方式,源哈希算法
  cookie  SERVERID    #允许插入serverid到cookie中,serverid后面可以定义
  option  httpchk GET /test.html   #心跳检测
  server web1 10.1.1.2:80 cookie 2 weight 3 check inter 2000 rise 2 fall 3 maxconn 8
  • cookie:表示充许向cookie插入SERVERID,每台服务器的SERVERID可以下面的server关键字中使用cookie关键字定义。
  • option httpchk:此选项表示启用HTTP的服务状态检测功能。 HAProxy作为一个专业的负载均衡器,并且它支持对backend部分指定的后端服务节点的 健康检查,以保证在后端的backend中某个节点不能服务时,把从frontend端进来的客户端请求分配至backend中其他健康节点上,从而保证 整体服务的可用性。
  • method:表示HTTP请求的方式,常用的有OPTIONS、GET、HEAD几种方式。
  • 一般健康检查可以采用HEAD方式进行,而不是采用GET方式,这是因为HEAD方式没有数据返回,仅检查Response的HEAD是不是状态码200。因此,相对于GET,HEAD方式更快,更简单。
  • uri:表示要检测的URL地址,通过执行此URL,可以获取后端服务器的运行状态,在正常情况下返回状态码200,返回其他状态码均为异常状态。
  • version:指定心跳检测时的HTTP的版本号。
  • server:用来定义多台后端真实服务器,不能用于defaults和frontend部分,格式为:server name address:port param
    •   name:为后端真实服务器指定一个内部名称,随便这下义一个即可。
    •   address:后端真实服务器的iP地址或主机名。
    •   port:指定连接请求发往真实服务器时的目标端口,在未设定时,将使用客户端请求时的同一端口。
    •   param:为后端服务器设定的一系列参数,可用参数非常多。
      •     check:表示启用对此后端服务器执行健康检查。
      •     inter:设置健康状态检查的时间间隔,单位为毫秒。
      •     rise:设置从故障状态转换至正常状态需要成功检查的次数,如 rise 2:表示2次检查正确就认为此服务器可用。
      •     fall:设置后端服务器从正常状态转换为不可用状态需要检查的次数,如 fall 3表示3 次检查失败就认为此服务器不可用。
      •     cookie:为指定的后端服务器设定cookie值,此外指定的值将在请求入站时被检查,第一次为此值挑选的后端服务器将在后续的请求中一直被选中,其目的在于实现持久连接的功能。
      •     cookie server1:表示web1的serverid为server1。
      •     weigth:设置后端真实服务器的权重,默认为1,最大值为256,设置为0表示不参与负载均衡。
      •     maxconn:设定每个backend中server进程可接受的最大并发连接数,此选项等同于linux命令选项”ulimit -n”。
      •     backup:设置后端真实服务器的备份服器,仅仅在后端所有真实服务器均不可用的情况下才启用。

listen配置

常常用于状态页面监控,以及后端server检查,是Fronted和backend的组合体。

listen  admin_status           #Frontend和Backend的组合体,监控组的名称,按需自定义名称 
         bind 0.0.0.0:8888              #监听端口 
         mode http                      #http的7层模式 
         log 127.0.0.1 local3 err       #错误日志记录 
         stats refresh 5s               #每隔5秒自动刷新监控页面 
         stats uri /admin?stats         #监控页面的url访问路径 
         stats realm itnihao\ welcome   #监控页面的提示信息 
         stats auth admin:admin         #监控页面的用户和密码admin,可以设置多个用户名 
         stats auth admin1:admin1       #监控页面的用户和密码admin1 
         stats hide-version             #隐藏统计页面上的HAproxy版本信息  
         stats admin if TRUE            #手工启用/禁用,后端服务器(haproxy-1.4.9以后版本)

 

 

示例

#---------------------------------------------------------------------
# Example configuration for a possible web application.  See the
# full configuration options online.
#
#   http://haproxy.1wt.eu/download/1.4/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

#---------------------------------------------------------------------
# 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 test_frontend  # 申明一个frontend
    bind *:81    # 指定监听的端口
    mode tcp     # 在三层
    default_backend app    # 指定后端服务器
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend static
    balance     roundrobin
    server      static 127.0.0.1:4331 check

#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend 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
    server  app4 127.0.0.1:80 check    # 这里指定了后端的ip:port

 

其实请求当前服务器的81端口,就能将请求转发到后端80端口

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2023-03-13 20:06  暮歌行  阅读(767)  评论(0编辑  收藏  举报