HAProxy用法详解

一、HAProxy简介

  1. HAProxy是一款提供高可用性、负载均衡以及基于Tcp(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,他是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的Web站点,这些站点通常又需要回话保持,或者七层处理。HAProxy运行在时下的硬件环境上,完全可以支持数以万计的并发连接。并且他的运行模式可以使得它很简单安全的整合进您当前的架构中,同时可以保护您的Web服务器不被暴露在网络中。
  2. HAProxy实现了一种事件驱动、单一进程类型。此模式支持非常大的并发连接数。多进程或者多线程模式受到内存限制、系统调度器限制、以及无处不在的锁限制。很少能处理数千并发连接。事件驱动模型在更好的资源和时间管理的用户端(User-Space)实现了所有的任务,所以没有这些问题。此系统的弊端是,在多核系统上这些程序通常扩展性较差。这就是为什么他们必须进行优化,使每个cpu时间片(Cycle)做更多的工作。
  3. HAProxy支持连接拒绝:因为维护一个连接的打开的开销是很低的。又是我们很需要限制攻击蠕虫(attacks bots),也就是说限制它们的连接打开,从而限制它们的危害。这个已经为一个陷于小型DDOS攻击的网站开发了而且拯救了很多站点。这个有点也是其他负载均衡所没有的。
  4. HAProxy支持全透明代理。已具备典型防火墙的特点:可以用客户端ip地址或者其他任何地址连接后端服务器。这个特性尽在Linux 2.4/2.6内核打了cttproxy补丁后才可以使用。这个特性也使得某个特殊服务器处理部分流量同时又不修改服务器地址成为了可能。

二、性能

HAProxy借助了OS上集中常见的技术来实现性能的最大化

  1. 单进程、事件驱动模型显著降低了上下文切换的开销以及内存占用。
  2. O(1)事件检查器(event checker)允许其在高并发连接中对任何连接的任何事件实现即时探测。
  3. 在任何可用的情况下。单缓冲(single buffing)机制能以不复制任何数据的方式完成读写操作。这会大量节约cpu时钟周期,以及内存带宽。
  4. 借助于Linux2.6(>=2.6.27.19)上的splice()的系统调用。HAProxy可以实现零复制转发(Zero-copy forwaring)。在Linux3.5及以上的OS中还可以实现零复制启动。(Zero-staring)
  5. 内存分配器在固定大小的内存池中可实现即使内存分配。这能显著减少创建一个会话的时长。
  6. 树形存储:侧重于使用多年前作者开发的弹性二叉树,实现了以O(log(N))的低开销来保持计时器命令、保持运行队列命令、管理轮训、最少连接队列
  7. 优化HTTP首部分析:优化的首部分析功能避免了,在HTTP首部分析过程中重读任何内存区域;
  8. 精细的降低了昂贵的系统调用,大部分工作都在用户空间完成,如时间读取、缓冲聚合以及文件描述符的启用和禁用。
    所有的这些精细之处的优化,实现了中等规模以上依然有着相当低的CPU负载。甚至在非常高的负载场景中,5%的用户空间占用率和95%的系统空间占用率也是非常普遍的现象。这意味着HAProxy的进程消耗比系统空降消耗低20倍以上。因此对OS进行系统调优是非常重要的。即使用户空间的占用率提升一倍。其CPU占用率也仅为10%,这也解释了7层处理对性能有限这个现象。由此,在高端系统上HAProxy的7层性能可轻易超过硬件负载设备的性能。
    在生产环境中,在7层处理上使用HAProxy作为昂贵的高端硬件负载均衡设备故障时的紧急解决方案,也时常可见,硬件负载均衡设备在“报文”级别处理请求,这在跨报文请求(request across multiple packts)有着较高的难度,并且它们不缓冲任何数据,因此有着较长的响应时间。对应的,软件负载均衡设备用TCP缓冲,可建极长的请求,且有着较大的响应时间。
    HAProxy 目前主要有三个版本:1.3,1.4,1.5。CentOS6.6自带的RPM包为1.5的

三、安装HAProxy

  1. 安装HAProxy
yum install -y haproxy
  • 查看版本
rpm -qi haproxy

在这里插入图片描述

四、详解配置文件

HAProxy 配置文件由两部分组成:全局设定、对代理的设定。共分为五段:global、defaults、frontend、backend、listen

1、配置文件格式

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

2、时间格式

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

us:微秒(microseconds),即 1/1000000秒;百万分之一秒
ms:毫秒(milliseconds),即1/1000秒;千分之一秒
s:秒(seconds)
m:分(minutes)
h:时(hours)
d:天(days)

3、全局配置

3.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:

– uid:以指定的UID身份运行haproxy进程;

– ulimit-n:设定每进程所能够打开的最大文件描述符数目,默认情况下其会自动进行计算,因此不推荐修改此选项;Linux默认单进程打开文件数为1024个

– user:同uid,但使用的是用户名;

– stats:用户访问统计数据的接口

– node:定义当前节点的名称,用于HA场景中多haproxy进程共享同一个IP地址时;

– description:当前实例的描述信息;

3.2、性能调整相关的参数

– maxconn <number>:设定每个haproxy进程所接受的最大并发连接数,其等同于命令行选项“-n”;“ulimit -n”自动计算的结果正是参照此参数设定的;

– maxpipes <number>:haproxy使用pipe完成基于内核的tcp报文重组,此选项则用于设定每进程所允许使用的最大pipe个数;每个pipe会打开两个文件描述符,因此,“ulimit -n”自动计算时会根据需要调大此值;默认为maxconn/4,其通常会显得过大;

– noepoll:在Linux系统上禁用epoll机制;

– nokqueue:在BSE系统上禁用kqueue机制;

– nopoll:禁用poll机制;

– nosepoll:在Linux禁用启发式epoll机制;

– nosplice:禁止在Linux套接字上使用内核tcp重组,这会导致更多的recv/send系统调用;不过,在Linux 2.6.25-28系列的内核上,tcp重组功能有bug存在;

– spread-checks <0..50, 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.3、Debug相关的参数

-debug

-quiet

3.4、超时时常

timeout http requeats: 在客户端建立连接但不请求数据时,关闭客户端连接
timeout queue:等待最大时长
timeout connect:定义haproxy将客户端请求,转发到后端服务器,所等待的超时时长
timeout client:客户端非活动状态的超时时长
timeout server:客户端与服务器建立连接后,等待服务器端的超时时长
timeout http-keep-alive:定义保持连接的超时时长
timeout check:健康状态检测时的超时时间,过段会误判,过长会资源消耗
maxconn:每个server最大的连接数

http-server-close:在使用长连接时,为了避免客户端超时没有关闭长连接,此功能可以使客户端关闭长连接
redispatch:在使用基于cookie定向时,一旦后端某一server宕机时,会将会话重定向至某一上游服务器

3.5、实现访问控制

http-request:7层过滤
tcp-request connect:tcp层过滤,四层过滤

4、代理

  • 代理相关可以配置到如下配置段中
-defaults <name>
-frontend <name>
-backend <name>
-listen <name>

"default"段用于为其他所有配置段提供默认参数,这个配置的默认参数,可以由下一个“defaults”所重新设定

“frontend”段用于定义一系列监听的套接字,这些套接字可以接受客户端请求,并与之建立连接

“backend”段用户用于定义一系列“后端“服务器,代理将会对应客户端的请求,转发到对应服务器。
“listen”段通过关联“frontend”和“backend”段定义了一个完整的代理,通常只对tcp流量有用。

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

5、配置文件中的关键字参考

1、balance

balance []
balance url_parm [check_post[]]

定义负载均衡算法,可用于“defaults”、“listen”和“backend”。用于在负载均衡中挑选一个server。server仅应用于持久信息不可用条件下,或需要将一个连接派发至另一个服务器时。支持的算法有:

  • roundrobin
    基于权重进行轮叫,在服务器的处理时间保持均匀分布时,这是最平衡最公平的算法。此算法是动态的,这表示其权重可以在运行时进行调整。不过在设计上,每个后端服务器仅能最多接受4128个连接,并且支持慢启动。

  • static-rr
    基于权重进行轮叫,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效。不过,在其后端服务器连接数上没有限制。不支持慢启动。在高负荷的情况下,服务器重新上线时,会立即被分配大量连接。

  • leastconn(WLC)
    适用于长连接的会话,新的连接请求会被派发至具有最少连接数的后端服务器。在有较长时间会话的场景中,推荐此算法。如LDAP、SQL等。leastconn并不是用于较短会话的应用层协议,如HTTP。此算法时动态的,可以在运行时调整其权重。

  • source
    将请求的源地址进行hash运算,并与后端服务器的权重总数相除后,派发至某个匹配的服务器。这个可以使得同一个客户端ip的请求始终被派发至某一特定的服务器。不过,当服务器权重总数发生变化时,如某服务器宕机或者添加新的服务器,许多客户端的请求可能会被派发至于此前请求不同的服务器。常用语负载均衡无cookie功能的基于TCP的协议。其默认为静态,不过也可以使用hash-type修改此特性。

  1. 对原地址hash,第一次调度时使用WLC(leastconn)
    source:ip层,位于同一个NAT服务器背后的多个请求都回定向至同一个upstream server,不利于负载均衡。一般只有不支持使用cookie插入又需要保持会话时使用。
    cookie:应用层,有更好的负载均衡效果
  2. hash/weigth%ip:除以权重取模。取模(取余和取模的区别。。。)
  • url_param:通过 为URL指定的参数在每个HTTP get请求中将会被检索;如果找到了指定的参数且其通过等于号 “=” 被赋予一个值,那么此值将被执行hash 运算并被服务器的总权重相除后派发至某匹配的服务器。此算法可以通过追踪请求中的用户标示进而确保同一个用户ID 的请求将被送往同一个特定的服务器,除非服务器的总权重发生变化;如果某请求中没有出现指定的参数或其没有有效值,则使用轮叫算法对相应请求进行调度,此算法默认是静态的,不过其也可以使用hash-type修改此特性。

  • hdr():对于每一个HTTP请求,通过指定的HTTP首部将会被检索;如果相应的首部没有出现或其没有有效值,则使用轮叫算法对应相应请求进行调度;其中一个可选项“use_domain_only”,可以在指定检索类似Host类的首部时仅计算域名部分(比如通过www.feiyu.com来说,仅计算feiyu字符串的hash值)以降低hash算法的算法量。此算法默认为静态的,不过其也可以使用hash-type修改此特性

  • rdp-cookie(name)
    表示根据cookie(name) 来锁定并hash每一个词TCP请求。

2、bind

bind [<address>]:<port_range>[,...]
bind [<address>]:<port_range> [,...] interface <interface>

此指令仅能用于frontend 和listen 区段,用于定义一个或几个套接字

:可选选项,其可以为主机名、IPv4地址、IPv6地址或*; 省略此选项、将其指定为 * 或者0.0.0.0时,将监听当前系统的所有IPv4地址;<>

转载:http://www.ttlsa.com/linux/haproxy-study-tutorial/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值