HAProxy负载均衡

Posted 狼途

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HAProxy负载均衡相关的知识,希望对你有一定的参考价值。

1》HAProxy简介:

      HAProxy是免费,高效,可靠的高可用及负载均衡解决方案,该软件非常适合于处理高负载站点的七层数据请求,HAProxy的工作模式使其可以非常容易且安全地集成            到我们现有的站点架构中,使用类似的代理软件还可以对外屏蔽内部的真实WEB服务器,防止内部服务器遭受外部攻击;HAProxy架构中终端用户通过访问HAProxy代理服务器          获得站点页面,而代理服务器在收到客户端请求后会根据自身规则将数据请求转发给后端真实服务器;为了让同一客户端访问服务器时可以保持会话(同一客户端第二次访问网          站时可以被转发至相同的后端真实服务器),HAProxy有三种解决方案:客户端IP,Cookie以及Session,第一种方式中,HAProxy将客户端IP进行Hash计算并保存,以此确保当         相同的IP访问代理服务器时可以转发到固定的真实服务器上;第二种方式中,HAProxy依靠真实服务器发送给客户端的Cookie信息进行会话保持;第三种方式中,HAProxy将保           存真实服务器的Session及服务器标识,实现会话保持功能;          

      HAProxy软件包可以在其官方网站上下载,下面通过源码方式安装该软件,在使用make命令生成makefile文件时,TARGET=linux2628代表Linux操作系统使用的内核版         本为2.6.28及以上版本;

        #yum   install   gcc

        #tar -xvf haproxy-1.4.24.tar.gz

        #cd  /usr/local/src/haproxy-1.4.24

        #make   TARGET=linux2628

        #make  install

2》配置文件解析:

     HAProxy安装后没有默认的配置文件,需要手动创建,本例将创建/etc/haproxy.cfg配置文件,当启动HAProxy服务时需要使用-f选项指定配置文件路径,HAProxy配置文件主         要包含全局设置段与代理段,global代表全局段,defaults,listen,frontend,backend为代理段;frontend用来匹配客户端请求的域名或URI等,backend定义后端服务器集群,listen         是frontend与backend的集合,有时仅使用listen即可代替frontend与backend,下面给出了一个监听80端口的HTTP代理案例,代理服务器将转发数据请求到单一后台服务器                     127.0.0.1:8000;

           

        HAProxy主配置文件的具体语法格式及描述:

          global:

            chroot<jail  dir>:将工作目录切换至<jail  dir>并执行chroot,该配置可增强HAProxy的安全性,但需要使用超级账户启动HAProxy程序;

            daemon:配置HAProxy以后台进程模式工作;

            uid<number>:配置进程的账户ID,建议设置为HAProxy专用账户;

            gid<number>:配置进程的组ID,建议设置为HAProxy专用组;

            log<address><facility>:配置全局syslog服务器,可以设置两台日志服务器;

            nbproc<number>:指定后台进程的数量;

            pidfile<pidfile>:将进程ID号写入<pidfile>文件;

            ulimit-n<number>:设置每个进程的最大文件描述符数量;

            maxconn<number>:设置每个进程支持的最大并发数;

            tune.bufsize<number>:设置buffer大小,默认值为16384,单位为字节(B);

          代理设置:

            mode:HAProxy工作模式,可选项为:tcp,http,health;

            timeout  check<timeout>:设置检查超时时间;

            contimeout<timeout>:设置连接超时时间;

            balance   roundrobin:默认负载均衡工作模式,轮询;

            bind<address>:<port>:定义一个或过个监听地址或端口;

            stats  auth  admin:admin:设置监控界面的用户名称与密码;

            stats  refresh   <number>:统计页面刷新间隔时间;

            option  httplog:使用http日志;

            cookie<name>:启用基于cookie的保持连接功能;

            option  forwardfor:允许插入X-Forwarded-For数据包头给后端真实服务器,可以让后台服务器获得客户端的真实IP地址;

            option   abortonclose:服务器负载高时,自动关闭队列里处理时间比较长的连接请求;

            option   allbackups:当后端服务器全部宕机时,是否激活所有备用的服务器,默认仅启动第一个备用服务器;

            option  dontlognull:不记录空连接日志,主要用于不记录健康检查日志;

            option  redispatch:在HTTP模式,如果使用cookie的服务器宕机,客户端还好坚持连接它,该选项在后端服务器宕机时强制将请求转发给其他健康主机;

            monitor-uri<uri>:检查<uri>文件是否存在,依次判断主机健康状态;

            monitor-fail if  site_dead:当服务器宕机时,返回503错误代码,需要定义ACL;

            option httpchk<uri>:使用HTTP协议检查服务器健康状态;

            retries<value>:服务器连接失败后的重试次数;

            timeout  client<n>:设置客户端最大超时时间为n,默认单位为毫秒(ms);

            timeout  server<n>:设置服务器端最大超时时间为n,默认单位为毫秒(ms);

            timeout  connect<n>:设置连接最大超时时间为n,默认单位为毫秒(ms);

            default_backend:配置文件中没有use_backend规则时,设置默认后端服务器组,服务器组由backend定义;

            use_backend:当条件满足时,指定后端服务器组,需要设置ACL;

            acl<name><criterion>:定义访问控制列表,配置文件中通过name调用该ACL,常用限制包括:dst(目标地址),dst_port(目标端口),src(源地址),hdr(连接头部                                                                              信息),path_reg(访问路径匹配正则),url(统一资源定位符);

        ACL访问控制列表案例如下:

              

            

3》HAProxy应用案例:

      本例以生产环境为原型,简化网络拓扑后使用HAProxy实现下图所示的高性能代理服务器架构,本例将使用listen定义一个监控端口;使用frontend定义一个前端80端                 口;通过backend分别定义名为inside_servers和external_servers的服务器组;使用default_backend定义默认服务器组为external_servers;定义ACL规则时,如果内网                         (192.168.0.0/24)访问WEB服务,则由inside_servers服务器组提供WEB页面;

       external_servers服务器组中包含web1.example.com和web2.example.com两台服务器,inside_servers服务器组中包含web2.example.com一台服务器;

                              =》Web1  

       Client------->Internet--------->HAProxy--------->router-----=

                              =》Web2

      1>实验环境;

        haproxy.example.com:   eth0:172.31.16.163

                      eth1:192.168.10.10

         web1.example.com:     eth0:192.168.10.20

         web2.example.com:   eth0:192.168.10.30

               client.example.com:      eth0:172.31.16.229

    2>具体配置:

         两台WEB服务器基本采用相同的配置,下面仅以WEB1为例,为了演示HAProxy可以轮询访问后端服务器,我们将两台服务器的页面设置为不同的内容以示区                                别:    

               

         #service    network   restart

            #yum -y  install  httpd

         #echo "192.168.10.20"  >/var/www/html/index.html

           #service   iptables  stop

             

         

          #service    network   restart

            #yum -y  install  httpd

         #echo "192.168.10.30"  >/var/www/html/index.html

           #service   iptables  stop

      HAProxy代理服务器设置如下:

             

            

                                 #service   network   restart

          #service  iptables stop

          内核调优,文件中插入如下两行:

                        

        #yum   install   gcc

        #tar -xvf haproxy-1.4.24.tar.gz

        #cd  /usr/local/src/haproxy-1.4.24

        #make   TARGET=linux2628

        #make  install

        #mkdir  /var/haproxy     #chroot所需目录

       创建配置文件:          

global
maxconn 4096
log 127.0.0.1 local3 info
chroot /var/haproxy
uid 99
gid 99
daemon
nbproc 1
pidfile /var/run/haproxy.pid
ulimit-n 65535
stats socket /var/tmp/stats
defaults
log global
mode http
maxconn 20480
option httplog
option httpclose
option dontlognull
option forwardfor
option redispatch
option abortonclose
stats refresh 30
retries 3
balance roundrobin
cookie SRV
timeout check 2000ms
timeout connect 5000ms
timeout server 50000ms
timeout client 50000ms
listen admin_status #定义HAProxy到监控界面
bind 0.0.0.0:6553
mode http
log 127.0.0.1 local3 info
stats enable
stats refresh 5s #监控统计页面自动刷新时间为5s
stats realm Haproxy\\ Statistics #登录监控统计页面提示符
stats uri /admin?stats #监控页面URL路径
stats auth admin1:AdMiN123 #查看HAProxy监控页面到账户与密码
stats hide-version #隐藏HAProxy版本信息

frontend web_service #定义终端用户访问到前端服务器
bind 0.0.0.0:80
mode http
log global
option httplog
option httpclose
option forwardfor
acl inside_src src 192.168.10.0/24 #定义ACL
#use_backend调用ACL定义,如果源地址为192.168.10.0/24,则代理服务器将会把请求转发#给inside_servers服务器组
use_backend inside_servers if inside_src
default_backend external_servers
backend external_servers
mode http
balance roundrobin #轮询真实服务器
#检查真实服务器到index.html文件,以此判断服务器的健康状态
option httpchk GET /index.html
#定义后端真实服务器,向cookie信息中插入web1信息,check代表允许对服务器进行健康检#查,健康检查到时间间隔为2000ms,连续两次健康检查成功则认为服务器是有效开启的,连续三次健康检查失败后,认为服务器已经宕机,服务器权重为1
server web1 192.168.10.20:80 cookie web1 check inter 2000 rise 2 fall 3 weight 1server web2 192.168.10.30:80 cookie web2 check inter 2000 rise 2 fall 3 weight 1backend inside_servers
mode http
balance roundrobin
option httpchk GET /index.html
server web1 192.168.10.30:80 cookie web2 check inter 1500 rise 3 fall 3 weight 1

                     3>修改HAProxy服务器日志配置文件,插入以下内容:

        #vim   /etc/rsyslog.conf

              $ModLoad   imudp                  

           $UDPServerRun    514

               local3.*

        #service   rsyslog  restart     #重启系统日志服务

          #haproxy  -f  /etc/haproxy.cfg   #指定配置文件启动HAProxy服务

                            #echo "/usr/local/sbin/haproxy  -f    /etc/haproxy.cf"  >>/etc/rc.local

4》客户端验证如下:  

      首先为客户端主机配置正确的网络环境,确保客户端与HAProxy代理服务器可以直接连通,使用浏览器访问http://172.31.16.163:6553/admin?stats查看代理服务器状态统              计信息:

       

        

                   配置客户端主机IP地址为172.31.16.229,通过浏览器访问http://172.31.16.163,刷新将分别得到web1.example.com以及web2.example.com两台主机返回的页面信息,如           果客户端主机IP地址配置为192.168.10.0/24网络内的IP,则访问http://192.168.10.10,服务器将返回的页面将永远都是web2.example.com主机的页面信息;

             

                              

                  

           

      

          

 

以上是关于HAProxy负载均衡的主要内容,如果未能解决你的问题,请参考以下文章

初识千万级高并发负载均衡软件HaProxy

负载均衡——LVS,HAProxy和Nginx对比分析

千万级高并发负载均衡软件HAproxy

HAproxy七层负载均衡四层/七层负载均衡

Haproxy 负载均衡算法介绍:

haproxy 负载均衡算法介绍: