1. 程式人生 > >Nginx(七):keepalived實現Nginx負載均衡伺服器的雙機高可用

Nginx(七):keepalived實現Nginx負載均衡伺服器的雙機高可用

前言

之前咱們通過 Nginx(六):Nginx HTTP負載均衡和反向代理的配置與優化 和 Nginx+tomcat組合實現高併發場景的動靜分離和負載均衡方案 這兩篇文章瞭解了Nginx對高併發應用伺服器tomcat的負載均衡優化,所有的請求都會先經過Nginx,Nginx就像是一座城池的城門,它的堅固耐用程度顯然就變得極為重要。

為了防止一臺Nginx伺服器崩潰帶來無法預估的災難,我們就必須實現Nginx負載均衡伺服器的雙機高可用,顯然用keepalived來實現是非常合適的。

環境準備

192.168.0.221:nginx + keepalived   master
192.168.0.222:nginx + keepalived backup 192.168.0.223:tomcat 192.168.0.224:tomcat
虛擬ip(VIP):192.168.0.200,對外提供服務的ip,也可稱作浮動ip

各個元件之間的關係圖如下:

 

tomcat做應用伺服器,Nginx實現負載均衡

在前言裡已經說過,一定要先讀讀那兩篇文章,然後才有下邊的nginx高可用。

keepalived實現nginx高可用(HA)

keepalived的安裝本文就不講述了,具體keepalived知識參閱:Keepalived介紹以及在Linux系統下的安裝與配置

keepalived作用其實在第一張圖中已經有所體現,主要起到兩個作用:實現VIP到本地ip的對映; 以及檢測nginx狀態。

master上的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.0.200            # 定義虛擬ip(VIP),可多設,每行一個
    }
}
複製程式碼

backup上的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_backup              # 設定nginx backup的id,在一個網路應該是唯一的
}
vrrp_script chk_http_port {
    script "/usr/local/src/check_nginx_pid.sh"
    interval 2                          #(檢測指令碼執行的間隔)
    weight 2
}
vrrp_instance VI_1 {
    state BACKUP                        # 指定keepalived的角色,MASTER為主,BACKUP為備
    interface eth0                      # 當前進行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.0.200                   # 定義虛擬ip(VIP),可多設,每行一個
    }
}
複製程式碼

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

# service keepalived start

訪問VIP,效果如下:

我們來看下keepalived的日誌資訊

master(192.168.0.221):

backup(192.168.0.222):

當我們把master上的keepalived停掉(模擬宕機),再來看下keepalived日誌

原master(192.168.0.221):

原backup(192.168.0.222):

通過VIP可以正常訪問服務,前端請求感受不到後端nginx的切換;重新喚醒原master(192.168.0.221)的測試這裡就不進行了,大家自行測試。

注意點

  1、執行指令碼時報錯:/bin/sh^M: bad interpreter: 沒有那個檔案或目錄 

    因為作業系統是windows,我在windows下編輯的指令碼,所以有可能有不可見字元。指令碼檔案是DOS格式的, 即每一行的行尾以回車符和換行符來標識, 其ASCII碼分別是0x0D, 0x0A。可以有很多種辦法看這個檔案是DOS格式的還是UNIX格式的, 還是MAC格式的

    解決方法:

      vim filename

      :set ff? #可以看到dos或unix的字樣. 如果的確是dos格式的。

      :set ff=unix #把它強制為unix格式的, 然後存檔退出。

      再次執行指令碼。

    從windows編輯檔案再拷貝到linux時要特別注意,另外,指令碼需要賦予可執行許可權才能執行,可執行檔案的一種直觀表現就是檔案本身呈綠色。

  2、負載均衡最好進行多瀏覽器測試,有些瀏覽器會快取,會產生沒有負載均衡的效果,例如我這次測試中谷歌瀏覽器就出現了類似的情況(還沒搞清楚是否是快取的原因),火狐,360、IE瀏覽器都是正常的負載均衡效果。

  3、請求走向

    訪問虛擬IP(VIP),keepalived將請求對映到本地nginx,nginx將請求轉發至tomcat,例如:http://192.168.0.200/myWeb/,被對映成http://192.168.0.221/myWeb/,埠是80,而221上nginx的埠正好是80;對映到nginx上後,nginx再進行請求的轉發。

    keepalived伺服器的ip情況

    

    VIP總會在keepalived伺服器中的某一臺上,也只會在其中的某一臺上;VIP繫結的伺服器上的nginx就是master,當VIP所在的伺服器宕機了,keepalived會將VIP轉移到backup上,並將backup提升為master。

  4、VIP也稱浮動ip,是公網ip,與域名進行對映,對外提供服務; 其他ip一般而言都是內網ip, 外部是直接訪問不了的