1. 程式人生 > >Nginx知多少系列之(十四)Linux下.NET Core專案Nginx+Keepalived高可用(主從模式)

Nginx知多少系列之(十四)Linux下.NET Core專案Nginx+Keepalived高可用(主從模式)

目錄

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