前言
LNMP 分散式叢集的部署實踐 系列文章:
- 《(一):Nginx+PHP平臺搭建與負載均衡配置》
- 《(二):NFS檔案伺服器的搭建與檔案緩衝上傳的配置》
- 《(三):MySQL主從資料庫伺服器的搭建》
- 《(四):Memcached 快取伺服器的搭建》
- 《(五):ThinkPHP專案部署》
- 《(六):keepalived 高可用方案》
衡量一個叢集的高可用性在於沒有單點故障,即其中任何一臺伺服器當機都不會造成整個服務中斷。 之前的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分散式叢集架構做出更改:
這就是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 分散式叢集的部署實踐 系列文章:
- 《(一):Nginx+PHP平臺搭建與負載均衡配置》
- 《(二):NFS檔案伺服器的搭建與檔案緩衝上傳的配置》
- 《(三):MySQL主從資料庫伺服器的搭建》
- 《(四):Memcached 快取伺服器的搭建》
- 《(五):ThinkPHP專案部署》
- 《(六):keepalived 高可用方案》
dfface 的版權宣告:所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明出處,嚴禁商業用途!