Nginx知多少系列之(十四)Linux下.NET Core項目Nginx+Keepalived高可用(主從模式)
- 2020 年 4 月 27 日
- 筆記
- .NET Core, keepalived, Nginx
目錄
1.前言
2.安裝
3.配置文件詳解
4.工作原理
5.Linux下託管.NET Core項目
6.Linux下.NET Core項目負載均衡
7.負載均衡策略
8.加權輪詢(round robin)策略剖析
9.IP哈希(ip hash)策略剖析
10.最少連接(least_conn)策略剖析
11.隨機(random)策略剖析
12.URL哈希(url hash)策略剖析
13.響應時間(fair)第三方模塊詳解
14.Linux下.NET Core項目Nginx+Keepalived高可用(主從模式)
15.Linux下.NET Core項目Nginx+Keepalived高可用(雙主模式)
16.Linux下.NET Core項目LVS+Keepalived+Nginx高可用集群
17.構建靜態服務器
18.日誌分析
19.優化策略
20.總結
在這裡我們簡單介紹下Keepalived,它是一個基於VRRP協議來實現的服務高可用方案,可以利用其來避免IP單點故障,類似的工具還有heartbeat、corosync、pacemaker。但是它一般不會單獨出現,而是與其它負載均衡技術(如lvs、haproxy、nginx)一起工作來達到集群的高可用。在這裡我們就不先詳細的介紹keepalived的相關內容,這一部分內容後面的文章會有提到。這裡主要講解如何去利用keepalived部署高可用的雙機主從模式。
所謂的雙機主從模式,就是前端使用兩台服務器,一台主服務器和一台熱備服務器,正常情況下,主服務器綁定一個公網虛擬IP,提供負載均衡服務,熱備服務器處於空閑狀態;當主服務器發生故障時,熱備服務器接管主服務器的公網虛擬IP,提供負載均衡服務;但是熱備服務器在主機器不出現故障的時候,永遠處於浪費狀態。
如果在嘗試的過程中,遇到不明上下文的,例如像VM如何安裝,Nginx如何安裝部署等可以看《Nginx知多少系列之(一)前言》、《.NET Core項目部署到Linux(Centos7)(一)前言》兩個專題系列。
注意:遇到不明白的地方、哪裡有不對的以及有好的建議的,記得評論留言喔,我會儘快回復!
1.環境以及相關文章
服務器 | IP | 說明 |
LB-Master | 192.168.157.150 | Nginx負載均衡主服務器(Keepalived主服務器) |
LB-Slave | 192.168.157.200 | Nginx負載均衡備服務器(Keepalived從服務器) |
Web Server-01 | 192.168.157.130 | 後端服務器站點-1(Nginx+.NET Core) |
Web Server-02 | 192.168.157.131 | 後端服務器站點-2(Nginx+.NET Core) |
Web Server-03 | 192.168.157.132 | 後端服務器站點-3(Nginx+.NET Core) |
- 《Nginx知多少系列之(五)Linux下託管.NET Core項目》
- 《Nginx知多少系列之(二)安裝》
- 《.NET Core項目部署到Linux(Centos7)(四)VMware Workstation虛擬機Centos 7安裝》
- 《.NET Core項目部署到Linux(Centos7)(三)創建.NET Core API項目》
- 《.NET Core項目部署到Linux(Centos7)(六)發佈.NET Core 項目到Linux》
- 《.NET Core項目部署到Linux(Centos7)(七)啟動和停止.NET Core項目》
2.Web Server和主從服務器Nginx的部署
在文章《Nginx知多少系列之(七)負載均衡策略》里我們已經介紹了如何部署三台服務器以及用一台Nginx服務器作為負載均衡。每一台服務器的IP根據你自身的環境所變化,不需要保持一致。我們還需要額外在部署一台Nginx服務器作為從服務器,和之前部署的Nginx一模一樣。
接下來我們要對主從服務器的負載均衡做簡單的輪詢配置
#進入Nginx配置文件目錄 cd /etc/nginx/conf.d #編輯配置文件 sudo vim upstream.conf #按i進入編輯模式,輸入下面的內容 upstream netCoreDemo { server 192.168.157.130; server 192.168.157.131; server 192.168.157.132; } server { listen 80; location / { proxy_pass http://netCoreDemo; } } #編輯好後,按Esc,再輸入:wq保存退出 #重啟nginx sudo nginx -s reload
記得是主從服務器的負載均衡策略配置要保持一致。接下來我們單獨看看主從服務器(主:192.168.157.150 從:192.168.157.200)的訪問效果。
3.Keepalived安裝
我們這先介紹如何使用yum安裝,這裡需要在主從Nginx服務器都安裝keepalived,即192.168.157.150和192.168.157.200。
#安裝keepalived sudo yum install -y keepalived
如下圖,我們已經成功安裝keepalived了,這個時候還不能啟動,因為需要做一些配置
記得是兩台服務器都要裝Keepalived哦!
4.Keepalived配置文件
我們來先配置Master節點的信息(192.168.157.150)
#進入keepalived目錄 cd /etc/keepalived #備份配置文件 sudo cp keepalived.conf keepalived.conf.bak #刪除配置文件,裏面的配置太長了,這裡我們做簡單配置,所以還是刪了在創建新的比較方便哈 sudo rm -rf keepalived.conf #創建新配置文件 sudo touch keepalived.conf #編輯配置文件 sudo vim keepalived.conf #按i進入編輯模式,複製下面的配置信息 ! Configuration File for keepalived global_defs { router_id LVS_DEVEL_01 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.157.100 } } #按Esc,然後:wq保存退出
接下來配置BACKUP節點的信息(192.168.157.200)
#進入keepalived目錄 cd /etc/keepalived #備份配置文件 sudo cp keepalived.conf keepalived.conf.bak #刪除配置文件,裏面的配置太長了,這裡我們做簡單配置,所以還是刪了在創建新的比較方便哈 sudo rm -rf keepalived.conf #創建新配置文件 sudo touch keepalived.conf #編輯配置文件 sudo vim keepalived.conf #按i進入編輯模式,複製下面的配置信息 ! Configuration File for keepalived global_defs { router_id LVS_DEVEL_02 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.157.100 } } #按Esc,然後:wq保存退出
下面是配置文件的部分解析
! Configuration File for keepalived global_defs { router_id LVS_DEVEL_01 #keepalived標識信息,自定義 } vrrp_instance VI_1 { state MASTER #指定實例初始狀態,實際的MASTER和BACKUP是選舉決定的 interface ens33 #指定實例綁定的網卡 virtual_router_id 51 設置VRID標記,多個集群不能重複(0..255),同一組的或主從的必須保持一致 priority 100 #設置優先級,優先級高的會被競選為Master,MASTER和BACKUP的優先級要不一樣 advert_int 1 #檢查的時間間隔,默認1s authentication { #設置認證 auth_type PASS #認證方式,支持PASS和AH,官方建議使用PASS auth_pass 1111 #認證的密碼 } virtual_ipaddress { #設置VIP,可以設置多個,用於切換時的地址綁定。 192.168.157.100 } }
查看網卡信息
#查看網卡信息
ifconfig
5.啟動Keepalived
我們已經把主從節點的配置信息都弄好啦。馬上就可以啟動keepalived測試效果咯,是不是有點期待??接下來才是填坑的開始……
我們先來啟動主服務器的keepalived
#啟動主服務器的Keepalived
sudo service keepalived start
#查看keepalived狀態
service keepalived status
我們也可以在/var/log/messages看到啟動信息,如果發生錯誤也可以在裏面看到
#查看日誌文件 sudo less /var/log/messages #less查看一個文件時,可以使用類似vi的command命令,在command模式下按G跳到文件末尾,再使用f或B來翻頁 less filename :G 跳到底部,就可以用 向上 向下 箭頭 或 向滾動鼠標來查看log了
是不是很開心,看上圖我們已經啟動成功了,我們先來看看VIP(虛擬IP)是不是已經分配了
#查看IP信息
ip add
我們可以看到上圖,在150主服務器里,已經分配了之前我們配置的virtual_ipaddress:192.168.157.100
主服務器的keepalived已經啟動成功了,我們接下來按照同樣的方式去啟動從服務器的keepalived。可以參考上面的操作,我們直接看圖吧。
看到上圖和主服務器顯示的一模一樣,同時也分配了VIP,我們先不管其他問題,先來驗證下,使用VIP:192.168.157.100是不是能訪問站點
恭喜你,已經用VIP訪問成功了,但是這裡有個問題了,下面我們會接着講。
6.Keepalived腦裂問題
正常的部署keepalived里只有主服務器才會分配到VIP,當主服務器宕機之後,VIP才會漂移到從服務器,這個時候從服務器就負責之前主服務器的工作。那現在主從服務器都有VIP,那就是常說的腦裂問題。下面我們來解釋下什麼是腦裂?
腦裂(split-brain):指在一個高可用(HA)系統中,當聯繫着的兩個節點斷開聯繫時,本來為一個整體的系統,分裂為兩個獨立節點,這時兩個節點開始爭搶共享資源,結果會導致系統混亂,數據損壞。
就像我們上面的那樣,主服務器和從服務器都有VIP,然後互相爭搶資源了,那這個時候我們怎麼解決呢?這有兩種解決方案:
①、直接乾脆的,關閉防火牆
在這裡避免別的問題出現,我們先重啟機器,然後在執行關閉防火牆,開啟keepalived的操作
#重啟Linux
sudo reboot
#查看防火牆狀態
service firewalld status
#暫時性關閉防火牆,下次開機又會打開
sudo service firewalld stop
#永久性關閉防火牆
sudo systemctl disable firewalld
#開啟服務器的keepalived
sudo service keepalived start
主從服務器都完成操作後,記得是兩台服務器都要做相應的操作。我們在看看VIP的分配情況
如上圖,在192.168.157.150主服務器,已經成功分配到了VIP。然後在192.168.157.200從服務器未分配到VIP,這樣就解決了主從服務器都有VIP,產生腦裂的問題啦(當然其他原因導致的腦裂問題還是會存在的,產生腦裂的情況可是有很多的)。但是除非這台電腦是內網訪問的,不然都是增加對應的策略,而不是簡單粗暴的關閉防火牆就完事了,關閉防火牆容易導致安全性問題。
②、設置防火牆規則
在這裡我們對主從服務器都開啟組播地址,然後在開啟主從服務器的keepalived,在看看VIP是不是只有主服務器才有。
#開啟組播地址 sudo firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT #刷新防火牆配置 sudo firewall-cmd --reload #查看防火牆狀態 service firewalld status #開啟keepalived sudo service keepalived start #查看keepalived的狀態 service keepalived status
#查看ip信息
ip add
上圖顯示的IP結果和直接關閉防火牆的信息是一致的,說明是有效的解決了腦裂的問題。我們來看看訪問的效果
7.Keepalived主從切換
在上面我們已經解決主從服務器都出現VIP的問題了,雖然現在是訪問正常的,但是還沒達到我們想要實現的目的,這樣純碎只是說在原來的基礎上用了一個VIP是對外訪問而已,和高可用沒有關係。那接下來我們就實踐如何保證高可用主從切換,當主服務器出現問題,例如宕機,服務停止等問題後,從服務器能接管過來確保站點的訪問正常。
①、直接服務器宕機
首先我們直接關機主服務器,然後看看VIP:192.168.157.100是不是漂移到了從服務器上,訪問站點是不是也正常。
#主服務器直接關機 #在從服務器嘗試PING 主服務器IP 192.168.157.150 ping 192.168.157.150 #查看IP信息 ip add
哦豁,從上圖可以看到主服務器已經徹底關機了,PING也PING不通了。同時我們看從服務器的IP信息,VIP:192.168.157.100已經漂移到從服務器上啦。說明什麼呢?說明主服務器出現問題後,從服務器能馬上接管,保證站點的正常訪問啦。
同時我們也可以看看keepalived的日誌信息
#查看日誌文件 sudo less /var/log/messages #less查看一個文件時,可以使用類似vi的command命令,在command模式下按G跳到文件末尾,再使用f或B來翻頁 less filename :G 跳到底部,就可以用 向上 向下 箭頭 或 向滾動鼠標來查看log了
可以看到上圖在15:15分我們把主服務器關機之後,從服務器就Transition to MASTER STATE,即轉變為MASTER的狀態,接管MASTER的工作。那站點是不是也訪問成功了呢?直接上圖
訪問正常,現在已經做到了主服務器出問題,從服務器能接管的啦。那當我們把主服務器開機後會怎麼樣呢??我們來看看IP 信息,日誌以及訪問的效果。
當我們把主服務器開機後,發現VIP又漂移回主服務器拉,在日誌里也有顯示Received advert with higher priority 100,ours 99。在組播里我們收到更高的優先級100,我們才90,那從服務器要改為BACKUP STATE以及移除對應的VIP。
②、停止keepalived的服務
這裡我們採用停止服務的方式去測試主從切換,停止主服務器的keepalived,為了方便測試,我們把主服務器的Nginx也停止了。然後看看VIP是否漂移以及訪問是否正常。
#停止keepalived服務 sudo service keepalived stop
#查看keepalived狀態
service keepalived status #停止Nginx sudo nginx -s stop #查看ip信息 ip add
當我們把主服務器的keepalived和nginx都停止後,發現個問題就是keepalived服務停止了,VIP竟然沒有釋放,那從服務器是什麼情況??我們看看從服務器的IP信息
從服務器的IP信息里並沒有發現VIP漂移過來,說明主從切換失敗了,那站點訪問情況如何??
VIP並沒有漂移,還是在原來的主服務器上,但我們已經把Nginx服務停止了,所以出現了訪問不了的情況。正常來說這個時候應該是從服務器接管。但並沒有,這是為什麼呢??
在上面我們已經把keepalived的服務已經停止了,但是我們來看看keepalived的進程還在不在?
#查看keepalived的進程
ps aux |grep keepalived
哦豁??看到沒有,服務停止了,進程竟然還在,說明service keepalived stop並沒有清理乾淨,所以才導致VIP沒有漂移,主從切換失敗的。這個時候我們要想到是systemd服務腳本的問題
#進入keepalived.service目錄 cd /usr/lib/systemd/system #編輯keepalived.service sudo vim keepalived.service #按i進去編輯模式 #注釋掉 KillMode=process #按Esc,然後:wq保存退出 #重新加載配置 sudo systemctl daemon-reload #開啟主服務器的keepalived sudo service keepalived start #停止主服務器的keepalived服務 sudo service keepalived stop #查看keepalived 狀態 service keepalived status #查看IP信息
當我們修改了system服務腳本,重啟了之後,發現主從切換正常了,VIP也漂移到了192.168.157.200從服務器,站點訪問也是正常的。至於把主服務器的keepalived重新開啟之後,效果和之前直接關機開機後的是一樣的,這裡就不重複驗證了。你們可以直接開啟服務去驗證下。
那現在已經實現了Nginx高可用主從模式,當主服務器宕機後,從服務器接管。主服務器正常後,從服務器重新移交給回主服務器。這裡的檢測是keepalived出現問題的情況下,會主從切換。那如果keepalived是正常的,服務器也是正常的,就是Nginx掛了??那結果會怎麼樣?我們又如何去解決??
8.Keepalived日誌的配置
keepalived的日誌默認是寫到/var/log/messages裏面的,在上面我們也看到過相關的日誌,但是很多系統消息之類的都會往/var/log/messages,這樣就顯得太多太雜,有時候分不清,那這個之後就想把日誌分離出來,在這裡我們把keepalived的日誌單獨放到了/var/log/keepalived.log
#編輯keepalived配置文件 sudo vim /etc/sysconfig/keepalived #按i 進入編輯模式 #把KEEPALIVED_OPTIONS="-D" 修改為KEEPALIVED_OPTIONS="-D -d -S 0" KEEPALIVED_OPTIONS="-D -d -S 0" #按Esc 然後:wq保存退出 #修改rsyslog文件 sudo vim /etc/rsyslog.conf #按i 進入編輯模式 #在文件的最後添加下列的內容,local0這裡記得前面不要有#,不然會注釋,不起作用的 # keepalived -S 0 local0.* /var/log/keepalived.log #按Esc 然後:wq保存退出 #重新啟動日誌 service rsyslog restart
在上面我們可以看到把rsyslog里的自定義信息local0都輸出到/var/log/keepalived.log裏面去,在這之後,我們修改了keepalived的配置為KEEPALIVED_OPTIONS=”-D -d -S 0″,是要把keepalived的日誌指定為local0,這樣在keepalived把日誌輸出類型為local0,而local0的日誌又被定義轉儲存在/var/log/keepalived.log里。
我們可以驗證下keepalived的日誌是不是到了/var/log/keepalived.log里
#重啟keepalived sudo service keepalived restart #查看日誌 sudo tail -f /var/log/keepalived.log
在上圖已經看到keepalived的日誌已經到了/var/log/keepalived.log,到這裡我們就已經把keepalived的日誌分離出來啦。
9.Nginx心跳檢測
現在就有那麼一種情況就是,服務器並沒有宕機,keepalived也好好的,就是nginx服務掛了,那會出現訪問不到頁面,我們首先把主服務的Nginx停掉,驗證下效果
#停止主服務器的Nginx
sudo nginx -s stop
看上圖,雖然keepalived是運行的,但是站點一樣無法訪問,而且也不會漂移VIP,這樣就做不到高可用集群,那這個時候我們就要keepalived去檢測nginx的心跳,如果Nginx掛了就嘗試去重新啟動,如果啟動不了就直接把keepalived服務停止了,讓VIP漂移到BACKUP從服務器上。
我們在keepalived安裝目錄建立Nginx檢測shell腳本
#進入keepalived目錄 cd /etc/keepalived #創建腳本文件 sudo vim nginx_health_check.sh 按i進入編輯模式,增加下來內容 #!/bin/bash #日誌輸出,默認到/var/log/messages,這裡需要更改為/var/log/keepalived.log #vim /etc/rsyslog.conf #添加下面內容 #local0.* /var/log/keepalived.log #表示local0設備的日誌信息記錄於/var/log/keepalived.log里 #重啟rsyslog服務 #service rsyslog restart function log(){ logger -i -t "nginx_check" -p local0.info "$1" } counter=$(ps -C nginx --no-heading|wc -l) if [ "${counter}" = "0" ]; then /usr/sbin/nginx log "Find nginx stopped and then starting." sleep 3 counter=$(ps -C nginx --no-heading|wc -l) if [ "${counter}" = "0" ]; then log "Nginx start failed." log "keepalived stopping." service keepalived stop log "keepalived stop success." else log "Nginx start success." fi fi #按Esc退出編輯,然後:wq退出保存
在上面我們已經創建了心跳檢測的腳本,大概的流程是這樣的:
①、檢測nginx服務是否存在
②、如果存在就直接等待下一次檢測
③、如果不存在那麼我們就嘗試啟動nginx服務,同時啟動也需要時間,所以在這裡我們等待3秒,3秒後我們再次檢測nginx服務是否已經啟動成功
④、如果成功,則等待下一次檢測
⑤、如果不成功,則把keepalived的服務停止了,這樣就可以VIP漂移,通知從服務器跑起來
這裡的話也有可能keepalived停止失敗的,這個一般都是防火牆等的問題,下面我們會講到,同時在檢測的過程中,我們也會把日誌,記錄到/var/log/keepalived.log,因為我們記錄日誌的時候使用的是自定義0-7裏面的local0,在前面已經定義了local0的日誌都會記錄到keepalived.log裏面。記錄日誌的話,這樣檢測到有問題,我們也可以看到相關的內容。
接下來我們可以執行下,檢測下腳本是不是有問題?
#查看nginx進程 ps aux |grep nginx #停止nginx sudo nginx -s stop #查看nginx進程 ps aux |grep nginx #單獨執行腳本 sudo bash /etc/keepalived/nginx_health_check.sh #查看nginx進程 ps aux |grep nginx
我們可以看到上圖,當我們把nginx停止後,單獨運行心跳腳本,腳本會自動把nginx啟動回來,說明這個腳本是沒有問題的!
心跳檢測腳本寫好之後,我們就要修改keepalived.conf配置文件,把剛剛創建的腳本配置到keepalived裏面,讓keepalived去運行這個心跳檢測腳本
#編輯keepalived.con文件 sudo vim /etc/keepalived/keepalived.conf #按i進入編輯模式,增加紅色區的內容 ! Configuration File for keepalived global_defs { router_id LVS_DEVEL_01 } vrrp_script chk_nginx { script "/etc/keepalived/nginx_health_check.sh" interval 5 weight -20 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { 192.168.157.100 } } #編輯好後,按Esc,然後:wq退出保存
這裡vrrp_script chk_nginx一定要放在vrrp_instance VI_1前面,不然後面啟動會沒有反應的哦,chk_nginx這個是自定義名字哈,喜歡叫啥就叫啥,script就是我們剛剛創建的心跳腳本的路徑,interval就是心跳間隔的時間,5的話就是5秒,還記得前面在腳本里因為要等待nginx啟動,所以sleep了3秒,這裡interval一定要比sleep的時間大,不然會報錯的哦!weight就是權重,如果成立的話,就會降低對應服務器的keepalived權重,有可能就會從主服務器變為從服務器的。
OK啦,這兩個都準備好,我們就準備開始運行啦,不過在運行之前,我們還要做兩個準備,不然會出現兩種情況哦,一是啟動了腳本壓根沒有執行,而是腳本執行了,但是裏面的命令執行失敗,例如啟動nginx,停止keepalived服務等。
①、心跳檢測腳本權限問題
#把nginx心跳檢測腳本更改權限
sudo chmod 755 /etc/keepalived/nginx_health_check.sh
這裡的話把心跳檢測腳本更改為可執行的權限,同時你可以在/etc/keepalived文件夾下面,用ls命令,可以看到顯示的是綠色,綠色代表為可執行文件,可執行的程序。如果不更改,會發現這個腳本壓根不會執行。
②、SELinux安全模塊的問題
SELinux這個我目前也還沒搞懂到底是做什麼的哈,關於這方面的問題,有種最簡單粗暴的方法,如下
#臨時關閉selinux,這個終端關閉了就失效咯 sudo setenforce 0 #查看selinux getenforce
#查看selinux狀態
sestatus
#永久關閉,編輯/etc/sysconfig/selinux sudo vim /etc/sysconfig/selinux #按i進入編輯模式,修改下面的內 SELINUX=disabled #按Esc,然後:wq保存退出編輯
直接把SELinux關閉了,一了百了,省事,很多時候有不少問題就是它導致的,說真的,我就是到了這一步,研究了好久,為什麼人家的都沒有問題,我的腳本雖然執行了,但是裏面的命令就一直執行失敗,剛開始以為是腳本執行權限的問題,一直找原因都沒有找到,可能它就是看我找到太久了,突然靈光一閃,覺得是它的問題,嘗試關閉它,竟然成功了,足足折騰了我好久。看看不關的情況是怎麼樣,如下圖
這裡就是沒有更改selinux,心跳腳本雖然執行了,但是裏面的命令一直執行不了,導致一直檢測到有問題。
還有一種方式就是把keepalived和nginx增加至selinux白名單
在這裡我們可以先看看怎麼判斷增加什麼策略可以通過selinux,也可以直接看結果,運行後面的命令
#安裝setroubleshoot sudo yum -y install setroubleshoot #xshell開啟新終端,監控messages日誌 sudo tail -f /var/log/messages #停止nginx服務 sudo nginx -s stop #重啟keepalived service keepalived restart
當SELinux發生錯誤時,會將有用的信息記錄下來到/var/log/messages,如下圖
或者我們可以執行下面的命令
#查看錯誤信息 sudo cat /var/log/messages |grep setroubleshoot
因為在腳本裏面,我們要執行nginx和keepliaved相關的命令,所以在/var/log/messages里找到SELinux keepalived和nginx相關的錯誤信息,然後我們執行For complete SELinux messages run:後面的命令。例如
#執行sealert命令,這裡只是個例子哈,具體看上面你們執行出來的結果
sudo sealert -l 03ad7984-32b7-4d51-82bf-e86bc462d38f
看上面執行完命令之後,在紅色框框里會建議你執行什麼操作能允許訪問權限執行,經過分析後,就有下面的結果啦,執行完腳本就可以啟動nginx命令和停止keepalived命令。
#安裝依賴軟件 sudo yum -y install policycoreutils-python #返回主目錄 cd #增加nginx至selinux白名單,mynginx是自定義名字哈,記住一定要在開啟nginx的時候執行,不然運行了沒有效果 sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M my-nginx #這個是執行了上面命令後,提示你要執行的命令 sudo semodule -i my-nginx.pp #增加keepalived至selinux白名單,記住一定要在開啟keeaplived的時候執行,不然運行了沒有效果
sudo cat /var/log/audit/audit.log | grep keepalived | grep denied | audit2allow -M my-keepalived #這個是執行了上面命令後,提示你要執行的命令 sudo semodule -i mykeepalived.pp #刪除剛剛創建的keepalived相關文件 sudo rm -rf my-keepalived* #刪除剛剛創建的nginx相關文件 sudo rm -rf my-nginx*
好啦好啦,準備工作都做好了,注意:主從服務器都要做一樣的操作哦,包含日誌的分離等等!!
接下來,來驗證下心跳腳本,首先驗證nginx停了之後,心跳腳本會不會自動啟動nginx
#用xshell開啟兩個終端,第一個用來監控主服務器日誌文件的變化 sudo tail -f /var/log/keepalived.log #第二個在主服務器做如下的操作 #重啟keepalived sudo service keepalived restart #停止nginx sudo nginx -s stop #查看nginx 進程 ps aux |grep nginx #隔幾秒後再次查看nginx 進程 ps aux |grep nginx #查看IP信息 ip add
可以看到上圖,當我們停止nginx後,就等待keepalived的心跳檢測,等待重啟的過程中nginx進程查不到,當keepalived心跳檢測開始後,我們可以看到日誌里顯示之前在腳本里打印的日誌Find nginx stopped and then starting,然後開始啟動nginx服務,啟動成功後可以查到nginx的相關進程。同時我們會打印日誌提示Nginx start success。
接着我們也要驗證下,當nginx實在重啟不了的時候,心跳腳本會不會停止keepalived,停止之後從服務器會不會接管過來?
#用xshell開啟兩個終端,第一個用來監控主服務器日誌文件的變化 sudo tail -f /var/log/keepalived.log #第二個在主服務器做如下的操作 #編輯nginx心跳檢測腳本 sudo vim /etc/keepalived/nginx_health_check.sh #按i 編輯 #注釋啟動nginx的命令 #/usr/sbin/nginx #按Esc,然後:wq退出保存 #重啟keepalived sudo service keepalived restart #停止nginx sudo nginx -s stop #查看nginx 進程 ps aux |grep nginx #查看IP信息 ip add
我們可以從上圖看出來,當我們把啟動nginx的命令注釋後,keepalived的nginx心跳檢測腳本會檢測到nginx服務未開啟,然後嘗試開啟,啟動失敗會直接停止keepalived服務,移除VIP,同時我們來看看從服務器的IP信息
VIP已經漂移到了從服務器上了,說明整個過程是流暢的,等主服務器啟動之後,VIP又會漂移回來。來看看訪問站點是不是成功的。
哦啦,至此大功告成,這就是Nginx+Keepalived高可用主從模式,解決了單個Nginx作為負載均衡發生的單點故障問題。從服務器的測試這裡就不重複了,你們可以自己去驗證下是不是心跳腳本也正常的。
10.Keepalived非搶佔模式
在上面我們實現的主從模式,keepalived默認是搶佔模式,就是當MASTER從故障中恢復後,會將VIP從BACKUP節點中搶佔過來。其實很多時候主從服務器配置都是一樣的,當主服務器恢復後搶佔回來沒有多大的必要,反而多了一次VIP的漂移。所以keepalived支持適用非搶佔模式,即MASTER恢復後不搶佔BACKUP升級為MASTER後的VIP。
接下來我們看看如何配置雙機主從非搶佔模式。
主服務器配置如下:
#編輯keepalived配置 sudo vim /etc/keepalived/keepalived.conf #按i進入編輯模式 #增加nopreempt以及修改state為BACKUP,標註紅色的內容,如下 ! Configuration File for keepalived global_defs { router_id LVS_DEVEL_01 } vrrp_script chk_nginx { script "/etc/keepalived/nginx_health_check.sh" interval 5 weight -20 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 100 advert_int 1 nopreempt authentication { auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { 192.168.157.100 } } #按Esc,然後:wq退出保存
從服務器配置如下:
#編輯keepalived配置 sudo vim /etc/keepalived/keepalived.conf #按i進入編輯模式 #增加nopreempt,標註紅色的內容,如下 ! Configuration File for keepalived global_defs { router_id LVS_DEVEL_02 } vrrp_script chk_nginx { script "/etc/keepalived/nginx_health_check.sh" interval 5 weight -20 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 99 advert_int 1 nopreempt authentication { auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { 192.168.157.100 } } #按Esc,然後:wq退出保存
我們已經把主從服務器的keepalived已經配置好了,接下來我們測試下效果
①、檢測keepalived、nginx都啟動,驗證正常情況下,VIP在哪台服務器
#重啟主從服務器的keepalived sudo service keepalived restart #確保nginx都開啟了 ps aux |grep nginx #沒有開啟的話,開啟nginx sudo nginx #查看兩台服務器的ip信息,看看正常情況下,VIP在哪裡 ip add
因為在之前的配置里,主服務器的priority優先級為100,所以在一開始正常的情況下,VIP出分配到優先級高的服務器上。
②、停止有VIP的服務器,在看看VIP是不會漂移到另外一台備用服務器上了
#停止有VIP服務器的keepalived
sudo service keepalived stop
#查看兩台服務器的IP信息,看看VIP漂移到哪裡了
ip add
當我們停止了正在運行的keepalived服務器之後,VIP正常的切換到了另外一台備用服務器上
③、把之前停的keepalived服務器重新啟動回來,我們看看會不會這台重啟的服務器搶佔回來??
#啟動主服務器的keepalived
sudo service keepalived start
#查看兩台服務器的IP信息,看看VIP漂移到哪裡了
ip add
在一輪驗證之後,發現如果主從服務器都設置為非搶佔模式,那麼當主服務器重新啟動之後,並不會搶回VIP,其實主從服務器的配置是一樣的,並沒有必要說主服務器重新運行就馬上搶回來。
11.Keepalived常用命令
#啟動keepalived
service keepalived start
#停止keepalived
service keepalived stop
#重啟keepalived
service keepalived restart