haproxy负载均衡

haproxy   支持4层tcp传输层,7层负载http应用层;用于大站点,多用于七层应用层负载
LVS         稳定,效率高,四层调度。不支持7层的内容分发或过滤。
nginx       支持四层,七层调度,现在也有开发的新的模块来扩展调度相关的功能。在会话保持,内容分发过滤方面比haproxy相比要差
     
 
软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现。
LVS就是基于Linux操作系统实现的一种软负载。
HAProxy是开源的并且基于第三应用实现的软负载。
 
 
HAProxy相比LVS的使用要简单很多,功能方面也很丰富。
当前,HAProxy支持两种主要的代理模式:"tcp"也即4层(大多用于邮件服务器、内部协议通信服务器等),和7层(HTTP)。
在4层模式,HAProxy仅在客户端和服务器之间转发双向流量。7层模式下,HAProxy会分析协议,并且能通过允许、拒绝、交换、增加、修改或者删除请求(request)或者回应(response)里指定内容来控制协议,这种操作要基于特定规则。
 
根据官方文档,HAProxy可以跑满10Gbps-New benchmark of HAProxy at 10 Gbps using Myricom's 10GbE NICs (Myri-10G PCI-Express),这个作为软件级负载均衡,也是比较惊人的;
 
 
 
HAProxy的8种调度算法有8种:
1、roundrobin,表示简单的轮询,按访问次数轮询。
2、static-rr,表示根据权重分发
3、leastconn,表示最少连接者优先分发
4、source,表示根据源请求IP分发
 
5、uri,表示根据请求的URL来分发
6、url_param,表示根据请求的URL参数分发
7、hdr(name),表示根据HTTP请求头来锁定每次的HTTP请求
8、rdp-cookie(name),表示根据cookie来锁定并哈希每一次TCP请求
 
重点关注1-4项,前4项
 
===================================================================================
 
 
在做反向代理服务器的负载均衡时,我们通常会使用nginx的均衡配置。其实,haproxy的负载均衡也是属于这一类的。那么关于这方面的配置过程我们现在来进行一下讲解。首先,对haproxy进行一个简单的介绍,之后就是安装和配置环节。
 
 
HAProxy介绍
反向代理服务器,支持双机热备支持虚拟主机,但其配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端服务器出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入
 
 
 
第二部分:准备服务器与HAProxy软件安装
 
haproxy的搭建
架构图:
 
--下图中haproxy用了两个网段(这里模拟内外网),实际时也可以只用一个网卡(只有内网网卡),公网IP在前端防火墙做映射就可以了
 
 
 
                   客户端(真实机) 81.1.1.1
                         |          
                             |  
            外网         |        81.1.1.3
                             haproxy   
            内网         |        192.168.169.161
                           |               
                           |
            web1                        web2
            192.168.169.153         192.168.169.154
 
 
 
实验前准备:
1,更改主机名与静态IP,并写/etc/hosts文件
 
    192.168.169.161   haproxy.cluster.com     haproxy
    192.168.169.153   node1.cluster.com       node-web1
    192.168.169.154   node2.cluster.com         node-web2
     
2,时间同步
3,关闭iptables,selinux,NetworkManager,
 
 
使用的HAproxy软件版本 haproxy-1.4.24.tar.gz        --软件包
 
新建haproxy用户
[root@li ~]# useradd haproxy -s /sbin/nologin
 
 
 
准备安装部署
先在192.168.169.161安装haproxy软件
 
[root@haproxy ~]# tar xf /haproxy-1.4.24.tar.gz -C /usr/src/    
[root@haproxy ~]# cd /usr/src/haproxy-1.4.24/
[root@haproxy haproxy-1.4.24]# make target=linux26 CPU=x86_64 PREFIX=/usr/local/haproxy install
 
target=linux26             --代表指定内核大版本号,使用uname -a 就可以查到
CPU=x86_64                 --代表CPU的位数,32位还是64位
PREFIX=/usr/local/haproxy  --代表指定安装目录   注意:PREFIX必须为大写,否则不认
 
--如果你的操作系统为32位,则把上面编译参数CPU=x86_64换成CPU=i686(如果不知道,用uname -m查看,-a显示全部信息)
 
 
查看官方软件包提供的文件
# ls /usr/local/haproxy/doc/haproxy/
architecture.txt   架构体系和简单应用例子说明
configuration.txt  配置文档,所有参数都有说明
haproxy-en.txt     使用手册
haproxy-fr.txt
 
 
查看安装后的目录文件
[root@haproxy haproxy-1.4.24]# cd /usr/local/haproxy/
[root@haproxy haproxy]# ls
doc  sbin  share
 
# cp /usr/local/haproxy/share/man/man1/haproxy.1 /usr/share/man/man1/
--拷man文档到相应的目录,然后就可以man haproxy了
 
 
--复制配置文件
[root@haproxy haproxy]# cp /usr/src/haproxy-1.4.24/examples/haproxy.cfg /usr/local/haproxy/
 
 
--配置HAProxy
# vim /usr/local/haproxy/haproxy.cfg      
 
global
        #log 127.0.0.1  local0
        #log 127.0.0.1  local1 notice
        log 127.0.0.1   local0 info         --日志记录
        maxconn 4096                                        --最大链接
        chroot /usr/local/haproxy               --笼环境   ,haproxy安装家目录
        uid 99              --运行haproxy的用户UID,99就是默认用户nobody
        gid 99
        daemon              --以后台守护进程运行 
        nbproc 1            --打开一个进程,默认也是1,如果打开两个的话,启动后,可以使用lsof -i:80查到两个进程,并且使用RR调度的话会两次web1,再两次web2
        pidfile /var/run/haproxy.pid    --指定pid文件,可用于一些reload,或关闭操作 
        #debug              --调试模式
        #quiet              --静默模式,不要打开这句,否则启动时报错你看不到
     
defaults                                    --defaults里的设置对后面的(frontend,backend,listen)这些配置段都生效
        log     global      --日志记录和global一样
        mode    http            --七层负载,如果改成tcp,就是四层负载
        option  httplog     --日志记录http的会话等信息
        option  dontlognull     --记录一些监控或健康检查
        retries 3                           --如果连续连接3次失败就认为是不可用
        option redispatch           --如果后端有服务器宕机,强制切换到正常服务器
        maxconn 2000                    --每个连接可用的最大连接数
        contimeout      5000    --连接超时
        clitimeout      50000   --客户端连接超时时间 毫秒
        srvtimeout      50000   --服务器连接超时时间
listen  haproxy 192.168.169.161:80                  --配置haproxy服务器的名称与IP地址和端口
        balance roundrobin                                  --改成source时,那同一个IP地址的所有请求发送到同一台服务器
        server node-web1 192.168.169.153:80 --配置真实服务器的地址和端口
        server node-web2 192.168.169.154:80 --配置真实服务器的地址和端口
 
 
 
----------------------------------------
上面的listen这个配置段,可以换成下面的这两个配置段,也是一样的效果;
这就是haproxy配置灵活的方面
 
frontend  haproxy *:80
         default_backend servers
 
backend servers
        balance roundrobin
        server node-web1 192.168.169.153:80 
        server node-web2 192.168.169.154:80 
 
 
----------------------------------------
 
 
--启动服务
# cd /usr/local/haproxy
# ./sbin/haproxy -f haproxy.cfg     
 
-------------------------------------------------------
--关闭服务
# kill $(</var/run/haproxy.pid)      
 
--刷新服务
# ./sbin/haproxy -f haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)             
 
 
这里是可以把三个启动方式,写成脚本
 
man haproxy 查看相关参数
 
 
#./sbin/haproxy –help 
haproxy   -f   <配置文件>   [-n 最大并发连接总数] [-N 每个侦听的最大并发数] [-d] [-D] [-q] [-V] [-c] [-p <pid文件>] [-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>
   程序启动后向pidlist里的进程发送FINISH信号,这个参数放在命令行的最后
   -st <pidlist>
   程序启动后向pidlist里的进程发送TERMINATE信号,这个参数放在命令行的最后
 
----------------------------------------------------------------
 
第三部分:安装两个节点端并测试集群效果
把node1和node2安装httpd,然后启动起来,做一个不同的主页方便验证HAProxy的算法
node1上做:
# yum install httpd* -y
# /etc/init.d/httpd restart
# echo web1 > /var/www/html/index.html
 
node2上做:
# yum install httpd* -y
# /etc/init.d/httpd restart
# echo web2 > /var/www/html/index.html
 
 
 
测试负载均衡效果
找另外的两台以上的机器访问 haproxy服务器的IP ,看是否能达到负载均衡效果
 
==============================
 
把日志配置写到syslog服务里
# vim /etc/rsyslog.conf     --加上下面一句
local0.*            /var/log/haproxy.log
 
 
vim /etc/rsyslog.conf   --把下面两句话打开,只要打开udp的两句就可以(haproxy这里没有使用tcp的514,用的是udp的514)
$ModLoad imudp
$UDPServerRun 514
 
修改完后做重新日志服务
# /etc/init.d/rsyslog restart 
 
 
然后可以去重启一下haproxy
再来验证查看 /var/log/haproxy.log文件就有日志文件了
第四部分:使用haproxy做动静分离
 
先看架构图
               客户端(真实机) 81.1.1.1    
                 |          
                 |  
        外网   |      81.1.1.3
              haproxy   
        内网   |  192.168.169.161
                 |             
                 |
            web1      web2
192.168.169.153         192.168.169.154         
 
        静态文件             动态文件
 
 
 
--修改HAProxy主配置文件/usr/local/haproxy/haproxy.cfg
 
[root@haproxy haproxy]# /usr/local/haproxy/haproxy.cfg      
global
        #log 127.0.0.1  local0
        #log 127.0.0.1  local1 notice
        log 127.0.0.1   local0 info
        maxconn 4096
        chroot /usr/local/haproxy
        uid 99
        gid 99
        daemon
        nbproc 1
        pidfile /var/run/haproxy.pid
        #debug
        #quiet
 
 
defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        option redispatch
            retries 3
        balance roundrobin         --设备调度算法,roundrobin 是轮询
        option forwardfor
        maxconn 2000
        timeout connect      5000
        timeout client      50000
        timeout server      50000
 
frontend haproxy.cluster.com 0.0.0.0:80          --主机名 *代表主机所有IP,:80代表80端口
#       acl invalid_src src 1.1.1.1    --如果你要拒绝某个IP访问,就把注释打开并设置IP
#       block if invalid_src 
 
        acl url_static path_end .html .png .jpg .css .js .txt .xml
        use_backend static if url_static
        default_backend dynamic
 
 
backend static
        server node1.cluster.com 192.168.169.153:80 check inter 2000 rise 2 fall 5
        server node2.cluster.com 192.168.169.154:80 check inter 2000 rise 2 fall 5
 
backend dynamic
                server node1.cluster.com 192.168.169.153:80 check inter 2000 rise 2 fall 5
            server node2.cluster.com 192.168.169.154:80 check inter 2000 rise 2 fall 5
             
     
 
--修改完成后,需要将服务刷新或重启服务
 
--启动服务
# cd /usr/local/haproxy
# ./sbin/haproxy -f haproxy.cfg     
 
-------------------------------------------------------
--关闭服务
# kill $(</var/run/haproxy.pid)      
 
--刷新服务
# ./sbin/haproxy -f haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)             
 
--重启服务后
 
在后端两个web都去创建一些不同类型的文件,写上不同的内容
 
然后在客户端访问,会发现所有的定义的静态文件会访问web1,除此之外的都访问web2
 
如:在客户端firefox上访问 http://haproxy.cluster.com/index.html  --只会显示web1上的内容,静态的都指向它
 
 
----------------------------
 

第五部分:开启HAPRoxy自带的监控页面
修改主配置文件/usr/local/haproxy/haproxy.cfg
vi /usr/local/haproxy/haproxy.cfg
 
global
        #log 127.0.0.1  local0
        #log 127.0.0.1  local1 notice
        log 127.0.0.1   local0 info
        maxconn 4096
        chroot /usr/local/haproxy
        uid 99
        gid 99
        daemon
        pidfile /var/run/haproxy.pid
        #debug
        #quiet
 
defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        retries 3
        option  redispatch
        maxconn 2000
        balance roundrobin
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000
 
 
#加上这一段,代表开启监控页面
listen stats                    #监听的管理后台
    mode http                   #服务模式
    bind 192.168.169.161:88     #指定ip地址和端口号
    stats enable                #开启状态页面
    stats hide-version          #不显示头部信息
    stats uri    /haproxy-server  #访问的路径
    stats realm  Haproxy\ Statistics  #加密方式
    stats auth    admin:333333         #认证的用户和密码
    stats admin if TRUE         #管理我们节点
    stats refresh 30s           #刷新监控界面
 
 
 
frontend haproxy.cluster.com 0.0.0.0:80
#       acl invalid_src src 1.1.1.1
#       block if invalid_src 
 
        acl url_static path_end .html .png .jpg .css .js 
        use_backend static if url_static
        default_backend dynamic
 
 
backend static
        server node1.cluster.com 81.1.1.129:80 check inter 2000 rise 2 fall 5
 
backend dynamic
        server node1.cluster.com 81.1.1.129:80 check inter 2000 rise 2 fall 5
        server node2.cluster.com 81.1.1.130:80 check inter 2000 rise 2 fall 5
 
 
 
--登陆方法:192.168.169.161:88/haproxy-server 
输入帐号:admin  密码:333333
 
 
==============================================================
 
 
 
第六部分:安装keepalived实现haproxy主备
1、先安装依赖包
yum -y install kernel-devel openssl* openssl-devel gcc* make* libnl*
 
 
2、安装keepalived软件包,两台keepalived机器都要安装
    a、解压软件包keepalived-1.2.16.tar.gz:tar xf keepalived-1.2.16.tar.gz -C /usr/src/
    b、配置keepalived:cd /usr/src/keepalived-1.2.16,再配置./configure --with-kernel-dir=/usr/src/kernel/.6.32-431.el6.x86_64/
    c、编译与安装:make && make install
    d、复制配置文件与启动命令:
        cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
        cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
        cp /usr/local/sbin/keepalived /usr/sbin/
        mkdir /etc/keepalived
        cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
 
3、配置keepalived主备关系
vi /etc/keepalived/keepalived.conf
 
global_defs {
   notification_email {
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_MASTER
}
 
vrrp_script chk_haproxy {           
   script "/etc/keepalived/chk_haproxy.sh"    #健康检查脚本
   interval 2                    
   weight 2                     
    }
 
vrrp_instance VI_1 {
    state MASTER
    interface eth1
    virtual_router_id 60
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.169.160
    }
    track_script {
        chk_haproxy
    }
}
 
 
 
4、写健康检查脚本
vi /etc/keepalived/chk_haproxy.sh
#!/bin/bash
/etc/rc.d/init.d/functions
 
status=$(lsof -i:80 | wc -l)   natstat -lntup | grep haproxy | grep -v grep | wc -l
 
 
if [ "${status}" = "0" ]; then
 
        sh /usr/local/haproxy/haproxy-all.sh start
 
        status2=$(lsof -i:80 | wc -l)
 
                if [ "${status2}" = "0" ]; then
 
                        /etc/init.d/keepalived stop
                fi
fi
 
 
5、给haproxy写一个启动脚本
vi /usr/local/haproxy/haproxy-all.sh
 
#!/bin/bash
 
#cd /usr/local/haproxy
 
haproxy=/usr/local/haproxy
 
case "$1" in
 
start)
    $haproxy/sbin/haproxy -f $haproxy/haproxy.cfg
    echo "HAproxy Started! OK."
    ;;
 
stop)
    #pkill haproxy
    kill $(</var/run/haproxy.pid)
    echo "HAproxy Stoped."
    ;;
 
reload)
    $haproxy/sbin/haproxy -f $haproxy -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
    ;;
 
restart)
    pkill haproxy
    sleep 5
    echo "HAproxy Stoped."
    $haproxy/sbin/haproxy -f $haproxy/haproxy.cfg
    a=`netstat -anlp|grep haproxy |wc -l`
    #if [ $a -eq 0 ] then
    #   echo "haproxy 启动失败"
    #else
    #   echo "HAproxy 启动成功。"
    #fi
     
    [ $a -eq 0 ] && echo "HAproxy 启动失败" || echo "HAproxy 启动成功"  
     
    ;;
     
*)
    echo "请输入 start | stop | reload | restart "
    ;;
     
exit 0
esac

  

 

posted @ 2019-12-18 22:23  MlxgzZ  阅读(425)  评论(0编辑  收藏  举报