一、高可用介紹
1.1 什么是高可用
一般是指2臺機器啟動著完全相同的業務系統,當有一臺機器down機了,另外一臺服務器就能快速的接管,對于訪問的用戶是無感知的,
1.2 常用的工具
- 硬體通常使用:F5
- 軟體通常使用:Keepalived
1.3 keepalived是如何實作高可用的?
1.3.1 涉及名詞
keepalived軟體是基于VRRP協議實作的,VRRP虛擬路由冗余協議,主要用于解決單點故障問題
ARP:廣播
VRRP協議:在一個局域網中進行廣播
vip:負責IP漂移
vmac:負責通知ARP廣播修改mac地址
1.3.2 例子
比如公司的網路是通過網關進行上網的,那么如果該路由器故障了,網關無法轉發報文了,此時所有人都無法上網了,怎么辦?
通常做法是給路由器增加一臺備用節點,但是問題是,如果我們的主網關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地址)
如何才能做到出現故障自動轉移,此時VRRP就出現了,我們的VRRP其實是通過軟體或者硬體的形式在Master和Backup外面增加一個虛擬的MAC地址(VMAC)與虛擬IP地址(VIP),那么在這種情況下,PC請求VIP的時候,無論是Master處理還是Backup處理,PC僅會在ARP快取表中記錄VMAC與VIP的資訊,
1.4 高可用keepalived核心概念
- 如何確定誰是主節點誰是備節點(選舉投票,優先級)
- 如果Master故障,Backup自動接管,那么Master恢復后會奪權嗎(搶占式、非搶占式)
- 如果兩臺服務器都認為自己是Master會出現什么問題(腦裂問題)
二、keepalived搭建
2.1 環境準備
| 主機 | IP | 身份 |
|---|---|---|
| lb01 | 192.168.15.5 | keepalived master |
| lb02 | 192.168.15.6 | keepalived backup |
| web01 | 172.16.1.7 | web端 |
| web02 | 172.16.1.8 | web端 |
| db01 | 172.16.1.61 | 資料庫 |
| 192.168.15.3 | VIP |
2.2 安裝Keepalived
[root@lb01 conf.d]# yum install keepalived -y
2.3 配置keepalived
-
查找組態檔
[root@lb01 ~]# rpm -qc keepalived /etc/keepalived/keepalived.conf -
配置主節點LoadBalance01的組態檔
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived # 全域配置 global_defs { # 當前keepalived的唯一標識 router_id LoadBalance01 } # 配置VRRP協議 vrrp_instance VI_1 { # 狀態,MASTER和BACKUP state MASTER # 系結網卡 interface eth0 # 虛擬路由標示,可以理解為分組 virtual_router_id 50 # 優先級 priority 100 # 監測心跳間隔時間 advert_int 1 # 配置認證 authentication { # 認證型別 auth_type PASS # 認證的密碼 auth_pass 1111 } # 設定VIP virtual_ipaddress { # 虛擬的VIP地址 192.168.15.3 } } -
配置備用節點LoadBalance01的組態檔
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived # 全域配置 global_defs { # 當前keepalived的唯一標識 router_id LoadBalance02 } # 配置VRRP協議 vrrp_instance VI_1 { # 狀態,MASTER和BACKUP state BACKUP # 系結網卡 interface eth0 # 虛擬路由標示,可以理解為分組 virtual_router_id 50 # 優先級 priority 80 # 監測心跳間隔時間 advert_int 1 # 配置認證 authentication { # 認證型別 auth_type PASS # 認證的密碼 auth_pass 1111 } # 設定VIP virtual_ipaddress { # 虛擬的VIP地址 192.168.15.3 } }
2.4 啟動服務(開機自啟動)
[root@lb01 ~]# systemctl enable --now keepalived
[root@lb02 ~]# systemctl enable --now keepalived
2.5 keepalived開啟日志
#配置keepalived
[root@lb01 ~]# vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -d -S 0"
#配置rsyslog抓取日志
[root@lb01 ~]# vim /etc/rsyslog.conf
local0.* /var/log/keepalived.log
#重啟服務
[root@lb01 ~]# systemctl restart keepalived rsyslog
三、Keepalived的搶占式與非搶占式
3.1 兩個節點都啟動的情況
#兩個節點都啟動時,由于節點1優先級高于節點2,所以只有節點1上有VIP
[root@lb01 ~]# ip addr | grep 192.168.15.3
inet 192.168.15.3/32 scope global eth0
[root@lb02 ~]# ip addr | grep 192.168.15.3
3.2 停止主節點
[root@lb01 ~]# systemctl stop keepalived
[root@lb01 ~]# ip addr | grep 192.168.15.3
#由于節點1的keepalived 掛掉,節點2會自動接管節點1的作業,即VIP
[root@lb02 ~]# ip addr | grep 192.168.15.3
inet 192.168.15.3/32 scope global eth0
3.3 重新啟動主節點
#啟動主節點
[root@lb01 ~]# systemctl start keepalived
[root@lb01 ~]# ip addr | grep 192.168.15.3
inet 192.168.15.3/32 scope global eth0
#由于節點1優先級高于節點2,所以當節點1恢復時,會將VIP搶占回來
3.4 配置非搶占式
-
主節點配置(LoadBalance01)
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf ... ... vrrp_instance VI_1 { #狀態,MASTER和BACKUP state BACKUP # 開啟非搶占式 nopreempt #系結網卡 interface eth0 #虛擬路由標示,可以理解為分組 virtual_router_id 50 #優先級 priority 100 ... ... } [root@lb01 ~]# systemctl restart keepalived -
備用節點配置(LoadBalance02)
[root@lb02 ~]# vim /etc/keepalived/keepalived.conf ... ... vrrp_instance VI_1 { #狀態,MASTER和BACKUP state BACKUP # 開啟非搶占式 nopreempt #系結網卡 interface eth0 #虛擬路由標示,可以理解為分組 virtual_router_id 50 #優先級 priority 90 ... ... } [root@lb02 ~]# systemctl restart keepalived.service -
配置注意事項
- 兩個節點的state都必須配置為BACKUP;
- 兩個節點都必須加上配置 nopreempt;
- 其中一個節點的優先級必須要高于另外一個節點的優先級;
兩臺服務器都角色狀態啟用nopreempt后,必須修改角色狀態統一為BACKUP,唯一的區分就是優先級,
四、Keepalived腦裂
由于某些原因,導致兩臺keepalived高可用服務器在指定時間內,無法檢測到對方的心跳,各自取得資源及服務的所有權,而此時的兩臺高可用服務器又都還活著,
4.1 腦裂的故障
- 網線松動,網路故障
- 服務器硬體故障
- 服務器之間開啟了防火墻
4.2 腦裂模擬
-
開啟防火墻
[root@lb01 ~]# systemctl start firewalld [root@lb01 ~]# ip addr | grep 192.168.15.3 inet 192.168.15.3/32 scope global eth0 [root@lb02 ~]# systemctl start firewalld [root@lb02 ~]# ip addr | grep 192.168.15.3 inet 192.168.15.3/32 scope global eth0 -
訪問網站
#因為開啟了firewalld防火墻,默認拒絕所有連接,要開啟80埠 [root@lb01 ~]# firewall-cmd --add-service=http success [root@lb02 ~]# firewall-cmd --add-service=http success [root@lb01 ~]# firewall-cmd --add-service=https success [root@lb02 ~]# firewall-cmd --add-service=https success #訪問頁面沒有任何問題 -
關閉防火墻
[root@lb02 ~]# systemctl stop firewalld [root@lb02 ~]# ip addr | grep 192.168.15.3 [root@lb01 ~]# systemctl stop firewalld [root@lb01 ~]# ip addr | grep 192.168.15.3 inet 192.168.15.3/32 scope global eth0
4.3 腦裂解決的辦法
#如果發生腦裂,則隨機kill掉一臺即可
#在備用節點上撰寫檢測腳本, 測驗如果能ping通主節點并且備節點還有VIP的話則認為產生了腦裂
[root@lb02 ~]# cat check_split_brain.sh
#!/bin/sh
vip=192.168.15.3
lb01_ip=192.168.15.5
while true;do
ping -c 2 $lb01_ip &>/dev/null
if [ $? -eq 0 -a `ip add|grep "$vip"|wc -l` -eq 1 ];then
echo "ha is split brain.warning."
else
echo "ha is ok"
fi
sleep 5
done
[root@lb02 ~]# vim check_keepalive.sh
#!/bin/sh
vip=192.168.15.3
lb01_ip=172.16.1.5
while true;do
ssh $lb01_ip 'ip addr | grep 10.0.0.3' &>/dev/null
if [ $? -eq 0 -a `ip add|grep "$vip"|wc -l` -eq 1 ];then
echo "ha is split brain.warning."
else
echo "ha is ok"
fi
sleep 3
done
五、高可用Keepalived與Nginx
Nginx默認監聽在所有的IP地址上,VIP會飄到一臺節點上,相當于那臺nginx多了VIP這么一個網卡,所以可以訪問到nginx所在機器
但是.....如果nginx宕機,會導致用戶請求失敗,但是keepalived沒有掛掉不會進行切換,所以需要撰寫一個腳本檢測Nginx的存活狀態,如果不存活則kill掉keepalived
5.1 Nginx故障切換腳本
[root@lb01 ~]# vim check_web.sh
#!/bin/sh
nginxpid=$(ps -ef | grep [n]ginx | wc -l)
#1.判斷Nginx是否存活,如果不存活則嘗試啟動Nginx
if [ $nginxpid -eq 0 ];then
systemctl start nginx &>/dev/null
sleep 3
#2.等待3秒后再次獲取一次Nginx狀態
nginxpid=$(ps -ef | grep [n]ginx | wc -l)
#3.再次進行判斷, 如Nginx還不存活則停止Keepalived,讓地址進行漂移,并退出腳本
if [ $nginxpid -eq 0 ];then
systemctl stop keepalived
fi
fi
#給腳本增加可執行權限
[root@lb01 ~]# chmod +x /root/check_web.sh
5.2 使用keepalived組態檔呼叫nginx切換腳本
-
配置搶占式時
#只需要在主節點配置 [root@lb01 ~]# vim /etc/keepalived/keepalived.conf global_defs { router_id LoadBalance01 } #每5秒執行一次腳本,腳本執行內容不能超過5秒,否則會中斷再次重新執行腳本 vrrp_script check_web { script "/root/check_web.sh" interval 5 } vrrp_instance VI_1 { state MASTER nopreempt interface eth0 virtual_router_id 50 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.15.3 } #呼叫計劃的腳本 track_script { check_web } } -
配置非搶占式時
#配置非搶占式時,兩邊都要配置腳本 [root@lb01 ~]# scp check_web.sh 172.16.1.6:/root #備用節點也要配置 [root@lb02 ~]# cat /etc/keepalived/keepalived.conf global_defs { router_id LoadBalance02 } vrrp_script check_web { script "/root/check_web.sh" interval 5 } vrrp_instance VI_1 { state BACKUP nopreempt interface eth0 virtual_router_id 50 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.15.3 } track_script { check_web } }
5.3 測驗
- 將VIP所在機器nginx的組態檔修改錯誤
- 停止nginx
- 查看VIP是否切換
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/412799.html
標籤:其他
上一篇:雙系統設定默認啟動系統
