1. 程式人生 > >Keepalived學習筆記二:keepalived實現nginx的高可用

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. 主節點重啟後,從節點讓出託管的主節點。。