keepalived實現nginx高可用

NO IMAGE

keepalived直譯就是保持存活,在網路裡面就是保持線上了,也就是所謂的高可用或熱備,用來防止單點故障(單點故障是指一旦某一點出現故障就會導致整個系統架構的不可用)的發生,keepalived實現的基礎是vrrp,至於vrrp是什麼請直接看這裡vrrp,下面我們直接看應用吧。

keepalived使用

為了方便使用,寫了一個基於ubuntu 16.04 server 的一鍵配置指令碼,配置使用相關就在指令碼里見吧


#!/bin/bash
# nginx keepalived 高可用一鍵指令碼for ubuntu 16.04
if [ $# -ne 4 ]; then
echo "USAGE: $0 [MASTER|BACKUP] priority interface virtual_ipaddress"
exit 0
fi
echo -e 'Installing nginx'
apt-get install nginx -y > /dev/null 2<&1
echo -e 'Installing keepalived'
apt-get install keepalived -y > /dev/null 2<&1
echo -e 'Configuring keepalived'
if [ ! -e /etc/keepalived ];then
mkdir /etc/keepalived
fi
cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from email #表示傳送通知郵件時郵件源地址是誰
smtp_server 127.0.0.1 #表示傳送email時使用的smtp伺服器地址,這裡可以用本地的sendmail來實現
smtp_connect_timeout 30
router_id master #機器標識
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2 #指令碼執行間隔,單位秒
weight -5 #指令碼結果導致的優先順序變更:10表示優先順序 10;-10則表示優先順序-10
fall 3
rise 2
}
vrrp_instance VI_1 {
state $1 #state指定instance(Initial)的初始狀態,就是說在配置好後,這臺伺服器的初始狀態就是這裡指定的,但這裡指定的不算,還是得要通過競選通過優先順序來確定,裡如果這裡設定為master,但如若他的優先順序不及另外一臺,那麼這臺在傳送通告時,會傳送自己的優先順序,另外一臺發現優先順序不如自己的高,那麼他會就回搶佔為master
interface $3 #例項繫結的網絡卡,因為在配置虛擬IP的時候必須是在已有的網絡卡上新增的
virtual_router_id 51 #這裡設定VRID,這裡非常重要,相同的VRID為一個組,他將決定多播的MAC地址
priority $2 #設定本節點的優先順序,優先順序高的為master
advert_int 2 #檢查間隔,預設為1秒
authentication { #這裡設定認證
auth_type PASS #認證方式,可以是PASS或AH兩種認證方式
auth_pass 1111 #認證密碼
}
virtual_ipaddress { #這裡設定的就是VIP,也就是虛擬IP地址,他隨著state的變化而增加刪除,當state為master的時候就新增,當state為backup的時候刪除,這裡主要是有優先順序來決定的,和state設定的值沒有多大關係,這裡可以設定多個IP地址
$4
}
track_script {
chk_nginx
}
#dont_track_primary:忽略VRRP的interface錯誤
#track_interface:跟蹤介面,設定額外的監控,裡面任意一塊網絡卡出現問題,都會進入故障(FAULT)狀態,例如,用nginx做均衡器的時候,內網必須正常工作,如果內網出問題了,這個均衡器也就無法運作了,所以必須對內外網同時做健康檢查
#mcast_src_ip:傳送多播資料包時的源IP地址,這裡注意了,這裡實際上就是在那個地址上傳送VRRP通告,這個非常重要,一定要選擇穩定的網絡卡埠來傳送,這裡相當於heartbeat的心跳埠,如果沒有設定那麼就用預設的繫結的網絡卡的IP,也就是interface指定的IP地址
#garp_master_delay:在切換到master狀態後,延遲進行免費的ARP(gratuitous ARP)請求
#virtual_routes:原理和virtual ipaddress一樣,只不過這裡是增加和刪除路由
#lvs_sync_daemon_interface:lvs syncd繫結的網絡卡
#nopreempt:設定不搶佔,這裡只能設定在state為backup的節點上,而且這個節點的優先順序必須別另外的高。當主mysql恢復後不搶佔資源
#preempt_delay:搶佔延遲
#debug:debug級別
#notify_master:表示當切換到master狀態時,要執行的指令碼
#notify_backup:表示當切換到backup狀態時,要執行的指令碼
#notify_fault:
}
EOF
cat > /etc/keepalived/check_nginx.sh <<EOF
#!/bin/bash
# description:
# 定時檢視nginx是否存在,如果不存在則啟動nginx
# 如果啟動失敗,則停止keepalived
status=$(ps -C nginx --no-heading | wc -l)
if [ "${status}" = "0" ]; then
service nginx start
sleep 2
status2=$(ps -C nginx --no-heading | wc -l)
if [ "${status2}" = "0" ]; then
/etc/init.d/keepalived stop
fi
fi
EOF
echo -e "enable boot and starting"
service keepalived start
service nginx start