热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Haproxy均衡负载部署和配置文件详解

HAproxy均衡负载部署和配置文件详解HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。根据官方数据,其

HAproxy均衡负载部署和配置文件详解

HAProxy提供高可用性负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。根据官方数据,其最高极限支持10G的并发。 

HAProxy特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

技术分享

其支持从4层至7层的网络交换,即覆盖所有的TCP协议。就是说,Haproxy 甚至还支持 Mysql 的均衡负载。。

如果说在功能上,能以proxy反向代理方式实现 WEB均衡负载,这样的产品有很多。包括 Nginx,ApacheProxy,lighttpd,Cheroke 等。 

但要明确一点的,Haproxy 并不是 Http 服务器。以上提到所有带反向代理均衡负载的产品,都清一色是 WEB 服务器。简单说,就是他们能自个儿提供静态(html,jpg,gif..)或动态(php,cgi..)文件的传输以及处理。而Haproxy 仅仅,而且专门是一款的用于均衡负载的应用代理。其自身并不能提供http服务。 

技术分享

但其配置简单,拥有非常不错的服务器健康检查功能还有专门的系统状态监控页面,当其代理的后端服务器出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入。自1.3版本开始还引入了frontend,backend,frontend根据任意HTTP请求头内容做规则匹配,然后把请求定向到相关的backend。 

另外, 版本1.3 是处于活跃开发阶段的版本, 它支持如下新特性:

l         内容交换 : 可以根据请求(request)的任何一部分 来选择一组服务器, 比如请求的 URI , Host头(header) , COOKIE , 以及其他任何东西. 当然,对那些静态分离的站点来说,对此特性还有更多的需求。 

l         全透明代理 : 可以用 客户端IP地址 或者任何其他地址来连接后端服务器. 这个特性仅在Linux 2.4/2.6内核打了cttproxy 补丁后才可以使用. 这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。
 

l         基于树的更快的调度器 : 1.2.16以上的版本要求所有的超时都设成同样的值以支持数以万计的全速连接. 这个特性已经移植到1.2.17. 

l         内核TCP拼接 : 避免了内核到用户然后用户到内核端的数据拷贝, 提高了吞吐量同时又降低了CPU使用率 . Haproxy 1.3支持Linux L7SW 以满足在商用硬件上数Gbps 的吞吐的需求。 

l         连接拒绝 : 因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。 这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救了很多站点。 

l         细微的头部处理 : 使得编写基于header的规则更为简单,同时可以处理URI的某部分。 

l         快而可靠的头部处理 : 使用完全RFC2616 兼容的完整性检查对一般的请求全部进行分析和索引仅仅需要不到2ms 的时间。 

l         模块化设计 : 允许更多人加入进此项目,调试也非常简单. poller已经分离, 已经使得它们的开发简单了很多. HTTP已经从TCP分离出来了,这样增加新的七层特性变得非常简单. 其他子系统也会很快实现模块化 

l         投机I/O 处理 : 在一个套接字就绪前就尝试从它读取数据。poller仅推测哪个可能就绪哪个没有,尝试猜测,并且如果成功,一些开销很大的系统调用就可以省去了。如果失败,就会调用这些系统调用。已知的使用Linux epoll()已经净提升起码10%了。 

l         ACLs : 使用任意规则的任意组合作为某动作的执行条件。
 

l         TCP 协议检查 : 结合ACL来对请求的任意部分进行检查,然后再进行转发。这就可以执行协议验证而不是盲目的进行转发。比如说允许SSL但拒绝SSH。
 

l         更多的负载均衡算法 : 现在,动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现。其他算法比如Weighted Measured Response Time也很快会实现。 

安装:

        1、从官网 http://haproxy.1wt.eu/#down 下载最新版本,如  haproxy-1.4.16.tar.gz   
        2、解压缩, # tar zcvf haproxy-1.4.16.tar.gz  建议移动到工作目录  /usr/local/haproxy/ 下,否则后续安装时还要用PREFIX=/usr/local/haprpxy指定安装路径
        3、运行 make install 即完成安装
                程序为 /usr/local/haproxy  或  /usr/local/sbin/haproxy, 运行程序 haproxy,显示版本信息即说明安装成功
                文档在/usr/local/doc/haproxy下
                Man:/usr/local/share/man/man1

配置:    # vi haproxy.cfg

配置内容如下:

global                                #全局设置
        log 127.0.0.1   local0 #日志输出配置,所有日志都记录在本机,通过local0输出
        #log 127.0.0.1  local1 notice
        #log loghost    local0 info

       ulimit-n 82000       #设置每个进程的可用的最大文件描述符
        maxconn 4096        #最大连接数
        chroot /usr/local/haproxy    #改变当前工作目录
        uid 99                       #所属运行的用户uid
        gid 99                       #所属运行的用户组
        daemon                   #以后台形式运行ha-proxy
        nbproc 3                 #启动2个ha-proxy实例

        pidfile /usr/local/haproxy/run/haproxy.pid     #pid文件位置
        debug        #调试模式,输出启动信息到标准输出
        #quiet     #安静模式,启动时无输出

defaults                       #默认设置
        log     global
        log     127.0.0.1       local3        #日志文件的输出定向
        mode    http                            #所处理的类别,默认采用http模式,可配置成tcp作4层消息转发
        option  httplog                        #日志类别,采用httplog
        option  httpclose   #每次请求完毕后主动关闭http通道,ha-proxy不支持keep-alive,只能模拟这种模式的实现

        option  dontlognull
        option  forwardfor  #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip

        option  redispatch
        retries 2                      #3次连接失败就认为服务器不可用,主要通过后面的check检查          

        maxconn 2000         #最大连接数
        balance roundrobin                     #负载均衡算法
        stats   uri     /haproxy-stats        #haproxy 监控页面的访问地址,可通过http://ip/haproxy-stats访问
        contimeout      5000                     #连接超时时间       
        clitimeout      50000                  #客户端连接超时时间
        srvtimeout      50000              #服务器端连接超时时间

listen app-balancer 0.0.0.0:80
        mode http
      #  log 127.0.0.1 local3
        #COOKIE ServerID insert nocache
        COOKIE ServerID prefix
        COOKIE JSESSIONID prefix

        capture request header COOKIE len 200
        capture request header X-Forwarded-For len 15
        capture request header Host len 15
        capture request header Referrer len 15

        appsession JSESSIONID len 52 timeout 1080000
        balance roundrobin
        option httpchk GET /ok.jsp HTTP/1.0   #健康检查
        server app_1 192.168.0.243:8080 COOKIE app1 minconn 100 maxconn 40960 check inter 5000 rise 2 fall 5 weight 2
        server app_2 192.168.0.242:8080 COOKIE app2 minconn 100 maxconn 40960 check inter 2000 rise 2 fall 5 weight 2
        server app_4 192.168.0.245:8080 COOKIE app2 minconn 100 maxconn 40960 check inter 2000 rise 2 fall 5 weight 1
        #option forwardfor except 192.168.0.159
        option forwardfor
        stats enable
        stats uri /haproxy-stat
        stats realm "test_123 monitor"
        stats auth admin:admin

运行:

启动服务:
# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg

重启服务:
# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg -st `cat /usr/local/haproxy/logs/haproxy.pid`  (没有换行)

停止服务:
# killall haproxy

当然,为了方便系统在开机时加载,还可以创建启动脚本:
# vim /etc/rc.d/init.d/haproxy  内容如下:

#! /bin/sh
set -e
 
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/haproxy/sbin
PROGDIR=/usr/local/haproxy
PROGNAME=haproxy
DAEMON=$PROGDIR/sbin/$PROGNAME
COnFIG=$PROGDIR/conf/$PROGNAME.conf
PIDFILE=$PROGDIR/run/$PROGNAME.pid
DESC="HAProxy daemon"
SCRIPTNAME=/etc/init.d/$PROGNAME
 
# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0
 
start()
{
        echo -n "Starting $DESC: $PROGNAME"
        $DAEMON -f $CONFIG
        echo "."
}
 
stop()
{
        echo -n "Stopping $DESC: $PROGNAME"
        haproxy_pid=cat $PIDFILE
        kill $haproxy_pid
        echo "."
}
 
restart()
{
        echo -n "Restarting $DESC: $PROGNAME"
        $DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE)
        echo "."
}
 
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        restart
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
        exit 1
        ;;
esac 
exit 0

保存后赐予可执行权限
# chmod +x /etc/rc.d/init.d/haproxy

就可以使用 service haproxy start|stop|restart 来控制服务的启动停止跟重启。
并通过以下命令加载到开机服务启动列表
# chkconfig --add haproxy

配置日志:
# vim /etc/syslog.conf

在最下边增加
local3.*         /var/log/haproxy.log
local0.*         /var/log/haproxy.log


重启核心日志服务使配置起效
# service syslog restart

然后就可查看日志了
# tail –f /var/log/harpoxy.log

Aug 22 15:32:06 localhost haproxy[64136]: Proxy www started. 
Aug 22 15:32:06 localhost haproxy[64136]: Proxy cherokee started. 
Aug 22 15:32:06 localhost haproxy[64136]: Proxy wap started. 
Aug 22 15:32:06 localhost haproxy[64136]: Proxy pic started. 
Aug 22 15:32:06 localhost haproxy[64136]: Proxy img started. 
Aug 22 15:32:06 localhost haproxy[64136]: Proxy public started. 
Aug 22 15:32:06 localhost haproxy[64136]: Proxy public started. 
Aug 22 15:32:59 localhost haproxy[64137]: 219.142.128.30:6416 [22/Aug/2009:15:32:59.754] public stats/ 0/-1/-1/-1/0 200 17329 - - PR-- 0/0/0/0/0 0/0 "GET /?stats HTTP/1.1" 
Aug 22 15:32:59 localhost haproxy[64137]: 219.142.128.30:6416 [22/Aug/2009:15:32:59.754] public stats/ 0/-1/-1/-1/0 200 17329 - - PR-- 0/0/0/0/0 0/0 "GET /?stats HTTP/1.1"

应用举例

WEB 均衡负载虚拟主机 

重新打开配置文件haproxy.cfg,留意最下部分的均衡主机选项
listen  localhost 0.0.0.0:1080                   #运行的端口及主机名
   mode    http
   option  httpchk GET /index.htm              #用于健康检测的后端页面
   server  s1 127.0.0.1:3121 weight 3 check    #后端的主机 IP &权衡
   server  s2 127.0.0.1:3122 weight 3 check    #后端的主机 IP &权衡

在实验中,我们的的后端是 squid 分开了2个端口在同一台服务器上。
以其中一项为例:

server  s1 127.0.0.1:3121 weight 3 check

s1             是可自己定义的服务器别名
127.0.0.1:3121   服务器的IP地址以及端口号
weight 3        所能分配到请求的高低权衡,数字越大分配到的请求数就越高
check          接受 haproxy 的定时检查,以确定后端服务器的健康情况。

如需配置虚拟主机,相当简单,紧需修改 localhost 为你虚拟主机的的域名,加到haproxy配置中, 再为其分配后端服务器的参数即可。

 例:

listen  www.x1.com 0.0.0.0:1080                    #运行的端口及主机名
   mode    http
   option  httpchk GET /index.htm              #用于健康检测的后端页面
   server  s1 127.0.0.1:3121 weight 3 check  #后端的主机 IP &权衡
   server  s2 127.0.0.1:3122 weight 3 check  #后端的主机 IP &权衡

listen  www.x2.com 0.0.0.0:1080                     #运行的端口及主机名
   mode    http
   option  httpchk GET /index.htm                     #用于健康检测的后端页面
   server  s1 127.0.0.1:3121 weight 3 check       #后端的主机 IP &权衡
   server  s2 127.0.0.1:3122 weight 3 check       #后端的主机 IP &权衡

保存配置后重新加载,即可生效,刷新管理页面也可看到新的虚拟主机。 

性能对比

在此,我们用最近最火红的http 兼前端WEB均衡负载服务器Nginx 与Haproxy 做个简单的性能对比。 

测试环境:

CPU:Xeon2.8G X2 
RAM:4G
OS:RedHat As5.3 X64

工具:apache ab
参数:ab -i -c 500 -n 100000  (500并发,1W请求)
最终服务端:2个squid 需实现均衡负载

成绩如下:

####### Nginx + haproxy :  (由Nginx通过反向代理发送请求至haproxy, 并由其进行均衡负载)

Concurrency Level:      500
Time taken for tests:   53.758 seconds
Complete requests:      100000
Failed requests:        0
Write errors:           0
Total transferred:      38600386 bytes
HTML transferred:       0 bytes

Requests per second:    1860.19 [#/sec] (mean)
Time per request:       268.790 [ms] (mean)
Time per request:       0.538 [ms] (mean, across all concurrent requests)
Transfer rate:          701.21 [Kbytes/sec] received
####### haproxy :  (单独由haproxy进行均衡负载)
Concurrency Level:      500
Time taken for tests:   32.562 seconds
Complete requests:      100000
Failed requests:        0
Write errors:           0
Total transferred:      36606588 bytes
HTML transferred:       0 bytes
Requests per second:    3071.02 [#/sec] (mean)
Time per request:       162.812 [ms] (mean)
Time per request:       0.326 [ms] (mean, across all concurrent requests)
Transfer rate:          1097.85 [Kbytes/sec] received
####### nginx : (单独由nginx进行均衡负载)
Concurrency Level:      500
Time taken for tests:   36.539 seconds
Complete requests:      100000
Failed requests:        0
Write errors:           0
Total transferred:      38600000 bytes
HTML transferred:       0 bytes
Requests per second:    2736.82 [#/sec] (mean)
Time per request:       182.694 [ms] (mean)
Time per request:       0.365 [ms] (mean, across all concurrent requests)
Transfer rate:          1031.65 [Kbytes/sec] received
 
反复测试,得出其结果:
Haproxy 单独进行均衡负载的性能最强,超过了Nginx。
然而 Nginx + Haproxy 的搭配性能最弱,应该是跟通过了2层反向代理有关。
所以想用 Haproxy 替代 Nginx 所自带的均衡负载功能将会令性能打折。
但虽然如此 Haproxy 对均衡负载功能远比 Nginx 成熟,例如session粘贴,COOKIEs 引导等都是 nginx 所没有的。
可根据需要而选择搭配。
相关启动参数介绍

相关启动参数介绍 

   #./haproxy –help //haproxy相关命令参数介绍.

   haproxy  -f  <配置文件>  

[-n 最大并发连接总数] [-N 每个侦听的最大并发数] [-d] [-D] [-q] [-V] [-c] [-p ] [-s] [-l] [-dk]

       [-ds] [-de] [-dp] [-db] [-m <内存限制M>] [{-sf|-st} pidlist...]

       -d     前台,debug模式 

       -D     daemon模式启动 

       -q     安静模式,不输出信息

       -V     详细模式

       -c     对配置文件进行语法检查

       -s     显示统计数据

       -l     显示详细统计数据

       -dk    不使用kqueue

       -ds    不使用speculative epoll

       -de    不使用epoll

       -dp    不使用poll

       -db    禁用后台模式,程序跑在前台

       -sf       程序启动后向pidlist里的进程发送FINISH信号,这个参数放在命令行的最后

       -st       程序启动后向pidlist里的进程发送TERMINATE信号,这个参数放在命令行的最后

附:一个比较简单的配置文件内容

global  
        log 127.0.0.1   local0
        maxconn 4096
        chroot /usr/local/haproxy
        uid 99
        gid 99
        daemon
        nbproc 1
        pidfile /usr/local/haproxy/haproxy.pid          
        debug #quiet
defaults  
        log     127.0.0.1       local3
        mode    http
        option httplog
        option httpclose
        option dontlognull
        option forwardfor
        option redispatch
        retries 2
        maxconn 2000
        balance roundrobin
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000 
  
listen webinfo :1080  
       mode http  
       balance roundrobin  
       option httpclose  
       option forwardfor  
server phpinfo1 192.168.18.2:10000 check weight 1 minconn 1 maxconn 3 check inter 40000  
server phpinfo2 127.0.0.1:80 check weight 1 minconn 1 maxconn 3 check inter 40000  
  
listen webmb :1081  
       mode http  
       balance roundrobin  
       option httpclose  
       option forwardfor  
server webmb1 192.168.1.91:10000 weight 1 minconn 1 maxconn 3 check inter 40000  
server webmb2 127.0.0.1:10000 weight 1 minconn 1 maxconn 3 check inter 40000  
  
listen stats :8888  
       mode http  
       transparent  
       stats uri / haproxy-stats  
       stats realm Haproxy \ statistic  
       stats auth admin:admin

Haproxy均衡负载部署和配置文件详解


推荐阅读
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
author-avatar
乐果Meng_501
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有