寫給後端的Nginx初級入門教程:配置高可用叢集

韓數發表於2019-11-02

在上一篇寫給後端的Nginx初級入門教程:實戰篇文章中我們從實際的程式碼出發,比較粗略地講解了Nginx配置檔案的結構,以及常用的功能比如複雜均衡,反向代理,動靜分離的簡單配置,事情到這裡就結束了嗎,當然沒有,就拿負載均衡為例,還記得我們基礎篇關於反向代理給的那張圖嗎?我們將它做一個小小的修改,變成我們的負載均衡圖,如下圖所示:

寫給後端的Nginx初級入門教程:配置高可用叢集

剛開始這麼一看,也沒發現什麼問題啊,請求經過我們的負載均衡伺服器,通過不同的策略分發到不同的伺服器上進行處理,就算一臺伺服器掛了,也會有其他的伺服器繼續頂上,這個邏輯簡直滿分有木有,媽媽再也不用擔心巨大的請求把我的伺服器累崩啦。

等等,看似平靜的湖面下面其實往往波濤洶湧,知識點吶,朋友們,面試可能要考的

可是,,萬一,,我們負載均衡伺服器掛了,,那不就徹底GG了?

臥槽,臥槽,臥槽,我怎麼沒有想到,那怎麼辦?

別慌,上有上策,下有對策,兵來將擋,水來土掩,為了防止這種被人掐脖子情況的發生,就有人提供了另外一種思路,是什麼呢? 其實很簡單,你原來不是隻有一個負載均衡伺服器麼,掛了玩不起,我弄兩臺負載均衡伺服器不就得了,一臺掛了,我繼續用另外一臺不就好了嗎,哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈,臭弟弟,沒招了吧,於是上面的那張圖就變成了這樣:

寫給後端的Nginx初級入門教程:配置高可用叢集

當我們向服務端發起請求的時候,用的地址並不是我們配置的兩臺Nginx伺服器的IP地址,而是我們設定的虛擬IP地址,而兩臺Nginx伺服器的地址則稱為我們的工作IP,當比如5個請求(看我這沒見過大場面的樣子)來到我們的主Nginx伺服器,我們主Nginx伺服器一看來了這麼多請求,於是。

啊,好多請求,我死了。

然後,由於兩臺Nginx伺服器都是設定的這一個虛擬IP,當主Nginx伺服器掛了之後,當我們再次訪問的時候,實際上就是訪問我們的從Nginx伺服器來做具體的負載均衡了,具體提供服務的IP地址也從主Nginx伺服器的IP切換到了從Nginx伺服器的Ip,整個IP切換的過程對於使用者來說是無感知的,其實有點類似於我們經常說的主從資料庫。

然後整個工作IP地址變化的過程,業界起了一個特cool的名字,叫IP漂移

當然,這個虛擬IP也不是說句話就配置好的,同樣也需要第三方軟體的支援,在這裡我們使用的是keepalived這個軟體來保證我們的nginx實現高可用叢集配置的。

keepalived是什麼?

keepalived是叢集管理中保證叢集高可用的一個服務軟體,其功能類似於heartbeat,主要用來防止單點故障。

你這不是脫褲子xx,多此一舉嗎,是,Nginx伺服器掛了是沒事了,可是你keepalived掛了怎麼辦?

臥,我早就想到可能會有人問這個問題,首先,我們的keepalived只是簡單的做一個負載均衡的作用,真實的請求還是交給Nginx來負責的,所以,keepalived掛的概率要遠遠小於Nginx掛的概率,如果真掛了,那也真的沒辦法了。

說了這麼多,具體怎麼玩?好,那接下來,我們不廢話,直接看東西。

keepalived安裝及配置檔案詳解:

keepalived安裝:

既然我們說的是nginx高可用叢集的配置,首先,有很多先決條件我們得有吧,叢集叢集,你只有一臺linux伺服器搞不成啊,當然也不要求你準備幾十臺伺服器出來,兩臺就好,畢竟成本高昂,當然對於朱一旦那樣的勞力士男人這點伺服器並不在話下,其次,最最最基本的,我們兩臺伺服器要把Nginx裝好,具體Nginx怎麼裝的,可以去看我之前的實戰篇,所以為了實現Nginx的高可用叢集配置,我們需要準備:

  • 伺服器兩臺,我這裡是本地虛擬機器,IP分別是192.168.17.119192.168.17.120
  • 我們兩臺伺服器都需要安裝好nginxkeepalived

過程略,騙你的,按照我們之前的習慣,這裡只列舉最簡單的安裝方法,開啟我們兩臺虛擬機器的命令列終端,輸入yum命令進行安裝:

yum install keepalived –y
複製程式碼

keepalived配置檔案詳解:

裝好了之後呢,就是說配置了,我們keepalived的配置檔案在哪呢?通常來說在etc/keepalived/keepalived.conf這個檔案下,我們開啟這個檔案,由於內容實在太多,我這裡就不一一列舉了,但是這麼多的配置並不都是需要我我們去配置的,相反,我們簡單的配置主從Nginx伺服器只需要其中的一小部分就可以了,於是呢,我們對keepalived.conf這個檔案進行精簡,精簡過後的內容如下,大家可以直接把這部分內容替換掉原來的配置檔案:

! Configuration File for keepalived

global_defs {
    
    ##郵件相關的配置
    notification_email {
    ###設定報警郵件地址,可以設定多個,每行一個。 需開啟本機的sendmail服務
    acassen@firewall.loc
    failover@firewall.loc
    sysadmin@firewall.loc
    }
    #keepalived在發生諸如切換操作時需要傳送email通知地址,表示傳送通知的郵件源地址是誰  
    notification_email_from Alexandre.Cassen@firewall.loc
    #指定傳送email的smtp伺服器  
    smtp_server 192.168.17.129
    #設定連線smtp server的超時時間 
    smtp_connect_timeout 30
    
    ##這個比較重要, router_id 用來標識我們這臺主機,故障發生時,發郵件時顯示在郵件主題中的資訊
    router_id Master_Nginx 
}

##檢測指令碼和權重引數
vrrp_script chk_http_port {
    script "/usr/local/src/nginx_check.sh" ##配置指令碼的路徑
    interval 2 #(檢測指令碼執行的間隔)
    weight 2 ##權重
}

vrrp_instance VI_1 {

    #指定keepalived的角色,MASTER表示此主機是主伺服器,BACKUP表示此主機是備用伺服器。注意這裡的state指      定 instance(Initial)的初始狀態,就是說在配置好後,這臺伺服器的初始狀態就是這裡指定的,  
    #但這裡指定的不算,還是得要通過競選通過優先順序來確定。如果這裡設定為MASTER,但如若他的優先順序不及另外一       臺,那麼這臺在傳送通告時,會傳送自己的優先順序,另外一臺發現優先順序不如自己的高,  
    #那麼他會就回搶佔為MASTER   
    state MASTER  # 備份伺服器上將 MASTER 改為 BACKUP 
    
    interface eth0 ###指定HA監測網路的介面。與本機 IP 地址所在的網路介面相同,可通過ip addr 檢視
    virtual_router_id 51 #虛擬路由標識,這個標識是一個數字,同一個vrrp例項使用唯一的標識。即同一vrrp_instance下,MASTER和BACKUP必須是一致的  
    priority 100 # 主、備機取不同的優先順序,主機值較大,備份機值較小,一般來說,主100 備 80
    advert_int 1 #設定MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒     
	authentication { #設定驗證型別和密碼。主從必須一樣
        auth_type PASS   #設定vrrp驗證型別,主要有PASS和AH兩種  
        auth_pass 123456 #設定vrrp驗證密碼,在同一個vrrp_instance下,MASTER與BACKUP必須使用相同的密碼才能正常通訊  
}

virtual_ipaddress {
    192.168.17.50 ## VRRP H 虛擬地址
    } 


}
複製程式碼

在我們本例子中,配置檔案主要分為三大塊,分別是global_defsvrrp_script chk_http_port

vrrp_instance VI_1,下面我們一個一個來說明它們具體在其中起到的作用:

global_defs 塊:

全域性配置,郵件通知等配置都在這裡完成,比較重要的是這個router_id 這個選項,他用來標識我們這臺主機,

那本例中Master_Nginx 是怎麼來的呢,在我的host檔案中:

127.0.0.1 Master_Nginx
複製程式碼

當然Master_Nginx 是我自己取的,大家也可以根據自己的習慣給自己的主機起名字。

vrrp_script chk_http_port 塊:

看到script ,這不是指令碼的意思麼,是的,這一塊呢,就主要是們的keepalived指令碼配置,之前不是說了嗎,我得有個方法知道你Nginx伺服器掛了啊,這樣我才能去切換成備用的伺服器,這個指令碼就是幹這個事兒的。具體每一行是什麼意思,看註釋:

##檢測指令碼和權重引數
vrrp_script chk_http_port {
    script "/usr/local/src/nginx_check.sh" ##配置指令碼的路徑
    interval 2 #檢測指令碼執行的間隔,指令碼每隔兩秒執行一次,
    weight 2 ##權重,這個權重是什麼意思呢,就是當我們主Nginx伺服器掛了之後,就把該伺服器的權重設定成2
}
複製程式碼

而nginx_check.sh中的內容,我們會在配置檔案的最後會貼出來。

vrrp_instance VI_1塊:

第三塊就比較重要了,這個主要用來我們虛擬IP的配置,具體的解釋呢,我已經放在了上文程式碼註釋中,唯一需要額外補充的一點是什麼呢,virtual_ipaddress 我們的虛擬IP地址是可以有多個的,比如我有兩個虛擬IP怎麼寫,直接換行就行:

virtual_ipaddress {
    192.168.17.50 ## VRRP H 虛擬地址
    192.168.17.51 
    } 
複製程式碼

附:

在/usr/local/src/ 路徑下建立我們的nginx_check.sh 指令碼。

指令碼內容大致意思是,當我們發現我們當前nginx伺服器掛了的時候,就順便把keepalived也乾沒了,因為我們兩臺nginx伺服器都同時裝了keepalived,一臺掛了,所以自然就切換到另外一臺備用伺服器上了,這跟古代皇帝駕崩了,重任自然就落到太子身上是一個道理。

#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx
    sleep 2
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        killall keepalived
    fi
fi
複製程式碼

弄完之後,記得這個指令碼的路徑要和配置檔案中 script 值一致,別回來寫好了keepalived找不著。

講到這裡,就已經把keepalived配置檔案比較簡單的部分講完了,大家千萬不要說看了我的教程之後以為學到了全部精髓,其實沒有,這只是一部分,後面更多詳細的配置需要大家在日後的使用過程中學習和了解。

配置高可用叢集實戰:

其實,在上面講解配置檔案的過程中,我們已經不知不覺間把我們主Nginx伺服器的keepalived給悄咪咪配置好了,是吧,簡單的配置其實沒那麼複雜的,下面就是配置我們的備用Nginx伺服器了。大體上步驟依然是一樣的。

依舊是替換我們的配置檔案,不過需要大家主要的是,備用Nginx伺服器和主Nginx伺服器配置檔案還是有那麼一點點需要改動的地方,在本例中主要需要將 state 從MASTER 改為 BACKUP ,優先順序 priority 從100 改為 90 ,改過之後的內容如下:

vrrp_instance VI_1 {
    state BACKUP   # 備份伺服器上將 MASTER 改為 BACKUP 
    interface eth0 ##網路卡,可以從ipconfig這個命令查到
    virtual_router_id 51 # 主、備機的 virtual_router_id 必須相同
    priority 90 # 主、備機取不同的優先順序,主機值較大,備份機值較小,一般來說,主100 備 80
    advert_int 1 ##心跳,秒,每隔一秒傳送一個心態確認我們的Nginx伺服器的存活情況
	authentication { ##密碼驗證
        auth_type PASS
        auth_pass 123456
}

virtual_ipaddress {
    192.168.17.50 ## VRRP H 虛擬地址
    } 

}
複製程式碼

指令碼內容是不需要修改的,直接上傳到指定目錄就行。

配置過程中需要注意的是,主伺服器和備伺服器之間的虛擬IP 地址也就是virtual_ipaddress 一定要是同一個。

測試:

#兩臺伺服器分別啟動nginx
nginx

#分別啟動keepalived 服務
#centos 7 
systemctl start keepalived.service
#centos 6+
service keepalived start
複製程式碼

在瀏覽器地址輸入192.168.17.50 ,可以看到我們熟悉的Nginx歡迎介面。

為了驗證keepalived在其中確實是起了作用的,我們手動把主Nginx伺服器的keepalived和nginx服務關掉,然後再訪問192.168.17.50

於是我們發現依然是可以正常訪問的,熟悉的Nginx介面又出現在了我們眼中,可見我們的備用Nginx伺服器排上用場了。

到這裡就大功告成啦。

下面開始技術總結:

本篇文章呢,我們通過使用keepalived簡單實現了Nginx服務的高可用叢集的配置,雖然配置很簡陋,但是對於初學者我想已經可以實現通過keepalive和Nginx來實現自己專案的高可用執行了。但這並不意味著這就是全部,keepalived同時支援雙主模式,礙於本文的篇幅,這裡就不額外補充了,但是掌握了主備模式的配置,對於雙主模式的配置我想也是很容易學會的事情,最後,非常感謝閱讀本篇文章的小夥伴們,能夠幫助到你們對於我來說是一件非常開心的事兒,如果有什麼疑問或者批評歡迎留言到本篇文章下方,有時間的話我會一一回復。

韓數的學習筆記目前已經悉數開源至github,一定要點個star啊啊啊啊啊啊啊

萬水千山總是情,給個star行不行

韓數的開發筆記

歡迎點贊,關注我,有你好果子吃(滑稽)

相關文章