1. 程式人生 > 其它 >3.Nginx的高可用叢集

3.Nginx的高可用叢集

高可用示意圖如下:
NGINX主從備份
    NGINX實現主從備份目前主流方案是Keepalived+Nginx實現雙機熱備。

Keepalived介紹:
    Keepalived是一個基於VRRP協議來實現的服務高可用方案,可以利用其來避免IP單點故障,類似的工具還有heartbeat、corosync、pacemaker。
    但是它一般不會單獨出現,而是與其它負載均衡技術(如lvs、haproxy、nginx)一起工作來達到叢集的高可用

VRRP協議:
    虛擬路由冗餘協議
    可以認為它是實現路由器高可用的容錯協議,即將N臺提供相同功能的路由器組成一個路由器組(Router Group),這個組裡面有一個master和多個backup,
    但在外界看來就像一臺一樣,構成虛擬路由器,擁有一個虛擬IP(vip,也就是路由器所在區域網內其他機器的預設路由),
    佔有這個IP的master實際負責ARP相應和轉發IP資料包,組中的其它路由器作為備份的角色處於待命狀態。
    master會發組播訊息,當backup在超時時間內收不到vrrp包時就認為master宕掉了,
    這時就需要根據VRRP的優先順序來選舉一個backup當master,保證路由器的高可用
    
具體實現原理:
    1)Master沒掛,則Master佔有vip且nginx執行在Master上
    2)Master掛了,則backup搶佔vip且在backup上執行nginx服務
    3)如果master伺服器上的nginx服務掛了,則vip資源轉移到backup伺服器上
    4)檢測後端伺服器的健康狀態
    Master和Backup兩邊都開啟nginx服務,無論Master還是Backup,當其中的一個keepalived服務停止後,vip都會漂移到keepalived服務還在的節點上

開始部署實現:
1.準備工作
    1.1有兩臺伺服器:wmd01 wmd02
    1.2各自安裝nginx和keepalived 
        1.keepalived 通過yum安裝:
            yum install keepalived –y
            安裝後,keepalive的配置檔案路徑:/etc/keepalived/keepalivec.conf 
2.nginx的配置檔案:
    兩個伺服器的nginx配置檔案都相同,沒有什麼變動,做主備節點
3.keepalive的配置:/etc/keepalived/keepalivec.conf
    主節點(Master節點配置)
    (1)修改/etc/keepalived/keepalivec.conf 配置檔案
        global_defs {
        	 notification_email {
        		 [email protected]
        		 [email protected]
        		 [email protected]
        	 }
        	 notification_email_from [email protected]
             #當前主機ip
        	 smtp_server 192.168.17.129
        	 smtp_connect_timeout 30
        	 # 重點1:通過它,可以訪問到主機,在hosts檔案中,要做對映關係,類似於 127.0.0.1 LVS_DEVEL,host檔案路徑:/etc/hosts
        	 router_id LVS_DEVEL  
        }
        
        #重點2:檢測指令碼,目的是定時執行,檢測nginx的狀態,如果掛了嘗試重啟,如果啟動失敗,則停止該節點的nginx和keepaive
        vrrp_script chk_http_port {
        	 script "/usr/local/src/nginx_check.sh"	 # 執行指令碼所在的位置,自定義指令碼後面會提及
        	 interval 2 	#檢測指令碼執行的間隔,單位秒,每個2秒執行一次指令碼
        	 weight 2       #指令碼執行滿足,權重加2,這裡其實沒搞明白..
        }

        #重點3:主備節點的區別配置	
        vrrp_instance VI_1 {
        	 state MASTER	 # 備份伺服器上將 MASTER 改為 BACKUP
        	 interface ens33	 # 繫結的網絡卡,通過ipconfig檢視
        	 virtual_router_id 51	 # 主、備機的 virtual_router_id 必須相同
        	 priority 100 	# 主、備機取不同的優先順序,主機值較大,備份機值較小(比如主機100,備機90)
        	 advert_int 1 	#每隔一秒傳送一次心跳,確保從伺服器(keepalive)是否還活著
        	 authentication {		# 心跳檢測需要的密碼
        		 auth_type PASS
        		 auth_pass 1111
         	}
        	 virtual_ipaddress {
            	 192.168.17.50 	# VRRP H 虛擬地址(重點:虛擬ip配置,客戶端通過該ip進行訪問,主節點和備用節點誰佔有這個ip,誰提供反向代理服務)
        	 }
        }
    (2)在/usr/local/src 新增檢測指令碼nginx_check.sh,檢查Nginx是否還活著
            #!/bin/bash
            #檢視ningx的程序號,並統計數量
            A=`ps -C nginx –no-header |wc -l`
            #等於0時,即nginx掛了,嘗試重啟
            if [ $A -eq 0 ];then
             /usr/local/nginx/sbin/nginx 	#Nginx啟動命令的位置
             sleep 2
             #啟動失敗,殺掉keepalive
             if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
             killall keepalived
             fi
            fi
    (3)把兩臺伺服器上 nginx 和 keepalived 啟動
            啟動 nginx:	./nginx
            啟動 keepalived:	systemctl start keepalived.service
可以使用ipconfig,檢視虛擬Ip的繫結 5、最終測試 (1)在瀏覽器位址列輸入 虛擬 ip 地址 192.168.17.50(虛擬ip:這就是keepalive的強大處,統一了nginx叢集的統一入口) (2)把主伺服器上的(192.168.17.129)Nginx 和 keepalived 停止,再輸入 192.168.17.50,依舊可以訪問Nginx。