首页 > 代码库 > Haproxy 安装与配置

Haproxy 安装与配置

一 Haproxy简介

一、HAProxy简介


HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。

————百度百科

Big O: 评判数据结构复杂度
    O(1): 
    O(logN): 红黑树
    O(n)
    O(n^2)
    O(2^n)


haproxy: 弹性二叉树
    数据结构:

Remote Desktop Protocol
    Windows: 3389


HAProxy是免费、极速且可靠的用于为TCP和基于HTTP应用程序提供高可用、负载均衡和代理服务的解决方案,尤其适用于高负载且需要持久连接或7层处理机制的web站点。

HAProxy目前主要有两个版本:

1.4——提供较好的弹性:衍生于1.2版本,并提供了额外的新特性,其中大多数是期待已久的。
  客户端侧的长连接(client-side keep-alive)
  TCP加速(TCP speedups)
  响应池(response buffering)
  RDP协议
  基于源的粘性(source-based stickiness)
  更好的统计数据接口(a much better stats interfaces)
  更详细的健康状态检测机制(more verbose health checks)
  基于流量的健康评估机制(traffic-based health)
  支持HTTP认证
  服务器管理命令行接口(server management from the CLI)
  基于ACL的持久性(ACL-based persistence)
  日志分析器

1.3——内容交换和超强负载:衍生于1.2版本,并提供了额外的新特性。
  内容交换(content switching):基于任何请求标准挑选服务器池;
  ACL:编写内容交换规则;
  负载均衡算法(load-balancing algorithms):更多的算法支持;
  内容探测(content inspection):阻止非授权协议;
  透明代理(transparent proxy):在Linux系统上允许使用客户端IP直接连入服务器;
  内核TCP拼接(kernel TCP splicing):无copy方式在客户端和服务端之间转发数据以实现数G级别的数据速率;
  分层设计(layered design):分别实现套接字、TCP、HTTP处理以提供更好的健壮性、更快的处理机制及便捷的演进能力;
  快速、公平调度器(fast and fair scheduler):为某些任务指定优先级可实现理好的QoS;
  会话速率限制(session rate limiting):适用于托管环境;


支持的平台及OS:
  x86、x86_64、Alpha、SPARC、MIPS及PARISC平台上的Linux 2.4;
  x86、x86_64、ARM (ixp425)及PPC64平台上的Linux2.6;
  UltraSPARC 2和3上的Sloaris 8/9;
  Opteron和UltraSPARC平台上的Solaris 10;
  x86平台上的FreeBSD 4.1-8;
  i386, amd64, macppc, alpha, sparc64和VAX平台上的OpenBSD 3.1-current;

若要获得最高性能,需要在Linux 2.6或打了epoll补丁的Linux 2.4上运行haproxy 1.2.5以上的版本。haproxy 1.1l默认使用的polling系统为select(),其处理的文件数达数千个时性能便会急剧下降。1.2和1.3版本默认的为poll(),在有些操作系统上可会也会有性能方面的问题,但在Solaris上表现相当不错。HAProxy 1.3在Linux 2.6及打了epoll补丁的Linux 2.4上默认使用epoll,在FreeBSD上使用kqueue,这两种机制在任何负载上都能提供恒定的性能表现。

在较新版本的Linux 2.6(>=2.6.27.19)上,HAProxy还能够使用splice()系统调用在接口间无复制地转发任何数据,这甚至可以达到10Gbps的性能。

基于以上事实,在x86或x86_64平台上,要获取最好性能的负载均衡器,建议按顺序考虑以下方案。
  Linux 2.6.32及之后版本上运行HAProxy 1.4;
  打了epoll补丁的Linux 2.4上运行HAProxy 1.4;
  FreeBSD上运行HAProxy 1.4;
  Solaris 10上运行HAProxy 1.4;


性能

HAProxy借助于OS上几种常见的技术来实现性能的最大化。
  单进程、事件驱动模型显著降低了上下文切换的开销及内存占用。
  O(1)事件检查器(event checker)允许其在高并发连接中对任何连接的任何事件实现即时探测。
  在任何可用的情况下,单缓冲(single buffering)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽;
  借助于Linux 2.6 (>= 2.6.27.19)上的splice()系统调用,HAProxy可以实现零复制转发(Zero-copy forwarding),在Linux 3.5及以上的OS中还可以实现零复制启动(zero-starting);
   内存分配器在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长;
  树型存储:侧重于使用作者多年前开发的弹性二叉树,实现了以O(log(N))的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列;
  优化的HTTP首部分析:优化的首部分析功能避免了在HTTP首部分析过程中重读任何内存区域;
  精心地降低了昂贵的系统调用,大部分工作都在用户空间完成,如时间读取、缓冲聚合及文件描述符的启用和禁用等;

所有的这些细微之处的优化实现了在中等规模负载之上依然有着相当低的CPU负载,甚至于在非常高的负载场景中,5%的用户空间占用率和95%的系统空间占用率也是非常普遍的现象,这意味着HAProxy进程消耗比系统空间消耗低20倍以上。因此,对OS进行性能调优是非常重要的。即使用户空间的占用率提高一倍,其CPU占用率也仅为10%,这也解释了为何7层处理对性能影响有限这一现象。由此,在高端系统上HAProxy的7层性能可轻易超过硬件负载均衡设备。

在生产环境中,在7层处理上使用HAProxy作为昂贵的高端硬件负载均衡设备故障故障时的紧急解决方案也时长可见。硬件负载均衡设备在“报文”级别处理请求,这在支持跨报文请求(request across multiple packets)有着较高的难度,并且它们不缓冲任何数据,因此有着较长的响应时间。对应地,软件负载均衡设备使用TCP缓冲,可建立极长的请求,且有着较大的响应时间。

可以从三个因素来评估负载均衡器的性能:
  会话率
  会话并发能力
  数据率

二. Haproxy 安装配置

haproxy 配置主要分为两大部分,4个虚拟节点
[global]:全局配置段,进程级别与进程管理及安全相关及性能调整相关的参数。
[proxy]
  - defaults:配置默认参数,这些参数可以被用到frontend,backend,Listen段
  - frontend:接受请求的前端虚拟节点,定义一些和客户端请求相关的参数,可以使用use_backend调用backend节点集群
  - backend:后端服务集群的配置,定义一些和后端真正提供服务的主机相关的一些参数
  - listen:frontend和backend的结合体,不能使用use_backend 调用backend节点集群

1. 下载并编译安装
  shell>wget -c http://www.haproxy.org/download/1.6/src/haproxy-1.6.9.tar.gz -P /usr/local/src/
  shell>cd /usr/local/src
  shell>tar xfv haproxy-1.6.9.tar.gz
  
  shell>mkdir /usr/local/haproxy
  shell>cd haproxy-1.6.9
  shell>vim README
  #执行make的时候参数介绍:TARGET,ARCH,PREFIX
   TARGET:内核版本控制

    - linux22 for Linux 2.2
    - linux24 for Linux 2.4 and above (default)
    - linux24e for Linux 2.4 with support for a working epoll (> 0.21)
    - linux26 for Linux 2.6 and above
    - linux2628 for Linux 2.6.28, 3.x, and above (enables splice and tproxy)
    

    ARCH:cpu架构

    i386,i486,i586,i686,x86_64

  shell>make TARGET=linux26 ARCH=x86_x64 PREFIX=/usr/local/haproxy   # 需要根据自己的操作系统环境自行修改
  shell>make install PREFIX=/usr/local/haproxy

2. 提供配置文件
  默认源码安装haproxy不提供配置文件,但在其解压目录examples下会提供相关haproxy的实例配置,但有的版本的源码haproxy实例配置不是很全面,最笨的
  办法是使用yum安装rpm包格式的haproxy,然后复制其配置文件件作为参考,然后再将其卸载。此处提供一个简单框架的haproxy配置模板实例,详细的配置请参考官网
  http://cbonte.github.io/haproxy-dconv/1.6/configuration.html

  shell>cp -ra /usr/local/src/haproxy-1.6.9/examples /usr/local/haproxy ## 复制解压目录下的examples目录到安装目录下,以后可能会用到
  shell>mkdir /usr/local/haproxy/conf
  
  haproxy配置文件及简单参数说明:
  
########################[全局配置]##########################
global
    # 日志输出配置,所有日志都记录在本机,通过local3输出
    log 127.0.0.1     local3 

    # 设定每个haproxy进程所接受的最大并发连接数,需要参考ulimit -n
    maxconn 4096
    
    # ulimit 文件描述符数量
    #ulimit-n 819200

    #chroot /usr/share/haproxy

    # 运行haproxy用户
    user haproxy
    
    # 运行haproxy用户组
    group haproxy

    # 以后台形式运行haproxy
    daemon

    # 设置进程数量
    nbproc 1

    # 设置haproxy进程的pid文件路径
    pidfile /usr/local/haproxy/var/haproxy.pid
    
    # haproxy 调试级别,建议只在开启单进程的时候调试
    #debug
    #quiet

####################[默认配置]################################
defaults
    # 日志使用全局配置
    log    global

    # haproxy工作模式{tcp|http|health},tcp4层,http7层,health只返回OK
    mode    http

    # 日志类别,采用httplog
    option    httplog
    
    # 不记录请求报文包体数据为空的请求到日志,比如健康检查,减少写磁盘IO
    option    dontlognull
    
    # 三次连接失败就认为服务器不可达,也可以通过后面设置
    retries    3
    
    # 允许在发往服务器的请求首部中插入“X-Forwarded-For”首部,用于后端主机记录真实请求的客户端ip
    option    forwardfor  except 127.0.0.0/8

    # 每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能通过模拟实现
    option    httpclose
    
    # 当server id对应的服务器挂掉后,强制定向到其他健康的后端服务器,以后将不支持
    option    redispatch

    # 当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
    option    abortonclose

    # 默认的最大连接数
    maxconn    4096

    # 连接超时
    timeout connect    5000ms
    
    # 客户端请求超时
    timeout    client  30000ms
    
    # 服务端响应超时
    timeout server  30000ms

    # 心跳检测超时
    timeout check 2000
    
    # 持久连接超时时间
    timeout http-keep-alive  10s
    
    # http请求超时时间
    timeout http-request 10s

    # 默认队列超时时间
    timeout queue    1m

    # 设置默认负载均衡算法{roundrobin|source|leastconn...}
    balance    roundrobin

###########################[统计页面]############################
listen admin_stats
    # 设置统计页面监听的套接字,listen虚拟节点为frontend和backend的专有通道
    bind 0.0.0.0:10800
    
    # 设置统计页面工作模式
    mode http

    # 启用状态页面功能
    stats enable

    # 采用http日志格式
    option    httplog
    
    # 是否开启错误日志并记录
    #log 127.0.0.1 local err

    # 设置访问统计页面的最大连接数
    maxconn    10
    
    # 设置统计页面的自动刷新时间
    stats refresh    30s
    
    # 访问统计页面的url
    stats    uri   /stats

    # 登录统计页面时的提示信息
    stats    realm  DongPing\ Haproxy
    
    # 设置统计页面的用户认证,可以设置多个用户名
    stats auth admin:admin

    # 隐藏统计页面上Haproxy的版本信息
    stats    hide-version
    
    # 设置haproxy管理页面可以执行一些特权动作,比如下线后端主机
    stats    admin   if  TRUE

##########################[设置haproxy 错误页面]##########################

errorfile 403   /usr/local/haproxy/errorfiles/403.http
errorfile 500   /usr/local/haproxy/errorfiles/500.http
errorfile 502   /usr/local/haproxy/errorfiles/502.http
errorfile 503   /usr/local/haproxy/errorfiles/503.http
errorfile 504   /usr/local/haproxy/errorfiles/504.http
 
#########################[Frontend 前端配置]##############################
frontend http-proxy
    # 定义使用的套接字
    bind    *:80

    # 抓取请求报文首部字段为Host,Referer的值到haproxy日志中
    capture request header Host len 20
    capture request header Referer len 60
    capture request header User-agent len 60
    capture request header X-Forward-For len 60
    
    # 定义一个acl规则,匹配以/{static|images|javascript|stylesheets}开头的静态资源
    acl url_static    path_beg -i /static /images /javascript    /stylesheets

    # 定义一个acl规则,匹配以\.{jpg|jpeg|gif|png|css|js}结尾的静态资源
    acl url_static    path_end -i .jpg .jpeg .gif .png .css .js

    # 如果被url_static这条acl规则匹配由后端集群static_servers进行分发 
    use_backend static_servers if url_static

    # 定义请求不匹配所有规则时默认转发到的后端主机
    default_backend    dynamic_servers

##########################[backend 后端配置]###########################################
# 定义一组动态资源主机
backend dynamic_servers
    # 定义haproxy工作模式
    mode    http
    
    # 定义负载均衡算法
    balance roundrobin

    # 健康检查
    option    httpchk    /check.jsp HTTP/1.0

    # 使用基于cookie粘性的负载均衡算法
    cookie    SERVERID insert indirect nocache

    # 定义连接后端主机的一些策略
    # server name ip:port  /表示后端一台主机,name必须给出
    # cookie name     /设置插入的cookie信息
    # check inter 2000   /使用check关键字表示对后端主机检测,inter 2000表示检测时间间隔为2s
    # weight /表示权重
    # rise  /表示检测两次正确,则认为服务器可用(服务从故障到正常)
    # fall /表示检测三次失败,则认为服务器不可用(服务器从正常到故障)
    # backup /表示备用主机

    server webapp_01 192.168.3.84:8080 cookie srv1 weight 2 check inter 2000 rise 2 fall 3
    server webapp_02 192.168.3.84:8081 cookie srv2 weight 2 check inter 2000 rise 2 fall 3

    # 定义一个sorryserver,当所有后端主机不可访问时,请求调度到此主机上
    server webapp_3 192.168.3.83:8080  backup check inter 2000 rise 2 fall 3 

# 定义一组静态资源主机
backend static_servers
    mode http
    option httpchk /check.html
    balance roundrobin
    server static_01 192.168.3.84:80 check inter 2000 fall 3
    server static_02 192.168.3.84:81 check inter 2000 fall 3

#######################[tcp配置]#########################################
listen  mysql
    bind 0.0.0.0:3306
    balance leastconn
    mode tcp
    log global
    option tcplog
    maxconn 4096
    #log 127.0.0.1 local0 debug
    server dbsrv_01 192.168.3.84:3306 weight 1 check port 3306 inter 2000 rise 1 fall 2 maxconn 300
    server dbsrv_02 192.168.3.84:3307 weight 1 check port 3307 inter 2000 rise 1 fall 2 maxconn 300
    

  说明:复制上面内容,并根据具体环境修改后保存到conf下,并命名为haproxy.cfg

  3.提供错误页面,如果不把错误页面放到配置文件定义的目录里,启动haproxy将报错

   shell>cd /usr/local/haproxy

   shell>cp -ra examples/errorfiles .

 

  4.提供运行haproxy进程的用户和组

   shell>userdd -r -s /sbin/nologin haproxy

  

三.提供haproxy日志,默认haproxy没有提供自己的日志文件,通过配置可以把haproxy日志通过rsyslog输出到指定文件

  1.需要在haproxy配置文件添加日志输出,只需添加以下命令即可 vim conf/haproxy.cfg

  技术分享

  2.修改rsyslog相关配置,使其能接受haproxy产生的日志

  # 查看下rsyslog主配置

  图一

  技术分享

  图二

  技术分享

  图三

  技术分享

  从图一可以看到通过两个变量就可以开启udp日志接受

  从图二可以看到name.none的意思为不记录来自name的日志到指定文件

  从图三可以看到主配置文件允许在rsyslog.d 创建配置文件

  所以可以在/etc/rsyslog.d/ 创建haproxy自己的配置,方便以后的修改和管理

  shell>vim /etc/rsyslog.d/haproxy.conf

  1).复制图一中(/etc/rsyslog.conf)的三行到 /etc/rsyslog.d/haproxy.conf,修改如下

  技术分享

  注意:日志输出的文件路径很重要,一定要让运行haproxy进程的用户对此文件有写权限,否则日志不会生效

  2).修改 SYSLOGD_OPTIONS 参数的值

  shell>vim /etc/sysconfig/rsyslog

  #SYSLOGD_OPTIONS="-c 5"  # 原来的配置注销

  # -c 2 使用兼容模式,默认是-c 5

  # -r 开启远程日志
  # -m 0 标记时间戳。单位是分钟,为0时,表示禁用该功能
  SYSLOGD_OPTIONS="-c 2 -r -m 0"  # 修改后的配置

  3).修改rsyslog的主配置文件使其不记录haproxy的日志到/var/log/messages,如果不修改会记录两份一样的haproxy日志

  shell>vim /etc/rsyslog.conf

  技术分享

  只需在箭头处追加haproxy配置文件中定义的日志来源为local3.none(具体为local几需要根据haproxy配置的相对应)

  4).重启日志服务,使其重读配置文件

  shell>/etc/init.d/rsyslog restart

 

四.启动haproxy

  shell>/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy

  注意:假如没有配置后端主机,haproxy启动的时候会警告,但不影响haproxy使用

  说明 重启haproxy命令

  shell>/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy -st `pidof haproxy`

五.测试

  shell>curl -I localhost:10800

  shell>netstat -lntup | grep -i "haproxy"

  技术分享

 

六.日志

  shell>tailf /var/log/haproxy.log

  1.使用capture request header 命令抓取后的haproxy输出日志

   技术分享

   说明:{}中的字符串即为capture后的结果,使用|分开,请求报文首部没有此抓取的首部则留空

  2.没有使用capture request head 命令的haproxy输出日志

   注释掉capture

    技术分享

    shell>/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg -c  #语法检测

   shell>/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg -st `pidof haproxy`

    shell>curl -I localhost:80

   技术分享

 

七.监控统计管理页面,haproxy的统计页可以实现强大的管理功能,最常用的就是软下线后端主机

  访问 http://192.168.3.83:10080/stats

技术分享

 至此,haproxy简单的安装部署就先介绍到这里。后续具体使用请参考接下来的博客,小饿小困喝点香飘飘奶茶~~

Haproxy 安装与配置