HAProxy

HAProxy:只是http协议的反向代理,不提供缓存功能;但额外支持对tcp层基于tcp通信的应用做LB

Note:
代理的作用:web缓存(加速)、反向代理、内容路由(根据流量及内容类型将请求转发至特定服务器)、转发器 缓存的作用:   减少冗余内容传输   节省带宽、缓减网络瓶颈;   降低了对原始服务器的请求压力   降低了传输延迟

HAProxy安装及简单应用

haproxy安装

# yum info haproxy
# yum install haproxy
# rpm -ql haproxy
# cd /etc/haproxy
# vim haproxy.cfg

haproxy简单应用

首先,我们准备三台主机

192.168.2.20,node1.ckh.com,node1
192.168.2.40,node2.ckh.com,node2
192.168.2.50,node4.ckh.com,node4

将node1和node2作为后端服务器

# yum install httpd -y
# echo "node1 web server" > /var/www/html/index.html  //另一台主机类似的操作
简单修改下,让haproxy跑起来:
frontend  main *:80  //访问端口我们一般用80
    default_backend     websrvs  //后端节点名字

#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend websrvs
    balance     roundrobin
    server      web1 192.168.2.20:80 check  //websrvs有这两个主机
    server      web2 192.168.2.40:80 check  //这里的check表示要做健康状态检测

浏览器访问:http://192.168.2.50,页面显示正常,而且是负载均衡的效果。

开启日志功能:

# vim /etc/rsyslog.cfg
$ModLoad imudp        //开启这两项
$UDPServerRun 514  //rsyslog是监听在514/udp
local2.*    /var/log/haproxy.log
重启rsyslog: systemctl restart rsyslog.service

 

  

 

 



 

 

 

 

其他配置可参照下面文档:转自www.magedu.com

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

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

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

RDP协议:Remote Desktop Protocol,远程桌面协议
     windows: 3389

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

HAProxy目前主要有两个版本:最新版本是1.5系列,集成了1.4版本和1.3版本的优点

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 fait 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.11默认使用的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的性能

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
1、配置文件格式
1.1 HAProxy的配置分类:

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

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

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

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

global
  daemon
  maxconn 25600

defaults
  node http
  timeout connect 5000ms
  timeout client 50000ms
  timeout server 50000ms

frontend http-in
  bind *:80
  default_backend servers

backend servers
  server 127.0.01:8080 maxconn 32

1.4 全局配置

"global"配置中的参数为进程级别的参数,且通常与其运行的OS相关。
进程管理及安全相关的参数

- chroot <jail dir>  //修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作,可以提升haproxy的安全级别,不过需要注意的是要确保指定的目录为空目录且任何用户均不能有写权限;
- daemod  //让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  //设定每个进程所能够打开的最大文件描述符数目,默认情况下其会自动进行计数,因此不推荐修改此选项;
- user  //同uid,但使用的是用户名;
- stats
- node  //定义当前节点的名称,用于HA场景中多haproxy进程共享同一个IP地址时;
- description  //当前实例的描述信息;

性能调整相关的参数

- maxconn <number>  //设定每个haproxy进程所接受的最大并发连接数,其等同于命令行选项”-n“: "ulmit -n"自动计算的结果证实参照此参数设定的;
- maxpipes <number>  //haproxy使用pipe完成基于内核的tcp报文重组,此选项则用于设定每进程所允许使用的最大pipe个数;每个pipe会打开两个文件描述符,因此,"ulimit -n"自动计算时会根据需要调大此值;默认为maxconn/4,其通常会显得过大;
- noepoll  //在Linux系统上禁用epoll机制;
- nokqueue  //在BSD系统上禁用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
- thne.sndbuf.server 

Debug相关的参数

- debug
- quiet

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

- defaults <name>
- frontend <name>
- backend <name>
- listen <name>

"defaults"段用于为所有其他配置段提供默认参数,这配置默认配置参数可由下一个”defaults“所重新设定。
”frontend段用于定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接。
”backend“段用于定义一系列”后端“服务器,代理会将对应客户端的请求转发至这些服务器。
”listen“段通过关联”前端“和”后端“定义了一个完整的代理,通常只对TCP流量有用。
所有代理的名称只能使用大写字母、小写字母、数字、-(中线)、_(下划线)、.(点号)和:(冒号)。此外,ACL名称会区分字母大小写。

 

上一篇:haproxy实现负载均衡集群


下一篇:linux-“线程将所有bt全部应用满”在GDB中为空白