配置解析:之前連接的socket是10.71.13.24:5672,現(xiàn)在連接的socket是10.71.13.24:5678。在25也可以按24的配置COPY一份,因此無論連接的是哪個服務器的5678端口最終都能實現(xiàn)負載均衡。然后還是有一個問題沒有解決,如果某個服務器宕機了怎么辦?這就是為什么要引入keepalived了。
再談keepalived的使用
關(guān)于keepalived的原理我不熟,也就不過多的去解讀。目前我只是想要解決我碰到的問題。為了解決AMQP最終能夠穩(wěn)定服務,于是申請了一個虛擬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 eth1 #指定檢測網(wǎng)卡,配置成eth0之后我無法連接到AMQP服務
virtual_router_id 1
priority 100 #優(yōu)先級,BACKUP機器上的優(yōu)先級至少小于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 #設置負載調(diào)度算法,共有rr、wrr、lc、wlc、lblc、lblcr、dh、sh 這8種
lb_kind DR #設置LVS實現(xiàn)的負載均衡機制方式 VS/DR
persistence_timeout 50 #指定在一定時間內(nèi)來自同一IP的連接將會被轉(zhuǎn)發(fā)到同一RealServer中
protocol TCP
# 這個real_server 即LVS的三大部分之一的RealServer,這里特指RabbitMQ服務
real_server 10.71.13.24 5678 { #配置服務節(jié)點
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服務已經(jīng)不可用而keepalived可用的情況,該腳本會嘗試重新啟動haProxy,如果啟動不成功則關(guān)閉keepalived。這樣keepalived的VIP就會漂移到BACKUP備份機,從而繼續(xù)保證服務。腳本的配置如下:
#! /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。因為采用的是加權(quán)輪詢且權(quán)重都是1,24和25會輪流響應VIP的請求。在haProxy中監(jiān)聽了5678端口,并且采用了輪詢機制分發(fā)到24和25的5672端口。會發(fā)現(xiàn)keepalived的和haProxy都使用了輪詢機制,能不能把其中的某一處去掉呢?增加了VIP之后如果master宕機之后,就會選舉一個從機成為主機,接管原主機的服務。當人工修復好了原主機之后,從機會把服務重新還給主機去接管,自己還原成原來的狀態(tài)。
haProxy和keepalived的啟動腳本
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
相關(guān)學習推薦:php編程(視頻)
更多關(guān)于云服務器,域名注冊,虛擬主機的問題,請訪問西部數(shù)碼官網(wǎng):m.ps-sw.cn