LNMP 分散式叢集(六):keepalived 高可用方案

dfface發表於2020-03-18

前言

LNMP 分散式叢集的部署實踐 系列文章:

衡量一個叢集的高可用性在於沒有單點故障,即其中任何一臺伺服器當機都不會造成整個服務中斷。 之前的LNMP分散式叢集的實踐中,顯然在將Nginx作為負載均衡伺服器時,upstream機制能檢測出後端伺服器是否可用,如果其中一臺伺服器當機,Nginx能自動轉移到後端正常的伺服器中,以保持系統持續可用。 但現在只有一臺負載均衡伺服器,一旦該伺服器發生故障,就會造成整個叢集服務中斷,為此,使用 keepalived 部署備用伺服器,實現故障轉移。 Keepalived 內建了 VRRP(Virtual Router Redundancy Protocol,虛擬路由冗餘協議)功能,用於解決靜態路由出現的單點故障問題,它通過IP多播的方式通訊,當發現路由故障時,通過選舉策略將備用路由更換為主路由,從而繼續提供服務。 Keepalived 實現了將提供對外訪問的IP地址(Virtual IP)自動在主伺服器(Master)和備用伺服器(Backup)之間切換,正常情況下用Master,當它故障了那麼監控它的Backup會通過優先順序機制競爭接管Virtual IP繼續對外服務,其他落選的就繼續監控當前使用的 Virtual IP 伺服器。

高可用環境中的伺服器:

角色 Real IP(RIP) Virtual IP(VIP) 說明
Master 192.168.177.21 192.168.177.11 Nginx + Keepalived
Backup 192.168.177.22 192.168.177.11 Nginx + Keepalived
- 192.168.177.1X - 後端伺服器叢集

然後我們對之前的LNMP分散式叢集架構做出更改:

單數代表IP:192.168.177.1X,雙數代表IP:192.168.177.XX

這就是LNMP高可用分散式叢集!

但是為了演示我們不加入叢集,使用兩個簡單的後端伺服器,RIP分別為192.168.177.23和192.168.177.24,Keepalived 服務的虛擬IP改為192.168.177.20:

角色 Real IP(RIP) Virtual IP(VIP) 說明
Master 192.168.177.21 192.168.177.20 Nginx + Keepalived
Backup 192.168.177.22 192.168.177.20 Nginx + Keepalived
- 192.168.177.23 - 後端伺服器1
- 192.168.177.24 - 後端伺服器2

部署

安裝和配置 keepalived 服務

部署和配置主伺服器

cd /usr/local/nginx/html
echo 'This is Master' > index.html
curl http://localhost

tar -zxvf keepalived-1.2.24.tar.gz
cd keepalived-1.2.24
./configure
make && make install && cd ..
cd /usr/local/etc/rc.d/init.d
cp keepalived /etc/init.d/keepalived
chmod +x /etc/init.d/keepalived
chkconfig keepalived on
cd /usr/local/etc/sysconfig
ln -s `pwd`/keepalived /etc/sysconfig/keepalived
cd /usr/local/sbin
ln -s `pwd`/keepalived /usr/sbin/keepalived

# 配置主伺服器的 keepalived

less /usr/local/etc/keepalived/keepalived.conf  # 檢視配置檔案模板
mkdir /etc/keepalived  # 手動建立預設載入的配置檔案
vi /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {  # 配置一個虛擬路由
    state MASTER
    interface ens33 # 指定監測的網路卡
    virtual_router_id 21  #虛擬路由的標識,同一個 VRRP 的 Master 和 Backup 應一致
    mcast_src_ip 192.168.177.21 # 設定 real IP,可省略,有預設自動使用主IP
    priority 100  # 優先順序、權重(權重最高的主機將接管 Virtual IP),範圍0-254
    advert_int 1  # MASTER 和 BACKUP 之間同步檢查的時間間隔,單位秒
    authentication {
        auth_type PASS  # 驗證型別,PASS表示密碼驗證
        auth_pass 123456  # 設定密碼
    }
    virtual_ipaddress {  # 配置 虛擬IP地址池,每行一個
        192.168.177.20  # 為 MASTER 和 Backup 設定相同的虛擬IP
    }
}

# 啟動 keepalived 服務 
service keepalived start
ps aux | grep keepalived
ip a | grep 192.168.177.20

#### 配置備用伺服器的 keepalived

基於主伺服器克隆出一臺備用伺服器,IP為192.168.177.22。然後開啟 keepalived 配置:

```bash
vrrp_instance VI_1 {
    state BACKUP  # 修改身份為 BACKUP
    priority 90  # 修改優先順序為90(低於MASTER)
    ……
}
# Master 和 Backup 通過 VRRP 的 112 埠通訊
iptables -I INPUT -s192.168.177.21 -p112 -jACCEPT
service iptables save
iptables -I INPUT -s192.168.177.22 -p112 -jACCEPT
service iptables save

service keepalived start # 啟動 Backup伺服器的 Keepalived 服務

# 區分當前訪問的是哪一臺伺服器
cd /usr/local/nginx/html
echo 'This is Backup' > index.html

# 測試,訪問192.168.177.20
service network stop
service network start
複製程式碼

至此就部署完畢了。

使用Keepalived 監控本機服務

除了可以監控其他伺服器中的Keepalived是否正常,也可以監控本機中的某個服務是否正常:

監控本機Nginx服務

vrrp_script chk_nginx {
    script "/chk_nginx.sh"
    interval 2
    weight -20
}
vrrp_instance VI_1 { 
   ……
   track_script {
        chk_nginx
    }
}

vi /chk_nginx.sh  # 建立監控指令碼

# !/bin/bash
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
    service nginx start
    sleep 2
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        service keepalived stop
    fi
fi

chmod +x /chk_nginx.sh
service keepalived reload
複製程式碼

高可用測試

service nginx stop  # 手動停用
ps -C nginx --no-header  # 等待2秒,檢視是否恢復啟動

# 建立停止 Nginx 服務並立即取消 Nginx 程式執行許可權的指令碼
cd /usr/local/nginx/sbin
vi test.sh

#! /bin/bash
service nginx stop
chmod -x nginx

chmod +x test.sh
./test.sh
# 看是否自動切換到備用伺服器
複製程式碼

LNMP 分散式叢集的部署實踐 系列文章:


dfface 的版權宣告:所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明出處,嚴禁商業用途!

相關文章