HAproxy负载均衡

HAproxy 简介


  1. HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。
  2. HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。
  3. HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
  4. HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。

为什么要使用HAproxy


  1. 免费开源,稳定性也是非常好,这个可通过一些项目可以看出来,单Haproxy也跑得不错,稳定性可以与硬件级的F5相媲美;
  2. 根据官方文档,HAProxy可以跑满10Gbps­New benchmark of HAProxy at 10 Gbps usingMyricom’s 10GbE NICs (Myri­10G PCI­Express),这个数值作为软件级负载均衡器是相当惊人的。
  3. HAProxy 支持连接拒绝 : 因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻
  4. 击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。 这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救了很多站点,这个优点也是其它负载均衡器没有的。
  5. HAProxy 支持全透明代理(已具备硬件防火墙的典型特点): 可以用客户端IP地址或者任何其他地址来连接后端服务器. 这个特性仅在Linux 2.4/2.6内核打了cttproxy补丁后才可以使用,这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。
  6. HAProxy现多于线上的Mysql集群环境,我们常用于它作为MySQL(读)负载均衡。
  7. 自带强大的监控服务器状态的页面,实际环境中我们结合Nagios进行邮件或短信报警。
  8. HAProxy支持虚拟主机。
  9. HAProxy特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

注,在功能上,能以proxy反向代理方式实现Web均衡负载,这样的产品有很多。包括lvsNginxApacheProxylighttpd等。国内生产环境上使用Haproxy的公司很多,例如淘宝的CDN系统,

HAproxy负载均衡

负载均衡器的性能评估因素


三个重要因素:

  1. 会话率 :单位时间内的处理的请求数
  2. 会话并发能力:并发处理能力
  3. 数据率:处理数据能力

经过官方测试统计,haproxy 单位时间处理的最大请求数为20000个,可以同时维护40000­50000个并发连接,最大数据处理能力为10Gbps。综合上述,haproxy是性能优越的负载均衡、反向代理服务器。

安装HAproxy


安装haproxy

 [root@localhost ~]# yum -y groupinstall "Development Tools"
 [root@localhost ~]# yum -y install haproxy

配置文件

 [root@localhost ~]# rpm -ql haproxy
 /etc/haproxy #配置文件目录
 /etc/haproxy/haproxy.cfg #配置文件
 /etc/rc.d/init.d/haproxy #启动脚本
 /usr/sbin/haproxy #haproxy 命令
 /usr/share/.gz #man 文档 

haproxy 命令详解

 [root@localhost ~]# haproxy -h
 HA-Proxy version  //
 Copyright - Willy Tarreau <willy@haproxy.org>

 Usage : haproxy [-f <cfgfile>]* [ -vdVD ] [ -n <maxconn> ] [ -N <maxpconn> ]
         [ -p <pidfile> ] [ -m <max megs> ] [ -C <dir> ]
         -v displays version ; -vv shows known build options.
         -d enters debug mode ; -db only disables background mode.
         -dM[<byte>] poisons memory with <byte> (defaults to 0x50)
         -V enters verbose mode (disables quiet mode)
         -D goes daemon ; -C changes to <dir> before loading files.
         -q quiet mode : don't display messages
         -c check mode : only check config files and exit
         -n sets the maximum total # of connections ()
         -m limits the usable amount of memory (in MB)
         -N sets the default, per-proxy maximum # of connections ()
         -L set local peer name (default to hostname)
         -p writes pids of all children to this file
         -de disables epoll() usage even when available
         -dp disables poll() usage even when available
         -dS disables splice usage (broken on old kernels)
         -dV disables SSL verify on servers side
         -sf/-st [pid ]* finishes/terminates old pids. Must be last arguments.
 haproxy [-f < 配置文件>] [ -vdVD ] [-n 最大并发连接总数] [-N 每个侦听的最大并发数]
 [ -p <当前的PID文件> ] [-m <内存限制M>]
 -v 显示当前版本信息;-vv 显示已知的创建选项
 -d 前台,debug模式;-db 禁用后台模式,程序跑在前台
 -V 详细模式
 -D daemon模式启动
 -q 安静模式,不输出信息
 -c 对配置文件进行语法检查
 -n 最大并发连接总数
 -m 限制的可用内存大小
 -N 设置默认的连接数
 -p 设置当前的PID文件
 -de 不使用epoll
 -ds 不使用speculative epoll
 -dp 不使用poll
 -sf 程序启动后向pidlist里的进程发送FINISH信号,这个参数放在命令行的最后
 -st 程序启动后向pidlist里的进程发送TERMINATE信号,这个参数放在命令行的最后

默认配置文件

 [root@haproxy haproxy]# cat haproxy.cfg
 #---------------------------------------------------------------------
 # 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:  #配置日志
     #
     # ) configure syslog to accept network log events.  This is done
     #    by adding the '-r' option to the SYSLOGD_OPTIONS in
     #    /etc/sysconfig/syslog #修改syslog配置文件
     #
     # ) 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 #
 #全局的日志配置 其中日志级别是[err warning info debug]
 #local0 是日志设备,必须为如下24种标准syslog设备的一种:
 #kern user mail daemon auth syslog lpr news
 #uucp cron auth2 ftp ntp audit alert cron2
 #local0 local1 local2 local3 local4 local5 local6 local7
     chroot      /var/lib/haproxy
     pidfile     /var/run/haproxy.pid #将所有进程的pid写入文件启动进程的用户必须有权限访问此文件。
     maxconn      #最大连接数,默认4000
     user        haproxy #用户
     group       haproxy #组
     daemon ##创建1个进程进入deamon模式运行。此参数要求将运行模式设置为"daemon"
     # turn on stats unix socket  #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  #默认的全局设置,这些参数可以被利用配置到frontend,backend,listen组件
 #---------------------------------------------------------------------
 defaults
     mode                    http  #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
     log                     global #采用全局定义的日志
     option                  httplog #日志类别http日志格式
     option                  dontlognull #不记录健康检查的日志信息
     option http-server-close #每次请求完毕后主动关闭http通道
     option forwardfor       except  #不记录本机转发的日志
     option                  redispatch #serverId对应的服务器挂掉后,强制定向到其他健康的服务器
     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                  #最大连接数
 #---------------------------------------------------------------------
 # main frontend which proxys to the backends #frontend 与backends  代理配置
 #---------------------------------------------------------------------
 frontend  main *:
 #acl策略配置
     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  #满足策略要求,则响应策略定义的backend页面
     default_backend             app #不满足则响应backend的默认页面
 #---------------------------------------------------------------------
 # static backend for serving up images, stylesheets and such #定义使用静态后端图像,样式表等
 #---------------------------------------------------------------------
 backend static
     balance     roundrobin #负载均衡模式轮询
     server      static  check #服务器定义
 #---------------------------------------------------------------------
 # round robin balancing between the various backends
 #---------------------------------------------------------------------
 backend app
     balance     roundrobin #负载均衡模式轮询
     server  app1  check #服务器定义,check进行健康检查
     server  app2  check
     server  app3  check
     server  app4  check

haproxy 配置文件详解


配置文件的格式

HAProxy的配置处理3类来主要参数来源:

  • ——最优先处理的命令行参数,
  • ——“global”配置段,用于设定全局配置参数;
  • ——proxy相关配置段,如“defaults”、“listen”、“frontend”和“backend”;4.全局配置

注,“global”配置中的参数为进程级别的参数,且通常与其运行的OS相关。

时间格式

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

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

例子

下面的例子配置了一个监听在所有接口的80端口上HTTP proxy服务,它转发所有的请求至后端监听在127.0.0.1:8000上的"server"。

 global
         daemon
         maxconn
     defaults
         mode http
         timeout connect 5000ms
         timeout client 50000ms
         timeout server 50000ms
     frontend http-in
         bind *:
         default_backend servers
     backend servers
         server server1  maxconn 

全局配置

(1).进程管理及安全相关的参数

.    chroot <jail dir>:修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作,可以提升haproxy的安全级别,不过需要注意的是要确保指定的目录为空目录且任何用户均不能有写权限;
.    daemon:让haproxy以守护进程的方式工作于后台,其等同于“-D”选项的功能,当然,也可以在命令行中以“-db”选项将其禁用;
.    gid <number>:以指定的GID运行haproxy,建议使用专用于运行haproxy的GID,以免因权限问题带来风险;
.    group <group name>:同gid,不过指定的组名;
.    log  <address> <facility> [max level [min level]]:定义全局的syslog服务器,最多可以定义两个;
.    log-send-hostname [<string>]:在syslog信息的首部添加当前主机名,可以为“string”指定的名称,也可以缺省使用当前主机名;
.    nbproc <number>:指定启动的haproxy进程个数,只能用于守护进程模式的haproxy;默认只启动一个进程,鉴于调试困难等多方面的原因,一般只在单进程仅能打开少数文件描述符的场景中才使用多进程模式;
.    pidfile:将所有进程的pid写入文件启动进程的用户必须有权限访问此文件
.    uid:以指定的UID身份运行haproxy进程;
.    ulimit-n:设定每进程所能够打开的最大文件描述符数目,默认情况下其会自动进行计算,因此不推荐修改此选项;
.    user:同uid,但使用的是用户名;
.    stats:
.    node:定义当前节点的名称,用于HA场景中多haproxy进程共享同一个IP地址时;
.    description:当前实例的描述信息;

(2).性能调整相关的参数

.    maxconn <number>:设定每个haproxy进程所接受的最大并发连接数,其等同于命令行选项“n”;“ulimit n”自动计算的结果正是参照此参数设定的;
.    maxpipes <number>:haproxy使用pipe完成基于内核的tcp报文重组,此选项则用于设定每进程所允许使用的最大pipe个数;每个pipe会打开两个文件描述符,因此,“ulimit n”自动计算时会根据需要调大此值;默认为maxconn/,其通常会显得过大;
.    noepoll:在Linux系统上禁用epoll机制;
.    nokqueue:在BSE系统上禁用kqueue机制;
.    nopoll:禁用poll机制;
.    nosepoll:在Linux禁用启发式epoll机制;
.    nosplice:禁止在Linux套接字上使用内核tcp重组,这会导致更多的recv/send系统调用;不过,在Linux 2.6.2528系列的内核上,tcp重组功能有bug存在;
.    spreadchecks <.., in percent>:在haproxy后端有着众多服务器的场景中,在精确的时间间隔后统一对众服务器进行健康状况检查可能会带来意外问题;此选项用于将其检查的时间间隔长度上增加或减小一定的随机时长;
.    tune.bufsize <number>:设定buffer的大小,同样的内存条件小,较小的值可以让haproxy有能力接受更多的并发连接,较大的值可以让某些应用程序使用较大的cookie信息;默认为16384,其可以在编译时修改,不过强烈建议使用默认值;
.    tune.chksize <number>:设定检查缓冲区的大小,单位为字节;更大的值有助于在较大的页面中完成基于字符串或模式的文本查找,但也会占用更多的系统资源;不建议修改;
.    tune.maxaccept <number>:设定haproxy进程内核调度运行时一次性可以接受的连接的个数,较大的值可以带来较大的吞吐率,默认在单进程模式下为100,多进程模式下为8,设定为1可以禁止此限制;一般不建议修改;
.    tune.maxpollevents  <number>:设定一次系统调用可以处理的事件最大数,默认值取决于OS;其值小于200时可节约带宽,但会略微增大网络延迟,而大于200时会降低延迟,但会稍稍增加网络带宽的占用量;
.    tune.maxrewrite <number>:设定为首部重写或追加而预留的缓冲空间,建议使用1024左右的大小;在需要使用更大的空间时,haproxy会自动增加其值;
tune.rcvbuf.client <number>:
.    tune.rcvbuf.server <number>:设定内核套接字中服务端或客户端接收缓冲的大小,单位为字节;强烈推荐使用默认值;
.    tune.sndbuf.client:
.    tune.sndbuf.server:

(3).Debug相关的参数

.    debug
.    quiet

代理

代理相关的配置可以如下配置段中。

  • defaults  <name>
  • frontend  <name>
  • backend  <name>
  • - listen    <name>
“defaults”段用于为所有其它配置段提供默认参数,这配置默认配置参数可由下一个“defaults”所重新设定。
 “frontend”段用于定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接。
 “backend”段用于定义一系列“后端”服务器,代理将会将对应客户端的请求转发至这些服务器。
 “listen”段通过关联“前端”和“后端”定义了一个完整的代理,通常只对TCP流量有用。

所有代理的名称只能使用大写字母、小写字母、数字、-(中线)、_(下划线)、.(点号)和:(冒号)。此外,ACL名称会区分字母大小写。

haproxy 配置文件中的关键字参考


1.balance

格式:

 ###########全局配置#########
 global
   log 127.0.0.1 local0 #[日志输出配置,所有日志都记录在本机,通过local0输出]
   log 127.0.0.1 local1 notice #定义haproxy 日志级别[error warringinfo debug]
   daemon #以后台形式运行harpoxy
   nbproc  #设置进程数量
   maxconn  #默认最大连接数,需考虑ulimit-n限制
   #user haproxy #运行haproxy的用户
   #group haproxy #运行haproxy的用户所在的组
   #pidfile /var/run/haproxy.pid #haproxy 进程PID文件
   #ulimit-n  #ulimit 的数量限制
   #chroot /usr/share/haproxy #chroot运行路径
   #debug #haproxy 调试级别,建议只在开启单进程的时候调试
   #quiet

 ########默认配置############
 defaults
   log global
   mode http #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
   option httplog #日志类别,采用httplog
   option dontlognull #不记录健康检查日志信息
   retries  #两次连接失败就认为是服务器不可用,也可以通过后面设置
   #option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
   option httpclose #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现
   #option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器,以后将不支持
   option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
   maxconn  #默认的最大连接数
   timeout connect 5000ms #连接超时
   timeout client 30000ms #客户端超时
   timeout server 30000ms #服务器超时
   #timeout check  #心跳检测超时
   #timeout http-keep-alive10s #默认持久连接超时时间
   #timeout http-request 10s #默认http请求超时时间
   #timeout queue 1m #默认队列超时时间
   balance roundrobin #设置默认负载均衡方式,轮询方式
   #balance source #设置默认负载均衡方式,类似于nginx的ip_hash
   #balnace leastconn #设置默认负载均衡方式,最小连接数

 ########统计页面配置########
 listen stats
   bind  #设置Frontend和Backend的组合体,监控组的名称,按需要自定义名称
   mode http #http的7层模式
   option httplog #采用http日志格式
   #log 127.0.0.1 local0 err #错误日志记录
   maxconn  #默认的最大连接数
   stats refresh 30s #统计页面自动刷新时间
   stats uri /stats #统计页面url
   stats realm XingCloud\ Haproxy #统计页面密码框上提示文本
   stats auth admin:admin #设置监控页面的用户和密码:admin,可以设置多个用户名
   stats auth Frank:Frank #设置监控页面的用户和密码:Frank
   stats hide-version #隐藏统计页面上HAProxy的版本信息
   stats admin if TRUE #设置手工启动/禁用,后端服务器(haproxy-1.4.9以后版本)

 ########设置haproxy 错误页面#####
 #errorfile  /home/haproxy/haproxy/errorfiles/.http
 #errorfile  /home/haproxy/haproxy/errorfiles/.http
 #errorfile  /home/haproxy/haproxy/errorfiles/.http
 #errorfile  /home/haproxy/haproxy/errorfiles/.http
 #errorfile  /home/haproxy/haproxy/errorfiles/.http

 ########frontend前端配置##############
 frontend main
   bind *: #这里建议使用bind *:80的方式,要不然做集群高可用的时候有问题,vip切换到其他机器就不能访问了。
   acl web hdr(host) -i www.abc.com  #acl后面是规则名称,-i为忽略大小写,后面跟的是要访问的域名,如果访问www.abc.com这个域名,就触发web规则,。
   acl img hdr(host) -i img.abc.com  #如果访问img.abc.com这个域名,就触发img规则。
   use_backend webserver if web   #如果上面定义的web规则被触发,即访问www.abc.com,就将请求分发到webserver这个作用域。
   use_backend imgserver if img   #如果上面定义的img规则被触发,即访问img.abc.com,就将请求分发到imgserver这个作用域。
   default_backend dynamic #不满足则响应backend的默认页面

 ########backend后端配置##############
 backend webserver #webserver作用域
   mode http
   balance roundrobin #balance roundrobin 负载轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数
   option httpchk /index.html HTTP/1.0 #健康检查, 检测文件,如果分发到后台index.html访问不到就不再分发给它
   server web1  cookie  weight  check inter  rise  fall
   server web2  cookie  weight  check inter  rise  fall
   #cookie 1表示serverid为1,check inter  是检测心跳频率
   #rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重

 backend imgserver
   mode http
   option httpchk /index.php
   balance roundrobin
   server img01  check inter  fall
   server img02  check inter  fall 

 backend dynamic
   balance roundrobin
   server test1  check maxconn
   server test2  check maxconn 

 listen tcptest
   bind
   mode tcp
   option tcplog #采用tcp日志格式
   balance source
   #log 127.0.0.1 local0 debug
   server s1  weight
   server s2  weight 
上一篇:【DSU on tree】【CF741D】Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths


下一篇:PyOpenGL TypeError in glutCreateWindow