RabbitMQ+haProxy+keepalived的使用方法是什么-創(chuàng)新互聯(lián)

小編給大家分享一下RabbitMQ+haProxy+keepalived的使用方法是什么,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

創(chuàng)新互聯(lián)建站從2013年成立,先為昭平等服務(wù)建站,昭平等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢(xún)服務(wù)。為昭平企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

                                                       

前言

如有錯(cuò)誤,隨時(shí)斧正,非常感謝!

為什么要使用haProxy+keepalived呢?

為了AMQP服務(wù)的穩(wěn)定性

首先先說(shuō)下為什么要使用haProxy。

我在兩臺(tái)服務(wù)器上建了AMQP集群,分別是10.71.13.24和10.71.13.25,以后簡(jiǎn)稱(chēng)為24、25服務(wù)器。假設(shè)AMQP客戶(hù)端直接連接24或25。如果24|25服務(wù)器宕機(jī)了,那么連接24|25的AMQP客戶(hù)端就無(wú)法工作,消費(fèi)者也無(wú)法進(jìn)行正常消費(fèi)(以下以24舉例代表24|25單機(jī)的情況)。再者單機(jī)連接可能造成單機(jī)負(fù)載過(guò)高,而其他服務(wù)器空閑的狀態(tài)。此時(shí)則可以通過(guò)haProxy實(shí)現(xiàn)負(fù)載均衡。

在本地的配置如:

global
    #log 127.0.0.1 local0 #[日志輸出配置,所有日志都記錄在本機(jī),通過(guò)local0輸出]
    log 127.0.0.1 local1 notice #定義haproxy 日志級(jí)別[error warringinfo debug]      
    daemon #以后臺(tái)形式運(yùn)行harpoxy
    nbproc 2 #設(shè)置進(jìn)程數(shù)量
    maxconn 4096 #默認(rèn)大連接數(shù),需考慮ulimit-n限制
    #user haproxy #運(yùn)行haproxy的用戶(hù)
    pidfile /var/run/haproxy.pid #haproxy 進(jìn)程PID文件
    #group www #運(yùn)行haproxy的用戶(hù)所在的組
    #ulimit-n 65535 #ulimit 的數(shù)量限制
    #chroot /usr/share/haproxy #chroot運(yùn)行路徑
    #debug #haproxy 調(diào)試級(jí)別,建議只在開(kāi)啟單進(jìn)程的時(shí)候調(diào)試
    #quiet

########默認(rèn)配置############
defaults
    log global
    log 127.0.0.1 local0 info
    mode http #默認(rèn)的模式mode { tcp|http|health },tcp是4層,http是7層,health只會(huì)返回OK
    option httplog #日志類(lèi)別,采用httplog
    option dontlognull #不記錄健康檢查日志信息
    retries 3 #兩次連接失敗就認(rèn)為是服務(wù)器不可用,也可以通過(guò)后面設(shè)置
    option forwardfor #如果后端服務(wù)器需要獲得客戶(hù)端真實(shí)ip需要配置的參數(shù),可以從Http Header中獲得客戶(hù)端ip
    option httpclose #每次請(qǐng)求完畢后主動(dòng)關(guān)閉http通道,haproxy不支持keep-alive,只能模擬這種模式的實(shí)現(xiàn)
    option redispatch #當(dāng)serverId對(duì)應(yīng)的服務(wù)器掛掉后,強(qiáng)制定向到其他健康的服務(wù)器,以后將不支持
    option abortonclose #當(dāng)服務(wù)器負(fù)載很高的時(shí)候,自動(dòng)結(jié)束掉當(dāng)前隊(duì)列處理比較久的鏈接
    maxconn 4096 #默認(rèn)的大連接數(shù)
    #timeout http-keep-alive10s #默認(rèn)持久連接超時(shí)時(shí)間
    #timeout http-request 10s #默認(rèn)http請(qǐng)求超時(shí)時(shí)間
    #timeout queue 1m #默認(rèn)隊(duì)列超時(shí)時(shí)間
    balance roundrobin #設(shè)置默認(rèn)負(fù)載均衡方式,輪詢(xún)方式
    #balance source #設(shè)置默認(rèn)負(fù)載均衡方式,類(lèi)似于nginx的ip_hash
    #balnace leastconn #設(shè)置默認(rèn)負(fù)載均衡方式,最小連接數(shù)
    timeout connect 5s #連接超時(shí)
    timeout client 120s # 客戶(hù)端超時(shí)
    timeout server 120s #服務(wù)端超時(shí)
    timeout check 2000 #心跳檢測(cè)超時(shí)ms
#綁定配置
listen rabbitmq_cluster
    bind 0.0.0.0:5678
    mode http #配置TCP模式
    balance roundrobin
    #RabbitMQ集群節(jié)點(diǎn)配置
    server rmq_node_13_24 10.71.13.24:5672 check inter 5000 rise 2 fall 3 weight 1
    server rmq_node_13_25 10.71.13.25:5672 check inter 5000 rise 2 fall 3 weight 1
    # server <name> <ip>:<port> check inter <value> rise <value> fall <value> weight <value>
    # check inter <value>:每隔5000ms檢測(cè)AMQP服務(wù)是否可用
    # rise <value>:檢測(cè)到2次可用則可被確認(rèn)再次可用。
    # fall <value>:檢測(cè)到3次無(wú)法連接則認(rèn)為服務(wù)不可用
    # weight <value>:權(quán)重

配置完haProxy.cfg之后,啟動(dòng)haProxy:sudo /etc/init.d/haproxy start。(haproxy啟動(dòng)腳本見(jiàn)最后)
配置解析:之前連接的socket是10.71.13.24:5672,現(xiàn)在連接的socket是10.71.13.24:5678。在25也可以按24的配置COPY一份,因此無(wú)論連接的是哪個(gè)服務(wù)器的5678端口最終都能實(shí)現(xiàn)負(fù)載均衡。然后還是有一個(gè)問(wèn)題沒(méi)有解決,如果某個(gè)服務(wù)器宕機(jī)了怎么辦?這就是為什么要引入keepalived了。

再談keepalived的使用

關(guān)于keepalived的原理我不熟,也就不過(guò)多的去解讀。目前我只是想要解決我碰到的問(wèn)題。為了解決AMQP最終能夠穩(wěn)定服務(wù),于是申請(qǐng)了一個(gè)虛擬IP-VIP:10.71.13.254。通過(guò)這個(gè)VIP則可以開(kāi)始配置keepalived.conf了。

! Configuration File for keepalived

global_defs {
   router_id Node_Master  # 路由ID,主備的不能相同}vrrp_script chk_haproxy {
    script "/etc/keepalived/check_haproxy.sh"
    interval 5
    weight 2}vrrp_instance VI_1 {
    state MASTER  #keepalived的角色。Master表示主服務(wù)器,從服務(wù)器設(shè)置為BACKUP
    interface eth2 #指定檢測(cè)網(wǎng)卡,配置成eth0之后我無(wú)法連接到AMQP服務(wù)
    virtual_router_id 1
    priority 100 #優(yōu)先級(jí),BACKUP機(jī)器上的優(yōu)先級(jí)至少小于50
    advert_int 1 #設(shè)置主備之間的檢測(cè)時(shí)間,單位為s
    authentication {
        auth_type PASS
        auth_pass root123    }

    track_script {
        chk_haproxy    }

    virtual_ipaddress { #VIP地址,可以設(shè)置多個(gè)        10.71.13.254
    }}virtual_server 10.71.13.254 5672 { # 設(shè)置虛擬服務(wù)器
    delay_loop 6 #設(shè)置運(yùn)行情況檢查時(shí)間,單位s
    lb_algo wrr #設(shè)置負(fù)載調(diào)度算法,共有rr、wrr、lc、wlc、lblc、lblcr、dh、sh 這8種
    lb_kind DR #設(shè)置LVS實(shí)現(xiàn)的負(fù)載均衡機(jī)制方式 VS/DR
    persistence_timeout 50 #指定在一定時(shí)間內(nèi)來(lái)自同一IP的連接將會(huì)被轉(zhuǎn)發(fā)到同一RealServer中
    protocol TCP

    # 這個(gè)real_server 即LVS的三大部分之一的RealServer,這里特指RabbitMQ服務(wù)
    real_server 10.71.13.24 5678 { #配置服務(wù)節(jié)點(diǎn)
        weight 1  #配置權(quán)重        TCP_CHECK {
            nb_get retry 3
            connect_timeout 3
            delay_before_retry 3
            connect_port 5672
        }
    }

    real_server 10.71.13.25 5678 {
        weight 1
        TCP_CHECK {
            nb_get retry 3
            connect_timeout 3
            delay_before_retry 3
            connect_port 5672
        }
    }
  }virtual_server 10.71.13.254 15672 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    persistence_timeout 50
    protocol TCP
    real_server 10.71.13.24 15672 {
        weight 1
        TCP_CHECK {
            nb_get retry 3
            connect_timeout 3
            delay_before_retry 3
            connect_port 15672
        }
    }
    real_server 10.71.13.25 15672 {
        weight 1
        TCP_CHECK {
            nb_get retry 3
            connect_timeout 3
            delay_before_retry 3
            connect_port 15672
        }
    }}

check_haproxy.sh腳本的目的是為了防止haProxy服務(wù)已經(jīng)不可用而keepalived可用的情況,該腳本會(huì)嘗試重新啟動(dòng)haProxy,如果啟動(dòng)不成功則關(guān)閉keepalived。這樣keepalived的VIP就會(huì)漂移到BACKUP備份機(jī),從而繼續(xù)保證服務(wù)。腳本的配置如下:

#! /bin/bashif [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
    sudo service haproxy restartfisleep 2if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
    sudo service keepalived stopfi

在25服務(wù)器上的配置和24的服務(wù)器基本一致,注意修改屬性:route_id、state、priority。
然后啟動(dòng)keepalived:sudo /etc/init.d/keepalived start。(啟動(dòng)腳本見(jiàn)最后)

啟動(dòng)完keepalived之后,我們?cè)俅芜B接AMQP服務(wù)就變成了:10.71.13.254:5762,因?yàn)閙aster是24服務(wù)器,所以實(shí)際真實(shí)響應(yīng)的服務(wù)是10.71.13.24:567810.71.13.25:5678。因?yàn)椴捎玫氖羌訖?quán)輪詢(xún)且權(quán)重都是1,24和25會(huì)輪流響應(yīng)VIP的請(qǐng)求。在haProxy中監(jiān)聽(tīng)了5678端口,并且采用了輪詢(xún)機(jī)制分發(fā)到24和25的5672端口。會(huì)發(fā)現(xiàn)keepalived的和haProxy都使用了輪詢(xún)機(jī)制,能不能把其中的某一處去掉呢?增加了VIP之后如果master宕機(jī)之后,就會(huì)選舉一個(gè)從機(jī)成為主機(jī),接管原主機(jī)的服務(wù)。當(dāng)人工修復(fù)好了原主機(jī)之后,從機(jī)會(huì)把服務(wù)重新還給主機(jī)去接管,自己還原成原來(lái)的狀態(tài)。

haProxy和keepalived的啟動(dòng)腳本

haProxy的啟動(dòng)腳本

#! /bin/shset -ePATH=/sbin:/bin:/usr/sbin:/usr/binPROGDIR=/opt/haproxy-1.7.11PROGNAME=haproxyDAEMON=$PROGDIR/$PROGNAMECONFIG=$PROGDIR/conf/$PROGNAME.cfg
# PIDFILE=$PROGDIR/conf/$PROGNAME.pidPIDFILE=/var/run/haproxy.pidDESC="HAProxy daemon"SCRIPTNAME=/etc/init.d/$PROGNAME# Gracefully exit if the package has been removed.test -x $DAEMON || exit 0start(){
       echo -e "Starting $DESC: $PROGNAME\n"
       $DAEMON -f $CONFIG
       echo "."}stop(){
       echo -e "Stopping $DESC: $PROGNAME\n"
       haproxy_pid="$(cat $PIDFILE)"
       kill $haproxy_pid
       echo "."}restart(){
       echo -e "Restarting $DESC: $PROGNAME\n"
       $DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE)
       echo "."}case "$1" in
 start)
       start       ;;
 stop)
       stop       ;;
 restart)
       restart       ;;
 *)
       echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
       exit 1
       ;;esac

exit 0

keepalived啟動(dòng)腳本:

#!/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/keepalivedRETVAL=0prog="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=1esac

exit $RETVAL

看完了這篇文章,相信你對(duì)RabbitMQ+haProxy+keepalived的使用方法是什么有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝各位的閱讀!

分享題目:RabbitMQ+haProxy+keepalived的使用方法是什么-創(chuàng)新互聯(lián)
新聞來(lái)源:http://bm7419.com/article14/cdigde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化動(dòng)態(tài)網(wǎng)站、建站公司、服務(wù)器托管、網(wǎng)頁(yè)設(shè)計(jì)公司、微信公眾號(hào)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化