Nginx + Keepalived 高可用之主從配置
在架構(gòu)設(shè)計中,可以利用 nginx 的反向代理和負載均衡實現(xiàn)后端應(yīng)用的高可用性,同時還需要考慮Nginx的單點故障,真正做到架構(gòu)高可用性。
主要考慮以下兩點:
Nginx 服務(wù)因為意外現(xiàn)象掛掉
服務(wù)器宕機導(dǎo)致 Nginx 不可用
目前主流的解決方案就是 keepalived + nginx 實現(xiàn) nginx 的故障轉(zhuǎn)移,同時做好監(jiān)控報警。在自動故障轉(zhuǎn)移的同時能通知到相關(guān)的應(yīng)用負責(zé)人檢查相關(guān)應(yīng)用,排查隱患,徹底解決問題。
模擬環(huán)境:虛擬機 192.168.56.9 與 192.168.56.10
192.168.56.9:安裝 nginx 主 + keepalived 主 + Tomcat 主
192.168.56.10:安裝 nginx 備 + keepalived 備 + Tomcat 備
虛擬IP(VIP):192.168.56.120
Nginx 服務(wù)和 Tomcat 應(yīng)用是已經(jīng)配置好的環(huán)境,這里就不介紹相關(guān)的配置。具體可以查考以下兩篇博文:
0x01:Keepalived 介紹及部署
Keepalived 的功能很強大,主要檢測服務(wù)器的狀態(tài),如果有一臺 web 服務(wù)器宕機,或者工作出現(xiàn)故障,Keepalived 將檢測到,并將有故障的服務(wù)器從系統(tǒng)中剔除,同時使用其他服務(wù)器代替該服務(wù)器的工作,當(dāng)服務(wù)器工作正常后Keepalived 自動將服務(wù)器加入到服務(wù)器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復(fù)故障的服務(wù)器。
CentOS 系統(tǒng)安裝 Keepalived 主要有兩種安裝方式:
yum 命令安裝
源碼安裝
yum 命令安裝
yum install -y keepalived
該方式安裝的 keepalived 版本為 1.3.5

使用 yum 安裝方式安裝不了最新版本的 Keepalived,可以使用以下命令卸載 Keepalived
yum remove keepalived
源碼安裝
1. 下載源碼
官網(wǎng)地址
https://www.keepalived.org/
使用如下命令下載
wget https://www.keepalived.org/software/keepalived-2.2.2.tar.gz
2. 解壓 Keepalived
tar -zxvf keepalived-2.2.2.tar.gz -C /usr/local
3. 進入 Keepalived 解壓目錄
cd keepalived-2.2.2/
4. 編譯
./configure
如在編譯過程中出現(xiàn)錯誤,可以先執(zhí)行以下命令安裝 Keepalived 所需的依賴
yum install -y gcc openssl-devel popt-devel ipvsadm
編譯成功的結(jié)果如下

5. 安裝
make && make install
6. 將 Keepalived 安裝成 Linux 系統(tǒng)服務(wù)
mkdir /etc/keepalived
cp /root/keepalived-2.2.2/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /root/keepalived-2.2.2/keepalived/etc/init.d/keepalived /etc/init.d/
cp /root/keepalived-2.2.2/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/sbin/keepalived /usr/bin/
ln -s /usr/local/sbin/keepalived /sbin/
Keepalived 常用命令
# 設(shè)置開機自動啟動
systemctl enable keepalived.service
# 取消開機自動啟動
systemctl disable keepalived.service
# 啟動
systemctl start keepalived.service
# 停止
systemctl stop keepalived.service
# 重啟
service keepalived restart
# 狀態(tài)
service keepalived status
0x02:主 Keepalive 配置
主 Keepalived 配置文件
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id nginx01 # router_id 唯一標識符
vrrp_skip_check_adv_addr
vrrp_stricti
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script check_nginx {
script "/etc/keepalived/nginx_check.sh" #nginx服務(wù)檢查腳本
interval 1
weight -2
}
vrrp_instance VI_1 {
state MASTER
interface enp0s3 #指定VIP需要綁定的物理網(wǎng)卡,這里默認是eht0但是我的是enp0s3,如果報錯了就改成自己物理網(wǎng)卡名字
virtual_router_id 52 #默認為51 配置完發(fā)現(xiàn)主備切換有問題 更改為52 發(fā)現(xiàn)好了 原因未知
priority 150 #主備的優(yōu)先級priority
advert_int 1 #檢查時間1秒
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_nginx
}
virtual_ipaddress {
192.168.56.120/24 #vip地址
}
}
nginx_check.sh 腳本
#!/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
pkill keepalived
fi
fi
添加權(quán)限
chmod 755 nginx_check.sh啟動 Keepalived
systemctl start keepalived.service
檢查是否啟動成功

查看 IP 地址變[ 啟動前 ]

查看 IP 地址變[ 啟動后 ]

0x03:備 Keepalived 配置
同樣按照步驟 0x01 安裝 keepalived,然后按照如下步驟配置。
備 Keepalived 配置文件
! Configuration File for keepalived
global_defs {
router_id NodeB
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight 20
}
vrrp_instance VI_1 {
state BACKUP
interface enp0s4
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1314
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.56.120/24
}
}
nginx_check.sh 腳本
#!/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
pkill keepalived
fi
fi
添加權(quán)限
chmod 755 nginx_check.shnginx_check.sh 腳本說明:
腳本邏輯為檢測進程如果沒有 nginx 就嘗試啟動一次,然后 sleep 兩秒,再檢測,如果還沒有上進程就結(jié)束 keepalived 進程。這樣 VIP 就會移動到備份節(jié)點。如果 yum 安裝的 nginx,可以直接使用 nginx 命令可以啟動 nginx,如果是源碼安裝,或者需要配置下環(huán)境變量或者更改下啟動命令和絕對路徑,并測試是否能正常啟動 nginx。
啟動 Keepalived
systemctl start keepalived.service
檢查是否啟動成功

查看 IP 地址變[ 啟動前 ]

查看 IP 地址變[ 啟動后 ]

另外,如果 keepalived 啟動不成功,可以在keepalived日志文件 /var/log/messages 查看是否存在配置文件的錯誤。
0x04:驗證
防火墻開啟vrrp
keepalived 是基于 vrrp 做到虛擬 ip 漂移的,這里不開啟的話,主備均會認為對方掛掉了,會造成主備都能獲取到虛擬ip ( vip )
firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
firewall-cmd --reload
首先在主備服務(wù)器分別執(zhí)行 service keepalived start 開啟 keepalived
通過 ip addr 命令分別查看主備兩臺機器,只有主服務(wù)器可以看到 vip
在主服務(wù)器執(zhí)行 service keepalived stop 停止 keepalived
通過 ip addr 命令查看備服務(wù)的 ip, 會發(fā)現(xiàn)可以看到 vip
在主服務(wù)器執(zhí)行 service keepalived start ,再次啟動 keepalived
通過 ip addr 命令分別查看主備兩臺機器,只有主服務(wù)器可以看到 vip

喜歡,在看
