您好,登錄后才能下訂單哦!
小編給大家分享一下RabbitMQ+haProxy+keepalived的使用方法是什么,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
如有錯誤,隨時斧正,非常感謝!
為了AMQP服務的穩定性
我在兩臺服務器上建了AMQP集群,分別是10.71.13.24和10.71.13.25,以后簡稱為24、25服務器。假設AMQP客戶端直接連接24或25。如果24|25服務器宕機了,那么連接24|25的AMQP客戶端就無法工作,消費者也無法進行正常消費(以下以24舉例代表24|25單機的情況)。再者單機連接可能造成單機負載過高,而其他服務器空閑的狀態。此時則可以通過haProxy實現負載均衡。
在本地的配置如:
global #log 127.0.0.1 local0 #[日志輸出配置,所有日志都記錄在本機,通過local0輸出] log 127.0.0.1 local1 notice #定義haproxy 日志級別[error warringinfo debug] daemon #以后臺形式運行harpoxy nbproc 2 #設置進程數量 maxconn 4096 #默認最大連接數,需考慮ulimit-n限制 #user haproxy #運行haproxy的用戶 pidfile /var/run/haproxy.pid #haproxy 進程PID文件 #group www #運行haproxy的用戶所在的組 #ulimit-n 65535 #ulimit 的數量限制 #chroot /usr/share/haproxy #chroot運行路徑 #debug #haproxy 調試級別,建議只在開啟單進程的時候調試 #quiet ########默認配置############ defaults log global log 127.0.0.1 local0 info mode http #默認的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK option httplog #日志類別,采用httplog option dontlognull #不記錄健康檢查日志信息 retries 3 #兩次連接失敗就認為是服務器不可用,也可以通過后面設置 option forwardfor #如果后端服務器需要獲得客戶端真實ip需要配置的參數,可以從Http Header中獲得客戶端ip option httpclose #每次請求完畢后主動關閉http通道,haproxy不支持keep-alive,只能模擬這種模式的實現 option redispatch #當serverId對應的服務器掛掉后,強制定向到其他健康的服務器,以后將不支持 option abortonclose #當服務器負載很高的時候,自動結束掉當前隊列處理比較久的鏈接 maxconn 4096 #默認的最大連接數 #timeout http-keep-alive10s #默認持久連接超時時間 #timeout http-request 10s #默認http請求超時時間 #timeout queue 1m #默認隊列超時時間 balance roundrobin #設置默認負載均衡方式,輪詢方式 #balance source #設置默認負載均衡方式,類似于nginx的ip_hash #balnace leastconn #設置默認負載均衡方式,最小連接數 timeout connect 5s #連接超時 timeout client 120s # 客戶端超時 timeout server 120s #服務端超時 timeout check 2000 #心跳檢測超時ms #綁定配置 listen rabbitmq_cluster bind 0.0.0.0:5678 mode http #配置TCP模式 balance roundrobin #RabbitMQ集群節點配置 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檢測AMQP服務是否可用 # rise <value>:檢測到2次可用則可被確認再次可用。 # fall <value>:檢測到3次無法連接則認為服務不可用 # weight <value>:權重
配置完haProxy.cfg之后,啟動haProxy:sudo /etc/init.d/haproxy start
。(haproxy啟動腳本見最后)
配置解析:之前連接的socket是10.71.13.24:5672
,現在連接的socket是10.71.13.24:5678
。在25也可以按24的配置COPY一份,因此無論連接的是哪個服務器的5678端口最終都能實現負載均衡。然后還是有一個問題沒有解決,如果某個服務器宕機了怎么辦?這就是為什么要引入keepalived了。
關于keepalived的原理我不熟,也就不過多的去解讀。目前我只是想要解決我碰到的問題。為了解決AMQP最終能夠穩定服務,于是申請了一個虛擬IP-VIP:10.71.13.254。通過這個VIP則可以開始配置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表示主服務器,從服務器設置為BACKUP interface eth2 #指定檢測網卡,配置成eth0之后我無法連接到AMQP服務 virtual_router_id 1 priority 100 #優先級,BACKUP機器上的優先級至少小于50 advert_int 1 #設置主備之間的檢測時間,單位為s authentication { auth_type PASS auth_pass root123 } track_script { chk_haproxy } virtual_ipaddress { #VIP地址,可以設置多個 10.71.13.254 }}virtual_server 10.71.13.254 5672 { # 設置虛擬服務器 delay_loop 6 #設置運行情況檢查時間,單位s lb_algo wrr #設置負載調度算法,共有rr、wrr、lc、wlc、lblc、lblcr、dh、sh 這8種 lb_kind DR #設置LVS實現的負載均衡機制方式 VS/DR persistence_timeout 50 #指定在一定時間內來自同一IP的連接將會被轉發到同一RealServer中 protocol TCP # 這個real_server 即LVS的三大部分之一的RealServer,這里特指RabbitMQ服務 real_server 10.71.13.24 5678 { #配置服務節點 weight 1 #配置權重 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服務已經不可用而keepalived可用的情況,該腳本會嘗試重新啟動haProxy,如果啟動不成功則關閉keepalived。這樣keepalived的VIP就會漂移到BACKUP備份機,從而繼續保證服務。腳本的配置如下:
#! /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服務器上的配置和24的服務器基本一致,注意修改屬性:route_id、state、priority。
然后啟動keepalived:sudo /etc/init.d/keepalived start
。(啟動腳本見最后)
啟動完keepalived之后,我們再次連接AMQP服務就變成了:10.71.13.254:5762
,因為master是24服務器,所以實際真實響應的服務是10.71.13.24:5678
和10.71.13.25:5678
。因為采用的是加權輪詢且權重都是1,24和25會輪流響應VIP的請求。在haProxy中監聽了5678端口,并且采用了輪詢機制分發到24和25的5672端口。會發現keepalived的和haProxy都使用了輪詢機制,能不能把其中的某一處去掉呢?增加了VIP之后如果master宕機之后,就會選舉一個從機成為主機,接管原主機的服務。當人工修復好了原主機之后,從機會把服務重新還給主機去接管,自己還原成原來的狀態。
haProxy的啟動腳本
#! /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啟動腳本:
#!/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
看完了這篇文章,相信你對RabbitMQ+haProxy+keepalived的使用方法是什么有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。