Keepalived+nginx高可用
1.域名不能繫結在兩個IP上
- 我們把域名繫結在VIP上
2.如何實現切換?
負載均衡的高可用
keepalived
注意:任何軟體都可以使用keepalived來做高可用
keepalived如何實現高可用
VRRP:虛擬路由冗餘協議
比如公司的網路是通過閘道器進行上網的,那麼如果該路由器故障了,閘道器無法轉發報文了,此時所有人都無法上網了,怎麼辦?
通常做法是給路由器增加一臺北街店,但是問題是,如果我們的主閘道器master故障了,使用者是需要手動指向backup的,如果使用者過多修改起來會非常麻煩。
問題一:假設使用者將指向都修改為backup路由器,那麼master路由器修好了怎麼辦?
問題二:假設Master閘道器故障,我們將backup閘道器配置為master閘道器的ip是否可以?
其實是不行的,因為PC第一次通過ARP廣播尋找到Master閘道器的MAC地址與IP地址後,會將資訊寫到ARP的快取表中,那麼PC之後連線都是通過那個快取表的資訊去連線,然後進行資料包的轉發,即使我們修改了IP但是Mac地址是唯一的,pc的資料包依然會發送給master。(除非是PC的ARP快取表過期,再次發起ARP廣播的時候才能獲取新的backup對應的Mac地址與IP地址)
VIP:虛擬IP地址
VMAC:虛擬mac地址

如何才能做到出現故障自動轉移,此時VRRP就出現了,我們的VRRP其實是通過軟體或者硬體的形式在Master和Backup外面增加一個虛擬的MAC地址(VMAC)與虛擬IP地址(VIP),那麼在這種情況下,PC請求VIP的時候,無論是Master處理還是Backup處理,PC僅會在ARP快取表中記錄VMAC與VIP的資訊。
安裝配置keepalived
環境準備
作用 | IP | 角色 | VIP |
---|---|---|---|
lb01 | 10.0.0.5 | Master | 10.0.0.3 |
lb02 | 10.0.0.6 | Backup | 等master掛了VIP會過來 |
web01 | 10.0.0.7 | web | 沒有VIP |
部署web
部署MySQL
部署lb01
部署lb02
部署 keepalived
# 1.安裝keepalived [root@lb01 ~]# yum install -y keepalived [root@lb02 ~]# yum install -y keepalived # 2.MASTER配置檔案 global_defs { #全域性配置 router_id lb01 #標識身份->名稱 } vrrp_instance VI_1 { state MASTER #標識角色狀態 interface eth0 #網絡卡繫結介面 virtual_router_id 50 #虛擬路由id priority 150 #優先順序 advert_int 1 #監測間隔時間 authentication { #認證 auth_type PASS #認證方式 auth_pass 1111 #認證密碼 } virtual_ipaddress { 10.0.0.3 #虛擬的VIP地址 } } # 3.BACKUP配置檔案 global_defs { router_id lb02 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 50 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3 } }
我們需要把keepalived和nginx關聯起來
搶佔式和非搶佔式
1、兩個節點的state都必須配置為BACKUP
2、兩個節點都必須加上配置 nopreempt
3、其中一個節點的優先順序必須要高於另外一個節點的優先順序。
兩臺伺服器都角色狀態啟用nopreempt後,必須修改角色狀態統一為BACKUP,唯一的區分就是優先順序。
Master配置
vrrp_instance VI_1 {
state BACKUP
priority 150
nopreempt
}
Backup配置
vrrp_instance VI_1 {
state BACKUP
priority 100
nopreempt
}
關聯nginx和keepalived
vim /etc/keepalived/keepalived.conf
global_defs { #全域性配置
router_id lb01 #標識身份->名稱
}
vrrp_script xxx {
script "/root/nginx_keep.sh"
interval 5
}
vrrp_instance VI_1 {
state MASTER #標識角色狀態
interface eth0 #網絡卡繫結介面
virtual_router_id 50 #虛擬路由id
priority 150 #優先順序
advert_int 1 #監測間隔時間
authentication { #認證
auth_type PASS #認證方式
auth_pass 1111 #認證密碼
}
virtual_ipaddress {
10.0.0.3 #虛擬的VIP地址
}
}
track_script {
xxx
}
[root@lb01 ~]# cat /root/nginx_keep.sh
#!/bin/sh
nginx_status=$(ps -C nginx --no-header|wc -l)
#1.判斷Nginx是否存活,如果不存活則嘗試啟動Nginx
if [ $nginx_status -eq 0 ];then
systemctl start nginx
sleep 3
#2.等待3秒後再次獲取一次Nginx狀態
nginx_status=$(ps -C nginx --no-header|wc -l)
#3.再次進行判斷, 如Nginx還不存活則停止Keepalived,讓地址進行漂移,並退出指令碼
if [ $nginx_status -eq 0 ];then
systemctl stop keepalived
fi
fi
# 想讓VIP漂移,不重啟nginx
#!/bin/sh
nginx_status=$(ps -C nginx --no-header|wc -l)
if [ $nginx_status -eq 0 ];then
systemctl stop keepalived
fi
## 注意:如果是搶佔式,指令碼只需要放在MASTER上,如果是非搶佔式,指令碼必須放在MASTER和BACKUP上
[root@lb01 ~]# chmod +x /root/nginx_keep.sh
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
global_defs { #全域性配置
router_id lb01 #標識身份->名稱
}
vrrp_script xxx {
script "/usr/local/nginx_keep.sh"
interval 5
}
vrrp_instance VI_1 {
state MASTER #標識角色狀態
interface eth0 #網絡卡繫結介面
virtual_router_id 50 #虛擬路由id
priority 150 #優先順序
advert_int 1 #監測間隔時間
authentication { #認證
auth_type PASS #認證方式
auth_pass 1111 #認證密碼
}
virtual_ipaddress {
10.0.0.3 #虛擬的VIP地址
}
track_script {
xxx
}
}
網站訪問指令碼
#!/bin/bash
while true;do
code_status=$(curl -I -m 10 -o /dev/null -s -w %{http_code} www.wp.com)
if [ $code_status -eq 200 ];then
echo "$(date +%F-%T)_網站訪問成功" >> /tmp/web.log
else
echo "$(date +%F-%T)_網站訪問失敗,狀態碼是: $code_status" >> /tmp/web.log
fi
sleep 1
done
高可用會存在的問題:
1、如何確定誰是主節點誰是備節點?
- MASTER(主節點)
- BACKUP(備節點)
- priority(優先順序,主節點的優先順序要大於備節點的優先順序)
2、如果Master故障,Backup自動接管,那麼Master回覆後會奪權嗎?
- 如果配置的是搶佔式,MASTER會搶回VIP
- 如果配置的是非搶佔式,兩個都BACKUP,額外加一個引數:nopreempt,非搶佔式不會搶VIP
3、如果兩臺伺服器都認為自己是Master會出現什麼問題
兩臺機器上面都有VIP,兩臺機器都認為自己是主節點,如果都有VIP,會導致網站訪問不了
1、伺服器網線鬆動等網路故障
2、伺服器硬體故障發生損壞現象而崩潰
3、主備都開啟firewalld防火牆
#!/bin/sh
vip=10.0.0.3
lb01_ip=10.0.0.5
#while true;do
ping -c 2 $lb01_ip &>/dev/null
if [ $? -eq 0 ];then
lb01_vip_status=$(ssh $lb01_ip "ip add|grep $vip|wc -l")
lb02_vip_status=$(ip add|grep $vip|wc -l)
if [ $lb01_vip_status -eq 1 -a $lb02_vip_status -eq 1 ];then
echo '主節點和備節點都有VIP,開始關閉備節點的VIP...'
systemctl stop keepalived
fi
else
echo '主節點無法通訊'
fi
#sleep 5
#done
注意:
負載均衡:lvs harproxy nginx
1.如果企業中用的是物理服務,機房。我們可以做keepalived的高可用
2.如果企業中用的是雲伺服器,(阿里雲...)不能做keepalived.... slb