zoukankan      html  css  js  c++  java
  • haproxy+keepalived+rabbitmq3.8实现集群的高可用

    rabbitmq部署在机房,添加镜像集群后,需要做高可用,当单机故障时可以切换到另外一台

    1.修改rabbitmq的配置,引入修改相关配置的文件

    # vim /usr/local/rabbitmq/sbin/rabbitmq-defaults
    # 添加这行
    CONFIG_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq.conf

    # 添加修改端口的配置
    vim /usr/local/rabbitmq/etc/rabbitmq/rabbitmq.conf
    #数据管理端口(默认端口为5672)
    listeners.tcp.default=5673
    #界面管理端口(默认端口为15672)
    management.tcp.port=15672
    management.tcp.ip=0.0.0.0

    chown -R rabbitmq.rabbitmq /etc/rabbitmq/

    2.配置负载均衡程序haproxy

    添加haproxy的相关配置
    useradd haproxy -s /sbin/nologin

    # 编写 haproxy 的启动脚本

    vim /etc/init.d/haproxy

    #!/bin/sh
    #
    # chkconfig: - 85 15
    # description: HA-Proxy is a TCP/HTTP reverse proxy which is particularly suited 
    #              for high availability environments.
    # processname: haproxy
    # config: /etc/haproxy/haproxy.cfg
    # pidfile: /var/run/haproxy.pid
    
    # Script Author: Simon Matter <simon.matter@invoca.ch>
    # Version: 2004060600
    
    # Source function library.
    if [ -f /etc/init.d/functions ]; then
      . /etc/init.d/functions
    elif [ -f /etc/rc.d/init.d/functions ] ; then
      . /etc/rc.d/init.d/functions
    else
      exit 0
    fi
    
    # Source networking configuration.
    . /etc/sysconfig/network
    
    # Check that networking is up.
    [ ${NETWORKING} = "no" ] && exit 0
    
    # This is our service name
    BASENAME=`basename $0`
    if [ -L $0 ]; then
      BASENAME=`find $0 -name $BASENAME -printf %l`
      BASENAME=`basename $BASENAME`
    fi
    
    BIN=/usr/sbin/$BASENAME
    
    CFG=/etc/$BASENAME/$BASENAME.cfg
    [ -f $CFG ] || exit 1
    
    PIDFILE=/var/run/$BASENAME.pid
    LOCKFILE=/var/lock/subsys/$BASENAME
    
    RETVAL=0
    
    start() {
      quiet_check
      if [ $? -ne 0 ]; then
        echo "Errors found in configuration file, check it with '$BASENAME check'."
        return 1
      fi
    
      echo -n "Starting $BASENAME: "
      daemon $BIN -D -f $CFG -p $PIDFILE
      RETVAL=$?
      echo
      [ $RETVAL -eq 0 ] && touch $LOCKFILE
      return $RETVAL
    }
    
    stop() {
      echo -n "Shutting down $BASENAME: "
      killproc $BASENAME -USR1
      RETVAL=$?
      echo
      [ $RETVAL -eq 0 ] && rm -f $LOCKFILE
      [ $RETVAL -eq 0 ] && rm -f $PIDFILE
      return $RETVAL
    }
    
    restart() {
      quiet_check
      if [ $? -ne 0 ]; then
        echo "Errors found in configuration file, check it with '$BASENAME check'."
        return 1
      fi
      stop
      start
    }
    
    reload() {
      if ! [ -s $PIDFILE ]; then
        return 0
      fi
    
      quiet_check
      if [ $? -ne 0 ]; then
        echo "Errors found in configuration file, check it with '$BASENAME check'."
        return 1
      fi
      $BIN -D -f $CFG -p $PIDFILE -sf $(cat $PIDFILE)
    }
    
    check() {
      $BIN -c -q -V -f $CFG
    }
    
    quiet_check() {
      $BIN -c -q -f $CFG
    }
    
    rhstatus() {
      status $BASENAME
    }
    
    condrestart() {
      [ -e $LOCKFILE ] && restart || :
    }
    
    # See how we were called.
    case "$1" in
      start)
        start
        ;;
      stop)
        stop
        ;;
      restart)
        restart
        ;;
      reload)
        reload
        ;;
      condrestart)
        condrestart
        ;;
      status)
        rhstatus
        ;;
      check)
        check
        ;;
      *)
        echo $"Usage: $BASENAME {start|stop|restart|reload|condrestart|status|check}"
        exit 1
    esac
     
    exit $?

    3.添加haproxy的配置

    # cat /etc/haproxy/haproxy.cfg 
    #---------------------------------------------------------------------
    # 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      /usr/local/haproxy
        pidfile     /usr/local/haproxy/haproxy.pid
        maxconn     50000
        user        haproxy
        group       haproxy
        daemon
        nbproc      1
     
        # turn on stats unix socket
        stats socket /usr/local/haproxy/stats
    #---------------------------------------------------------------------
    # common defaults that all the 'listen' and 'backend' sections will
    # use if not designated in their block
    #---------------------------------------------------------------------
    
    defaults
        mode                    tcp
        log                     global
    #   option                  httplog
        option                  tcplog
        option                  dontlognull
        option             http-server-close
    #   option forwardfor  except 127.0.0.0/8
    #   option     redispath
        retries                 3
        timeout queue           1m
        timeout connect         10s
        timeout client          2m
        timeout server          2m
        timeout http-keep-alive 10s
        timeout check           10s
        maxconn                 3000
    
    
    #---------------------------------------------------------------------
    # HAProxy statistics backend
    #---------------------------------------------------------------------
    listen haproxy-monitoring 
        bind *:4321
        mode  http
        stats enable
        stats refresh           30s
        stats uri               /stats
        stats realm             HAProxy Statistics
        stats auth              admin:admin
        stats hide-version
     
    #---------------------------------------------------------------------
    # main frontend which proxys to the backends
    #---------------------------------------------------------------------
    listen rabbitmq_cluster 
        bind 0.0.0.0:5672
        mode tcp
        balance roundrobin
        server rabbitmq_01 192.168.254.187:5673 check inter 2000 rise 2 fall 3
        server rabbitmq_02 192.168.254.196:5673 check inter 2000 rise 2 fall 3
    
    #---------------------------------------------------------------------
    # main frontend which proxys to the backends
    #---------------------------------------------------------------------
    listen rabbitmq_web
        bind 0.0.0.0:27651
        mode tcp
        balance roundrobin
        server rabbitmq_01 192.168.254.187:15672 check inter 2000 rise 2 fall 3
        server rabbitmq_02 192.168.254.196:15672 check inter 2000 rise 2 fall 3
     
    #---------------------------------------------------------------------
    # round robin balancing between the various backends

    # 配置开机自动启动

    chkconfig --add haproxy
    chkconfig haproxy on
    chkconfig --list haproxy


    4.配置keepvid
    # 自动启动haproxy的监控脚本
    mkdir /etc/keepalived/
    vim /etc/keepalived/check_haproxy.sh

    #!/bin/bash
    A=`ps -C haproxy --no-header | wc -l`
    if [ $A -eq 0 ];then
    #/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg &
    killall haproxy
    /etc/init.d/haproxy start
    echo "haproxy start done" >>/etc/haproxy/haproxy_start.log
    sleep 3
    if [ `ps -C haproxy --no-header | wc -l` -eq 0 ];then
    /etc/init.d/keepalived stop
    echo "keepalived stop"
    fi
    fi

    chmod +x /etc/keepalived/check_haproxy.sh
    # keepalived的启动文件

    vim /etc/init.d/keepalived

    #!/bin/sh
    #
    # Startup script for the Keepalived daemon
    #
    # processname: keepalived
    # pidfile: /var/run/keepalived.pid
    # config: /etc/keepalived/keepalived.conf
    # chkconfig: - 21 79
    # description: Start and stop Keepalived
    
    # Source function library
    . /etc/rc.d/init.d/functions
    
    # Source configuration file (we set KEEPALIVED_OPTIONS there)
    . /etc/sysconfig/keepalived
    
    RETVAL=0
    
    prog="keepalived"
    
    start() {
        echo -n $"Starting $prog: "
        daemon keepalived ${KEEPALIVED_OPTIONS}
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
    }
    
    stop() {
        echo -n $"Stopping $prog: "
        killproc keepalived
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
    }
    
    reload() {
        echo -n $"Reloading $prog: "
        killproc keepalived -1
        RETVAL=$?
        echo
    }
    
    # See how we were called.
    case "$1" in
        start)
            start
            ;;
        stop)
            stop
            ;;
        reload)
            reload
            ;;
        restart)
            stop
            start
            ;;
        condrestart)
            if [ -f /var/lock/subsys/$prog ]; then
                stop
                start
            fi
            ;;
        status)
            status keepalived
            RETVAL=$?
            ;;
        *)
            echo "Usage: $0 {start|stop|reload|restart|condrestart|status}"
            RETVAL=1
    esac
    
    exit $RETVAL

    # 配置 keepvid.conf

    # master
    vim /etc/keepalived/keepalived.conf

    ! Configuration File for keepalived
    global_defs {
       notification_email {
       pengll@chinasoft.com
            }
       notification_email_from wsadmin@chinasoft.com
       smtp_server 1.1.1.2
       smtp_connect_timeout 30
       router_id LVS_MQ_DEVEL
    }
    
    vrrp_script chk_haproxy_status {
                    script "/bin/bash /etc/keepalived/check_haproxy.sh"
                    interval 3
                    weight 2
    }
    
    vrrp_instance VI_1 {
        state MASTER  ##备份服务器上将MASTER改为BACKUP   
        interface eth0
        virtual_router_id 71
        garp_master_delay 2 #主从切换时间,单位为秒。
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass rabbitmqpass
        }
    
    track_script {
            chk_haproxy_status
            }
    
        virtual_ipaddress {
            192.168.254.86
        }
    }
    
    vrrp_instance VI_2 {
        state MASTER
        interface eth1
        virtual_router_id 71
        garp_master_delay 2 #主从切换时间,单位为秒。
        priority 88
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass rabbitmqpass
        }
    
    track_script {
            chk_haproxy_status
            }
    
        virtual_ipaddress {
            1.1.1.1
        }
    }

    # slave
    vim /etc/keepalived/keepalived.conf

    ! Configuration File for keepalived
    global_defs {
       notification_email {
       pengll@chinasoft.com
            }
       notification_email_from wsadmin@chinasoft.com
       smtp_server 1.1.1.2
       smtp_connect_timeout 30
       router_id LVS_MQ_DEVEL
    }
    
    vrrp_script chk_haproxy_status {
                    script "/bin/sh /etc/keepalived/check_haproxy.sh"
                    interval 5    #运行间隔
                    weight 2
    }
    
    vrrp_instance VI_1 {
        state BACKUP  ##备份服务器上将MASTER改为BACKUP   
        interface eth0
        virtual_router_id 71
        garp_master_delay 2 #主从切换时间,单位为秒。
        priority 99 ##此处需要比master值小
        advert_int 1   ###MASTER与BACKUP节点间同步检查的时间间隔,单位为秒,两个节点设置必须一样
        authentication {
            auth_type PASS
            auth_pass rabbitmqpass
        }
    
    track_script {
            chk_haproxy_status
            }
    
        virtual_ipaddress {
            192.168.254.86
        }
    }
    
    vrrp_instance VI_2 {
        state BACKUP
        interface eth1
        virtual_router_id 71
        garp_master_delay 2 #主从切换时间,单位为秒。
        priority 87 ##此处需要比master值小
        advert_int 1 #MASTER与BACKUP节点间同步检查的时间间隔,单位为秒,两个节点设置必须一样
        authentication {
            auth_type PASS
            auth_pass rabbitmqpass
        }
    
    track_script {
            chk_haproxy_status
            }
    
        virtual_ipaddress {
            1.1.1.1
        }
    }

    # 系统配置
    vim /etc/sysconfig/keepalived

    # Options for keepalived. See `keepalived --help' output and keepalived(8) and
    # keepalived.conf(5) man pages for a list of all options. Here are the most
    # common ones :
    #
    # --vrrp               -P    Only run with VRRP subsystem.
    # --check              -C    Only run with Health-checker subsystem.
    # --dont-release-vrrp  -V    Dont remove VRRP VIPs & VROUTEs on daemon stop.
    # --dont-release-ipvs  -I    Dont remove IPVS topology on daemon stop.
    # --dump-conf          -d    Dump the configuration data.
    # --log-detail         -D    Detailed log messages.
    # --log-facility       -S    0-7 Set local syslog facility (default=LOG_DAEMON)
    #
    
    KEEPALIVED_OPTIONS="-D -d -S 0"

    cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

    # 添加开机自动启动keepalived
    chkconfig --add keepalived
    chkconfig keepalived on
    chkconfig --list keepalived

    # Options for keepalived. See `keepalived --help' output and keepalived(8) and
    # keepalived.conf(5) man pages for a list of all options. Here are the most
    # common ones :
    #
    # --vrrp               -P    Only run with VRRP subsystem.
    # --check              -C    Only run with Health-checker subsystem.
    # --dont-release-vrrp  -V    Dont remove VRRP VIPs & VROUTEs on daemon stop.
    # --dont-release-ipvs  -I    Dont remove IPVS topology on daemon stop.
    # --dump-conf          -d    Dump the configuration data.
    # --log-detail         -D    Detailed log messages.
    # --log-facility       -S    0-7 Set local syslog facility (default=LOG_DAEMON)
    #

    KEEPALIVED_OPTIONS="-D -d -S 0"

  • 相关阅读:
    HttpServletRequest和HttpServletResponse
    JavaWeb核心之Servlet
    XML,,DTD
    类加载器,,,,,反射,,,,,泛型擦除,,,,, 反射配置文件
    TCP通信(单线程多线程)
    UDP与TCP协议
    多线程和线程池 和线程安全
    python os.environ 读取和设置环境变量
    Python+Pytest+Allure+Git+Jenkins接口自动化框架(纯干货)
    idea解决activiti流程图bpmn文件乱码问题
  • 原文地址:https://www.cnblogs.com/reblue520/p/13297901.html
Copyright © 2011-2022 走看看