Nginx + Keepalived 高可用之主從配置
在架構(gòu)設(shè)計(jì)中,可以利用 nginx 的反向代理和負(fù)載均衡實(shí)現(xiàn)后端應(yīng)用的高可用性,同時(shí)還需要考慮Nginx的單點(diǎn)故障,真正做到架構(gòu)高可用性。
主要考慮以下兩點(diǎn):
Nginx 服務(wù)因?yàn)橐馔猬F(xiàn)象掛掉
服務(wù)器宕機(jī)導(dǎo)致 Nginx 不可用
目前主流的解決方案就是 keepalived + nginx 實(shí)現(xiàn) nginx 的故障轉(zhuǎn)移,同時(shí)做好監(jiān)控報(bào)警。在自動(dòng)故障轉(zhuǎn)移的同時(shí)能通知到相關(guān)的應(yīng)用負(fù)責(zé)人檢查相關(guān)應(yīng)用,排查隱患,徹底解決問題。
模擬環(huán)境:虛擬機(jī) 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 的功能很強(qiáng)大,主要檢測(cè)服務(wù)器的狀態(tài),如果有一臺(tái) web 服務(wù)器宕機(jī),或者工作出現(xiàn)故障,Keepalived 將檢測(cè)到,并將有故障的服務(wù)器從系統(tǒng)中剔除,同時(shí)使用其他服務(wù)器代替該服務(wù)器的工作,當(dāng)服務(wù)器工作正常后Keepalived 自動(dòng)將服務(wù)器加入到服務(wù)器群中,這些工作全部自動(dòng)完成,不需要人工干涉,需要人工做的只是修復(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. 進(jìn)入 Keepalived 解壓目錄
cd keepalived-2.2.2/
4. 編譯
./configure
如在編譯過程中出現(xiàn)錯(cuò)誤,可以先執(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è)置開機(jī)自動(dòng)啟動(dòng)
systemctl enable keepalived.service
# 取消開機(jī)自動(dòng)啟動(dòng)
systemctl disable keepalived.service
# 啟動(dòng)
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 唯一標(biāo)識(shí)符
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)卡,這里默認(rèn)是eht0但是我的是enp0s3,如果報(bào)錯(cuò)了就改成自己物理網(wǎng)卡名字
virtual_router_id 52 #默認(rèn)為51 配置完發(fā)現(xiàn)主備切換有問題 更改為52 發(fā)現(xiàn)好了 原因未知
priority 150 #主備的優(yōu)先級(jí)priority
advert_int 1 #檢查時(shí)間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啟動(dòng) Keepalived
systemctl start keepalived.service
檢查是否啟動(dòng)成功

查看 IP 地址變[ 啟動(dòng)前 ]

查看 IP 地址變[ 啟動(dòng)后 ]

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 腳本說明:
腳本邏輯為檢測(cè)進(jìn)程如果沒有 nginx 就嘗試啟動(dòng)一次,然后 sleep 兩秒,再檢測(cè),如果還沒有上進(jìn)程就結(jié)束 keepalived 進(jìn)程。這樣 VIP 就會(huì)移動(dòng)到備份節(jié)點(diǎn)。如果 yum 安裝的 nginx,可以直接使用 nginx 命令可以啟動(dòng) nginx,如果是源碼安裝,或者需要配置下環(huán)境變量或者更改下啟動(dòng)命令和絕對(duì)路徑,并測(cè)試是否能正常啟動(dòng) nginx。
啟動(dòng) Keepalived
systemctl start keepalived.service
檢查是否啟動(dòng)成功

查看 IP 地址變[ 啟動(dòng)前 ]

查看 IP 地址變[ 啟動(dòng)后 ]

另外,如果 keepalived 啟動(dòng)不成功,可以在keepalived日志文件 /var/log/messages 查看是否存在配置文件的錯(cuò)誤。
0x04:驗(yàn)證
防火墻開啟vrrp
keepalived 是基于 vrrp 做到虛擬 ip 漂移的,這里不開啟的話,主備均會(huì)認(rèn)為對(duì)方掛掉了,會(huì)造成主備都能獲取到虛擬ip ( vip )
firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
firewall-cmd --reload
首先在主備服務(wù)器分別執(zhí)行 service keepalived start 開啟 keepalived
通過 ip addr 命令分別查看主備兩臺(tái)機(jī)器,只有主服務(wù)器可以看到 vip
在主服務(wù)器執(zhí)行 service keepalived stop 停止 keepalived
通過 ip addr 命令查看備服務(wù)的 ip, 會(huì)發(fā)現(xiàn)可以看到 vip
在主服務(wù)器執(zhí)行 service keepalived start ,再次啟動(dòng) keepalived
通過 ip addr 命令分別查看主備兩臺(tái)機(jī)器,只有主服務(wù)器可以看到 vip
歡迎關(guān)注微信公眾號(hào):互聯(lián)網(wǎng)全棧架構(gòu),收取更多有價(jià)值的信息。
