美文网首页
Haproxy 基础

Haproxy 基础

作者: Habit_1027 | 来源:发表于2020-04-02 16:55 被阅读0次

    3、Haproxy 基础

    image.png

    软件:haproxy---主要是做负载均衡的7层,也可以做4层负载均衡
    apache也可以做7层负载均衡,但是很麻烦。实际工作中没有人用。
    负载均衡是通过OSI协议对应的
    7层负载均衡:用的7层http协议,
    4层负载均衡:用的是tcp协议加端口号做的负载均衡


    ha-proxy概述
    ha-proxy是一款高性能的负载均衡软件。因为其专注于负载均衡这一些事情,因此与nginx比起来在负载均衡这件事情上做更好,更专业。

    ha-proxy的特点
    ha-proxy 作为目前流行的负载均衡软件,必须有其出色的一面。下面介绍一下ha-proxy相对LVS,Nginx等负载均衡软件的优点。

    •支持tcp / http 两种协议层的负载均衡,使得其负载均衡功能非常丰富。
    •支持8种左右的负载均衡算法,尤其是在http模式时,有许多非常实在的负载均衡算法,适用各种需求。
    •性能非常优秀,基于事件驱动的链接处理模式及单进程处理模式(和Nginx类似)让其性能卓越。
    •拥有一个功能出色的监控页面,实时了解系统的当前状况。
    •功能强大的ACL支持,给用户极大的方便。

    haproxy算法:
    1.roundrobin
    基于权重进行轮询,在服务器的处理时间保持均匀分布时,这是最平衡,最公平的算法.此算法是动态的,这表示其权重可以在运行时进行调整.不过在设计上,每个后端服务器仅能最多接受4128个连接
    2.static-rr
    基于权重进行轮询,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效.不过,其在后端服务器连接数上没有限制
    3.leastconn
    新的连接请求被派发至具有最少连接数目的后端服务器.

    
    **1、Haproxy 实现七层负载**
    
    ```shell
    Keepalived + Haproxy
    =================================================================================
    
    /etc/haproxy/haproxy.cfg
    global                                                    //关于进程的全局参数
        log          127.0.0.1 local2 info  #日志服务器(/etc/rsyslog.conf)
        pidfile                 /var/run/haproxy.pid  #pid文件
        maxconn         4000     #最大连接数
        user                    haproxy   #用户
        group               haproxy      #组
        daemon          #守护进程方式后台运行
        nbproc 1        #工作进程数量  cpu内核是几就写几
        
     -----------------------------------------------------------------   
        
    defaults 段用于为其它配置段提供默认参数
    listen是frontend和backend的结合体
    
    frontend        虚拟服务VIrtual Server
    backend        真实服务器Real Server
    
    调度器可以同时为多个站点调度,如果使用frontend、backend的方式:
    frontend1 backend1
    frontend2 backend2
    frontend3 backend3
    
    Keepalived + Haproxy
    =================================================================================
    
    
    拓扑结构
    
                                [vip: 192.168.246.17]
    
                            [LB1 Haproxy]       [LB2 Haproxy]
                            192.168.246.169     192.168.246.161
    
                           [httpd]                    [httpd] 
                        192.168.246.162              192.168.246.163
    
    一、Haproxy实施步骤               
    1. 准备工作(集群中所有主机)
    [root@ha-proxy-master ~]# cat /etc/hosts
    127.0.0.1       localhost
    192.168.246.169 ha-proxy-master
    192.168.246.161 ha-proxy-slave
    192.168.246.162 test-nginx1 
    192.168.246.163 test-nginx2
    2. RS配置
    配置好网站服务器,测试所有RS,所有机器安装nginx
    [root@test-nginx1 ~]# yum install -y nginx
    [root@test-nginx1 ~]# systemctl start nginx
    [root@test-nginx1 ~]# echo "test-nginx1" >> /usr/share/nginx/html/index.html
    # 所有nginx服务器按顺序输入编号,方便区分。
    3. 调度器配置Haproxy(主/备)都执行
    [root@ha-proxy-master ~]# yum -y install haproxy
    [root@ha-proxy-master ~]# cp -rf /etc/haproxy/haproxy.cfg{,.bak}
    [root@ha-proxy-master ~]# sed -i -r '/^[ ]*#/d;/^$/d' /etc/haproxy/haproxy.cfg
    [root@ha-proxy-master ~]# vim /etc/haproxy/haproxy.cfg
    global
        log         127.0.0.1 local2 info
        pidfile     /var/run/haproxy.pid
        maxconn     4000   #优先级低
        user        haproxy
        group       haproxy
        daemon               #以后台形式运行ha-proxy
        nbproc 1            #工作进程数量  cpu内核是几就写几
    defaults
        mode                    http  #工作模式 http ,tcp 是 4 层,http是 7 层   
        log                     global
        retries                 3   #健康检查。3次连接失败就认为服务器不可用,主要通过后面的check检查
        option                  redispatch  #服务不可用后重定向到其他健康服务器。
        maxconn                 4000  #优先级中
        contimeout              5000  #ha服务器与后端服务器连接超时时间,单位毫秒ms
        clitimeout              50000 #客户端超时
        srvtimeout              50000 #后端服务器超时
    listen stats
        bind            *:80
        stats                       enable
        stats uri               /haproxy  #使用浏览器访问 http://192.168.246.169/haproxy,可以看到服务器状态  
        stats auth              qianfeng:123  #用户认证,客户端使用elinks浏览器的时候不生效
    frontend  web
        mode                    http  
        bind                            *:80   #监听哪个ip和什么端口
        option                  httplog     #日志类别 http 日志格式
        acl html url_reg  -i  \.html$  #1.访问控制列表名称html。规则要求访问以html结尾的url
        use_backend httpservers if  html #2.如果满足acl html规则,则推送给后端服务器httpservers
        default_backend    httpservers   #默认使用的服务器组
    backend httpservers    #名字要与上面的名字必须一样
        balance     roundrobin  #负载均衡的方式
        server  http1 192.168.246.162:80 maxconn 2000 weight 1  check inter 1s rise 2 fall 2
        server  http2 192.168.246.163:80 maxconn 2000 weight 1  check inter 1s rise 2 fall 2
    将配置文件拷贝到slave服务器
    [root@ha-proxy-master ~]# scp  /etc/haproxy/haproxy.cfg 192.168.246.161:/etc/haproxy/
    两台机器启动设置开机启动
    [root@ha-proxy-master ~]# systemctl start haproxy
    [root@ha-proxy-master ~]# systemctl enable haproxy
    
    #check inter 2000          检测心跳频率
    #rise 2     2 次正确认为服务器可用
    #fall 2      2 次失败认为服务器不可用
    

    4.测试主/备(浏览器访问)

    主:

    image.png

    备:

    image.png
    页面主要参数解释
    Queue
    Cur: current queued requests //当前的队列请求数量
    Max:max queued requests     //最大的队列请求数量
    Limit:           //队列限制数量
    
    Errors
    Req:request errors             //错误请求
    Conn:connection errors          //错误的连接
    
    Server列表:
    Status:状态,包括up(后端机活动)和down(后端机挂掉)两种状态
    LastChk:    持续检查后端服务器的时间
    Wght: (weight) : 权重
    ========================================================
    2.测试访问
    通过访问haparoxy的ip地址访问到后端服务器
    # curl http://192.168.246.169
    
    如果出现bind失败的报错,执行下列命令
    setsebool -P haproxy_connect_any=1
    
    二、Keepalived实现调度器HA
    注:主/备调度器均能够实现正常调度
    1. 主/备调度器安装软件
    [root@ha-proxy-master ~]# yum install -y keepalived
    [root@ha-proxy-slave ~]# yum install -y keepalived
    [root@ha-proxy-master ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
    [root@ha-proxy-master ~]# vim /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived
    
    global_defs {
       router_id director1
    }
    vrrp_instance VI_1 {
        state MASTER
        interface ens33
        virtual_router_id 80
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.246.17/24
        }
    }
    
    [root@ha-proxy-slave ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
    [root@ha-proxy-slave ~]# vim /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived
    
    global_defs {
       router_id directory2
    }
    vrrp_instance VI_1 {
        state BACKUP
        interface ens33
        nopreempt
        virtual_router_id 80
        priority 50
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.246.17/24
        }
    }
    3. 启动KeepAlived(主备均启动)
    [root@ha-proxy-master ~]# chkconfig keepalived on
    [root@ha-proxy-master ~]# service keepalived start
    [root@ha-proxy-master ~]# ip a
    
    4. 扩展对调度器Haproxy健康检查(可选)
    思路:两台机器都做
    让Keepalived以一定时间间隔执行一个外部脚本,脚本的功能是当Haproxy失败,则关闭本机的Keepalived
    a. script
    [root@ha-proxy-master ~]# cat /etc/keepalived/check_haproxy_status.sh
    #!/bin/bash                                                                                      /usr/bin/curl -I http://localhost &>/dev/null   
    if [ $? -ne 0 ];then                                                                            
    #       /etc/init.d/keepalived stop
            systemctl stop keepalived
    fi                                                                      
    [root@ha-proxy-master ~]# chmod a+x /etc/keepalived/check_haproxy_status.sh
    b. keepalived使用script
    [root@ha-proxy-master keepalived]# vim keepalived.conf
    ! Configuration File for keepalived
    
    global_defs {
       router_id director1
    }
    vrrp_script check_haproxy {
       script "/etc/keepalived/check_haproxy_status.sh"
       interval 5
    }
    
    vrrp_instance VI_1 {
        state MASTER
        interface ens33
        virtual_router_id 80
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.246.17/24
        }
        track_script {
            check_haproxy
        }
    }
    [root@ha-proxy-slave keepalived]# vim keepalived.conf
    ! Configuration File for keepalived
    
    global_defs {
       router_id directory2
    }
    vrrp_script check_haproxy {
       script "/etc/keepalived/check_haproxy_status.sh"
       interval 5
    }
    
    vrrp_instance VI_1 {
        state BACKUP
        interface ens33
        nopreempt
        virtual_router_id 80
        priority 50
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.246.17/24
        }
        track_script {
            check_haproxy
        }
    }
    [root@ha-proxy-master keepalived]# systemctl restart keepalived
    [root@ha-proxy-slave keepalived]# systemctl restart keepalived
    注:必须先启动haproxy,再启动keepalived
    两台机器都配置haproxy的日志:需要打开注释并添加
    [root@ha-proxy-master ~]# vim /etc/rsyslog.conf 
    # Provides UDP syslog reception  #由于haproxy的日志是用udp传输的,所以要启用rsyslog的udp监听
    $ModLoad imudp
    $UDPServerRun 514
    找到  #### RULES ####   下面添加
    local2.*                       /var/log/haproxy.log
    [root@ha-proxy-master ~]# systemctl restart rsyslog
    [root@ha-proxy-master ~]# systemctl restart haproxy
    [root@ha-proxy-master ~]# tail -f /var/log/haproxy.log 
    2019-07-13T23:11:35+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56866 to 192.168.246.17:80 (web/HTTP)
    2019-07-13T23:11:35+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56867 to 192.168.246.17:80 (web/HTTP)
    2019-07-13T23:13:39+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56889 to 192.168.246.17:80 (stats/HTTP)
    2019-07-13T23:13:39+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56890 to 192.168.246.17:80 (web/HTTP)
    2019-07-13T23:14:07+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56895 to 192.168.246.17:80 (web/HTTP)
    2019-07-13T23:14:07+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56896 to 192.168.246.17:80 (stats/HTTP)
    

    作业:Haproxy 实现四层负载

    两台haproxy配置文件:
    [root@ha-proxy-master ~]# cat /etc/haproxy/haproxy.cfg
    Haproxy L4
    =================================================================================
    global
        log         127.0.0.1 local2
        pidfile     /var/run/haproxy.pid
        maxconn     4000
        user        haproxy
        group       haproxy
        daemon
        nbproc      1
    defaults
        mode                    http
        log                     global
        option                  redispatch
        retries                 3
        maxconn                 4000
        contimeout              5000
        clitimeout              50000
        srvtimeout              50000
    listen stats
        bind            *:80
        stats                       enable
        stats uri               /haproxy
        stats auth              qianfeng:123
    frontend  web
        mode                    http
        bind                            *:80
        option                  httplog
        default_backend    httpservers
    backend httpservers
        balance     roundrobin
        server  http1 192.168.246.162:80 maxconn 2000 weight 1  check inter 1s rise 2 fall 2
        server  http2 192.168.246.163:80 maxconn 2000 weight 1  check inter 1s rise 2 fall 2
    listen mysql
        bind *:3306
        mode tcp
        balance roundrobin
        server mysql1 192.168.246.163:3306 weight 1  check inter 1s rise 2 fall 2
        server mysql2 192.168.246.162:3306 weight 1  check inter 1s rise 2 fall 2
    
    找一台机器做为客户端去测试,在测试的时候注意mysql的远程登录权限
    

    相关文章

      网友评论

          本文标题:Haproxy 基础

          本文链接:https://www.haomeiwen.com/subject/kyoxphtx.html