zoukankan      html  css  js  c++  java
  • 构建高可用集群Keepalived+Haproxy负载均衡

    重点概念
    vrrp_script中节点权重改变算法
    vrrp_script 里的script返回值为0时认为检测成功,其它值都会当成检测失败;
    weight 为正时,脚本检测成功时此weight会加到priority上,检测失败时不加;
    主失败:
    主 priority < 从 priority + weight 时会切换。
    主成功:
    主 priority + weight > 从 priority + weight 时,主依然为主
    weight 为负时,脚本检测成功时此weight不影响priority,检测失败时priority – abs(weight)
    主失败:
    主 priority – abs(weight) < 从priority 时会切换主从
    主成功:
    主 priority > 从priority 主依然为主

    主要贴配置:VIP:10.16.37.198,10.16.37.199

    web服务器IP:10.16.37.94,10.16.37.101

    二台keepalived的IP:10.16.37.107,10.16.37.110

    一台:

    vi /etc/keepalived/keepalived.conf
    
    ! Configuration File for keepalived
    
    global_defs {
    
       notification_email {
    
             670196816@qq.com
    
       }
    
       notification_email_from admin@lnmp.com
    
       smtp_connect_timeout 3
    
       smtp_server 127.0.0.1
    
       router_id Iptables
    
    }
    
     
    
    vrrp_script chk_maintaince_down {
    
       script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
    
       interval 1
    
       weight 2
    
    }
    
     
    
    vrrp_script chk_haproxy {
    
       script "killall -0 haproxy"
    
       interval 1
    
       weight 2
    
    }
    
     
    
    vrrp_instance VI_1 {
    
       interface eth0
    
       state MASTER
    
       priority 100
    
       virtual_router_id 125
    
       garp_master_delay 1
    
       authentication {
    
           auth_type PASS
    
           auth_pass 1e3459f77aba4ded
    
       }
    
       track_interface {
    
          eth0
    
       }
    
       virtual_ipaddress {
    
          10.16.37.198/22 dev eth0 label eth0:0
    
       }
    
       track_script {
    
          chk_haproxy
    
       }
    
       notify_master "/etc/keepalived/notify.sh master 10.16.37.198"
    
       notify_fault "/etc/keepalived/notify.sh fault 10.16.37.198"
    
    }
    
     
    
    vrrp_instance VI_2 {
    
       interface eth0
    
       state BACKUP
    
       priority 99
    
       virtual_router_id 126
    
       grap_master_delay 1
    
       authentication {
    
           auth_type pass
    
           auth_pass 7615c4b7f518cede
    
       }
    
       track_interface {
    
          eth0
    
       }
    
       virtual_ipaddress {
    
          10.16.37.199/22 dev eth0 label eth0:1
    
       }
    
       track_script {
    
          chk_haproxy
    
          chK_maintaince_down
    
       }
    
       notify_master "/etc/keepalived/notify.sh master 10.16.37.199"
    
       notify_backup "/etc/keepalived/notify.sh backup 10.16.37.199"
    
       notify_fault "/etc/keepalived/notify.sh fault 10.16.37.199"
    
    }

     

    另一台:

    vi /etc/keepalived/keepalived.conf
    
    ! Configuration File for keepalived
    
    global_defs {
    
       notification_email {
    
             670196816@qq.com
    
       }
    
       notification_email_from admin@lnmp.com
    
       smtp_connect_timeout 3
    
       smtp_server 127.0.0.1
    
       router_id Iptables
    
    }
    
     
    
    vrrp_script chk_maintaince_down {
    
       script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
    
       interval 1
    
       weight 2
    
    }
    
     
    
    vrrp_script chk_haproxy {
    
       script "killall -0 haproxy"
    
       interval 1
    
       weight 2
    
    }
    
     
    
    vrrp_instance VI_1 {
    
       interface eth0
    
       state BACKUP
    
       priority 99
    
       virtual_router_id 125
    
       garp_master_delay 1
    
       authentication {
    
           auth_type PASS
    
           auth_pass 1e3459f77aba4ded
    
       }
    
       track_interface {
    
          eth0
    
       }
    
       virtual_ipaddress {
    
          10.16.37.198/22 dev eth0 label eth0:1
    
       }
    
       track_script {
    
          chk_haproxy
    
       }
    
       notify_master "/etc/keepalived/notify.sh master 10.16.37.198"
    
       notify_fault "/etc/keepalived/notify.sh fault 10.16.37.198"
    
    }
    
     
    
    vrrp_instance VI_2 {
    
       interface eth0
    
       state MASTER
    
       priority 100
    
       virtual_router_id 126
    
       grap_master_delay 1
    
       authentication {
    
           auth_type pass
    
           auth_pass 7615c4b7f518cede
    
       }
    
       track_interface {
    
          eth0
    
       }
    
       virtual_ipaddress {
    
          10.16.37.199/22 dev eth0 label eth0:0
    
       }
    
       track_script {
    
          chk_haproxy
    
          chK_maintaince_down
    
       }
    
       notify_master "/etc/keepalived/notify.sh master 10.16.37.199"
    
       notify_backup "/etc/keepalived/notify.sh backup 10.16.37.199"
    
       notify_fault "/etc/keepalived/notify.sh fault 10.16.37.199"
    
    }

    脚本配置:

    vi /etc/keepalived/notify.sh
    
    #!/bin/bash
    
    contact='root@localhost'
    
    notify() {
    
        mailsubject="'hostname' to be $1: $2 floating"
    
        mailbody="'date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"
    
        echo $mailbody | mail -s "$mailsubject" $contact
    
    }
    
     
    
    case "$1" in
    
        master)
    
            notify master $2
    
            /etc/rc.d/init.d/haproxy restart
    
            exit 0
    
        ;;
    
        backup)
    
            notify backup $2
    
            exit 0
    
        ;;
    
        fault)
    
            notify fault $2
    
            exit 0
    
        ;;
    
        *)
    
            echo 'Usage: 'basename $0' {master|backup|fault}'
    
            exit 1
    
        ;;
    
    Esac
    
     
    
    Haproxy配置:
    
    vi /etc/haproxy/haproxy.cfg
    
    #---------------------------------------------------------------------
    
    # Example configuration for a possible web application.  See the
    
    # full configuration options online.
    
    #
    
    #   http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
    
    #
    
    #---------------------------------------------------------------------
    
     
    
    #---------------------------------------------------------------------
    
    # Global settings
    
    #---------------------------------------------------------------------
    
    global
    
        # to have these messages end up in /var/log/haproxy.log you will
    
        # need to:
    
        #
    
        # 1) configure syslog to accept network log events.  This is done
    
        #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    
        #    /etc/sysconfig/syslog
    
        #
    
        # 2) configure local2 events to go to the /var/log/haproxy.log
    
        #   file. A line like the following can be added to
    
        #   /etc/sysconfig/syslog
    
        #
    
        #    local2.*                       /var/log/haproxy.log
    
        #
    
        log         127.0.0.1 local2
    
     
    
        chroot      /var/lib/haproxy
    
        pidfile     /var/run/haproxy.pid
    
        maxconn     4000
    
        user        haproxy
    
        group       haproxy
    
        daemon
    
     
    
        # turn on stats unix socket
    
        stats socket /var/lib/haproxy/stats
    
     
    
    #---------------------------------------------------------------------
    
    # common defaults that all the 'listen' and 'backend' sections will
    
    # use if not designated in their block
    
    #---------------------------------------------------------------------
    
    defaults
    
        mode                    http
    
        log                     global
    
        option                  httplog
    
        option                  dontlognull
    
        option http-server-close
    
        option forwardfor       except 127.0.0.0/8
    
        option                  redispatch
    
        retries                 3
    
        timeout http-request    10s
    
        timeout queue           1m
    
        timeout connect         10s
    
        timeout client          1m
    
        timeout server          1m
    
        timeout http-keep-alive 10s
    
        timeout check           10s
    
        maxconn                 3000
    
     
    
    #---------------------------------------------------------------------
    
    # main frontend which proxys to the backends
    
    #---------------------------------------------------------------------
    
    #frontend  main *:5000
    
    #    acl url_static       path_beg       -i /static /images /javascript /stylesheets
    
    #    acl url_static       path_end       -i .jpg .gif .png .css .js
    
    #
    
    #    use_backend static          if url_static
    
    #    default_backend             app
    
     
    
    #---------------------------------------------------------------------
    
    # static backend for serving up images, stylesheets and such
    
    #---------------------------------------------------------------------
    
    #backend static
    
    #    balance     roundrobin
    
    #    server      static 127.0.0.1:4331 check
    
     
    
    #---------------------------------------------------------------------
    
    # round robin balancing between the various backends
    
    #---------------------------------------------------------------------
    
    #backend app
    
    #    balance     roundrobin
    
    #    server  app1 127.0.0.1:5001 check
    
    #    server  app2 127.0.0.1:5002 check
    
    #    server  app3 127.0.0.1:5003 check
    
    #    server  app4 127.0.0.1:5004 check
    
    listen stats
    
        mode http
    
        bind 0.0.0.0:1080
    
        stats enable
    
        stats refresh 30s
    
        maxconn 200
    
        stats hide-version
    
        stats uri     /haproxy-stats
    
        stats realm   Haproxy Statistics
    
        stats auth    admin:admin
    
        stats admin if TRUE
    
    frontend http-in
    
        bind *:80
    
        mode http
    
        log global
    
        option httpclose
    
        option logasap
    
        option dontlognull
    
        capture request header Host len 20
    
        capture request header Referer len 60
    
        acl url_static path_beg -i /static /images /javascript /stylesheets
    
        acl url_static path_end         -i .jpg .jpeg .gif .png .css .js .html
    
        use_backend static_servers if url_static
    
        default_backend dynamic_servers
    
    backend static_servers
    
        balance roundrobin
    
        server imgsrv1 10.16.37.101:80 check maxconn 6000
    
        server imgsrv2 10.16.37.94:80 check maxconn 6000
    
    backend dynamic_servers
    
        balance source
    
        server websrv1 10.16.37.94:80 check maxconn 1000
    
    server websrv2 10.16.37.101:80 check maxconn 1000
    
     

    因为端口使用的是1080需要Iptables开启:

    /sbin/iptables –I INPUT –p tcp –dport 1080 –j ACCEPT
    
    /etc/rc.d/init.d/iptables save
    
    Service iptables restart
    
    Vi /etc/selinux/config

    关闭selinux然后呢重启!!

    二个server web采用nginx+双主mysql数据库,保证了web服务器的高可用性能,一台服务器宕机,另外一台立马连接!!

    参考:

    http://www.it165.net/admin/html/201405/2957.html

  • 相关阅读:
    flask之视图
    android studio 配置阿里云镜像 加速
    mac idea phpstorm 提示 clear read-only status 解决办法
    如何给网站一键变黑?如哀悼日,一行css代码解决
    Android base64加密中文乱码问题解决记录
    微信Android app支付 重要记录,重要!!
    mysql 数据库拷贝innodb 操作注意事项,宝塔面板
    Linux 服务器使用shell脚本 实现 间隔N秒访问url
    echarts pie饼图块颜色设置
    Linux 服务器 node 节点满了引发的灾难,请定期清理node节点
  • 原文地址:https://www.cnblogs.com/Kaivenblog/p/5809544.html
Copyright © 2011-2022 走看看