keepalived實現nginx的高可用

前言:
優化Nginx_proxy代理可能出現單點故障的情況,通過keepalived得方式來完成nginx_proxy服務器之間的高可用,因爲keepalived的工作機制是通過心跳線來檢測服務器之間是否出現故障,但是並不能檢測nginx_proxy代理服務是否正常工作,所以需要採用編寫腳本判斷的方式來檢測nginx_proxy代理服務器,當Nginx_proxy 代理服務器出現故障時。立馬切換到vip

名詞解釋:
VIP:用戶通過訪問VIP虛擬IP地址,從而訪問對應的主節點
選舉:兩臺業務系統,由選舉的方式確認誰是主節點,誰是備節點
心跳線:選舉之後主要用來檢測對方的狀態
列腦:主備權重一致,造成列腦

keepalived的高可用列腦
由於某些原因,導致兩臺keepalived高可用服務器在指定時間內,無法檢測到對方的心跳消息,各自取得資源及服務的所有權,而此時的兩臺高可用服務器又都還活着。

原因:
服務器網線鬆動等網絡故障
硬件故障發生損壞現象而崩潰
都開啓firewalld防火牆
nginx服務死掉等等

實驗環境:

服務器系統 角色 外網IP 內網IP
centos7 master 10.0.0.5 172.16.1.5
centos7 backup 10.0.0.6 172.16.1.6

環境準備:
兩臺nginx_proxy服務器都需安裝
[root@1b01t ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
[root@1b01 ~]# yum install keepalived -y
[root@1b01 ~]# yum install nginx -y

實驗步驟:
1.兩臺nginx_proxy都執行以下步驟
[root@1b01 ~]# mkdir -p /server/scripts/
[root@1b01 scripts]# vim keepalived.sh

#!/bin/sh
nginxpid=$(ps -C nginx --no-header|wc -l)
#1.判斷Nginx是否存活,如果不存活則嘗試啓動Nginx
if [ $nginxpid -eq 0 ];then
systemctl start nginx
sleep 3
#2.等待3秒後再次獲取一次Nginx狀態
nginxpid=$(ps -C nginx --no-header|wc -l)
#3.再次進行判斷, 如Nginx還不存活則停止Keepalived,讓地址進行漂移,並退出腳本
if [ $nginxpid -eq 0 ];then
systemctl stop keepalived
fi
fi

2.master keepalibed 的配置文件
[root@1b01 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_01
}
#1.每5秒執行一次腳本, 腳本執行內容不能超過5秒,否則會被中斷再次重新運行腳本
vrrp_script keepalived {
script "/server/scripts/keepalived.sh"
interval 5
weight 50
}

vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}

#2.調用並運行該腳本
track_script {
    keepalived
}

}

3.backup keepalived的配置文件
[root@1b02 scripts]# vim /etc/keepalived/keepalived.conf
lobal_defs {
router_id lb02

}
#1.每5秒執行一次腳本, 腳本執行內容不能超過5秒,否則會被中斷再次重新運行腳本
vrrp_script keepalived {
script "/server/scripts/keepalived.sh"
interval 5
weight 50
}

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
}
#2.調用並運行該腳本
track_script {
keepalived
}
}

3.2 在備上編寫測試腳本,如果能ping 通主,並且還有vip的話則認爲產生列腦
[root@lb02 ~]# cat check_split_brain.sh
#!/bin/sh
lb01_vip=10.0.0.3
lb01_ip=10.0.0.5
while true;do
ping -c 2 -W 3 $lb01_ip &>/dev/null
if [ $? -eq 0 -a ip add|grep "$lb01_vip"|wc -l -eq 1 ];then
echo "ha is split brain.warning."
else
echo "ha is ok"
fi
sleep 5
done

測試:
隨意在[root@1b01 ~]# vim /etc/nginx/nginx.conf 的配置文件裏面寫入字符,讓nginx啓動失效
[root@1b01 ~]# systemctl restart nginx
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.

檢查會發現它自已通過腳本切換到backup keepalived
[root@1b01 ~]# hostname -I
10.0.0.5 172.16.1.5
[root@1b02 scripts]# hostname -I
10.0.0.6 10.0.0.3 172.16.1.6
則成功!!!!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章