Keepalived學習筆記二:keepalived實現nginx的高可用
本文所需環境 tomcat + nginx + keepalived 。關於tomcat和nginx請自行學習。
一.主節點:修改keepalived.conf 的內容(keepalived的配置檔案預設放在/etc/keeplived下,安裝的時候啟動不了,後來手動建立了keeplived和keepalived.conf檔案,才啟動成功。)內容如下:
global_defs { notification_email { [email protected] } notification_email_from [email protected]
smtp_server smtp.hysec.com smtp_connection_timeout 30 router_id nginx_master # 設定nginx master的id,在一個網路應該是唯一的 } vrrp_script chk_http_port { script "/usr/local/src/check_nginx_pid.sh" #最後手動執行下此指令碼,以確保此指令碼能夠正常執行 interval 2 #(檢測指令碼執行的間隔,單位是秒) weight 2 } vrrp_instance VI_1 { state MASTER # 指定keepalived的角色,MASTER為主,BACKUP為備 interface eth0 # 當前進行vrrp通訊的網路介面卡(當前centos的網絡卡) virtual_router_id 66 # 虛擬路由編號,主從要一直 priority 100 # 優先順序,數值越大,獲取處理請求的優先順序越高 advert_int 1 # 檢查間隔,預設為1s(vrrp組播週期秒數) authentication { auth_type PASS auth_pass 1111 } track_script { chk_http_port #(呼叫檢測指令碼) } virtual_ipaddress { 192.168.30.200 # 定義虛擬ip(VIP),可多設,每行一個,且需要和nginx在同一個網段 } }
nginx檢測指令碼check_nginx_pid.sh內容如下:
#!/bin/bash A=`ps -C nginx --no-header |wc -l` if [ $A -eq 0 ];then /usr/local/nginx/sbin/nginx #重啟nginx if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #nginx重啟失敗,則停掉keepalived服務,進行VIP轉移 killall keepalived fi fi
此時完成了keepalived對nginx的監控。keepalived會每兩秒(通過interval 2配置時間間隔) 傳送心跳檢查nginx埠是否能正常訪問。如果不能則執行指令碼重啟nginx(見check_nginx_pid.sh)。
驗證步驟:
啟動nginx,啟動keepalived。
3,將 interval (檢測指令碼執行的間隔,單位是秒)設定為10秒,停止nginx(./nginx -s stop)
5.啟動keepalived,此時keepalived傳送心跳發現nginx埠不通,執行指令碼啟動nginx 此時http://192.168.30.130/architecture1web/訪問正常
以上測試說明keepalived會監控nginx的埠狀態。如果nginx掛了會自動執行指令碼啟動nginx。
上面的操作只是單臺keeplived對nginx的監控。下面的是對keeplived做主從,當主節點掛了之後,從節點自動接管虛擬ip。
二.從節點:修改keepalived.conf 的內容如下:注意interface eth1 必須是真是的網絡卡地址通過ip addr查詢
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server smtp.hysec.com
smtp_connection_timeout 30
router_id nginx_backup # 設定nginx backup的id,在一個網路應該是唯一的
}
vrrp_script chk_http_port {
script "/usr/local/keepalived/sh/check_nginx_pid.sh"
interval 2 #(檢測指令碼執行的間隔)
weight 2
}
vrrp_instance VI_1 {
state BACKUP # 指定keepalived的角色,MASTER為主,BACKUP為備
interface eth1 # 當前進行vrrp通訊的網路介面卡(當前centos的網絡卡)
virtual_router_id 66 # 虛擬路由編號,主從要一直
priority 99 # 優先順序,數值越大,獲取處理請求的優先順序越高
advert_int 1 # 檢查間隔,預設為1s(vrrp組播週期秒數)
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port #(呼叫檢測指令碼)
}
virtual_ipaddress {
192.168.30.200 # 定義虛擬ip(VIP),可多設,每行一個
}
}
啟動主節點的 keepalived (./keepalived),檢視啟動日誌如下:
Oct 7 02:26:16 yuyivie Keepalived_vrrp[9930]: Unknown keyword 'smtp_connection_timeout'
Oct 7 02:26:17 yuyivie Keepalived_vrrp[9930]: Using LinkWatch kernel netlink reflector...
Oct 7 02:26:17 yuyivie Keepalived_vrrp[9930]: VRRP_Script(chk_http_port) succeeded
Oct 7 02:26:18 yuyivie Keepalived_vrrp[9930]: VRRP_Instance(VI_1) Transition to MASTER STATE
Oct 7 02:26:18 yuyivie Keepalived_vrrp[9930]: VRRP_Instance(VI_1) Effective priority = 102
Oct 7 02:26:19 yuyivie Keepalived_vrrp[9930]: VRRP_Instance(VI_1) Entering MASTER STATE
Oct 7 02:26:21 yuyivie Keepalived_healthcheckers[9929]: Unknown keyword 'smtp_connection_timeout'
Oct 7 02:26:22 yuyivie Keepalived_healthcheckers[9929]: Using LinkWatch kernel netlink reflector
啟動從節點的keepalived,檢視日誌如下:
[[email protected] sbin]# tail -f /var/log/messages
Oct 7 02:26:41 yuyivie Keepalived_vrrp[8995]: Opening file '/etc/keepalived/keepalived.conf'.
Oct 7 02:26:41 yuyivie Keepalived_healthcheckers[8994]: Registering Kernel netlink command channel
Oct 7 02:26:41 yuyivie Keepalived_healthcheckers[8994]: Opening file '/etc/keepalived/keepalived.conf'.
Oct 7 02:26:41 yuyivie Keepalived_vrrp[8995]: Unknown keyword 'smtp_connection_timeout'
Oct 7 02:26:41 yuyivie Keepalived_healthcheckers[8994]: Unknown keyword 'smtp_connection_timeout'
Oct 7 02:26:42 yuyivie Keepalived_vrrp[8995]: Using LinkWatch kernel netlink reflector...
Oct 7 02:26:42 yuyivie Keepalived_vrrp[8995]: VRRP_Instance(VI_1) Entering BACKUP STATE
Oct 7 02:26:42 yuyivie Keepalived_healthcheckers[8994]: Using LinkWatch kernel netlink reflector...
關閉主節點的keepalived,(此時從節點會自動頂上來做主節點)檢視下圖從節點日誌發現從節點自動變成主節點了。
Oct 7 02:43:18 yuyivie Keepalived_vrrp[8995]: pid 10034 exited with status 32256
Oct 7 02:43:20 yuyivie Keepalived_vrrp[8995]: pid 10036 exited with status 32256
Oct 7 02:43:21 yuyivie Keepalived_vrrp[8995]: VRRP_Instance(VI_1) Transition to MASTER STATE
Oct 7 02:43:22 yuyivie Keepalived_vrrp[8995]: VRRP_Instance(VI_1) Entering MASTER STATE
Oct 7 02:43:22 yuyivie Keepalived_vrrp[8995]: pid 10038 exited with status 32256
Oct 7 02:43:24 yuyivie Keepalived_vrrp[8995]: pid 10040 exited with status 32256
重新啟動主節點的keepalived,此時主節點會將重新託管虛擬ip,此時檢視從節點(因為主節點失效此時之前的從節點變成了主節點)日誌如下:
Oct 7 02:47:25 yuyivie Keepalived_vrrp[8995]: VRRP_Instance(VI_1) Received higher prio advert 100
Oct 7 02:47:25 yuyivie Keepalived_vrrp[8995]: VRRP_Instance(VI_1) Entering BACKUP STATE
Oct 7 02:47:27 yuyivie Keepalived_vrrp[8995]: pid 10283 exited with status 32256
Oct 7 02:47:29 yuyivie Keepalived_vrrp[8995]: pid 10285 exited with status 32256
以上測試說明主節點失效後從節點會變成主節點來託管虛擬ip,當重啟失效的主節點之後,主節點會重新重新託管虛擬ip,之前變為主節點的從節點,依舊為從節點。
總結:keepalived主備 + nginx 做服務高可用,。
託管一個虛擬ip:
a.主節點監控nginx,nginx掛了嘗試重啟。重啟失敗則自己pkill停止自己。
b.從節點監控主節點,主節點掛了,則自己頂上來做主節點。
c. 主節點重啟後,從節點讓出託管的主節點。。