通常是指2臺機器啓動着徹底相同的業務系統,當有一臺機器down機了,另一臺服務器就能快速的接管,對於訪問的用戶是無感知的。nginx
硬件使用F5web
軟件使用keepalivedvim
keepalived軟件是基於VRRP協議實現的,VRRP虛擬路由冗餘協議,主要用於解決單點故障問題windows
好比公司的網絡是經過網關進行上網的,那麼若是該路由器故障了,網關沒法轉發報文了,此時全部人都沒法上網了,怎麼辦?緩存
一般作法是給路由器增長一臺北街店,可是問題是,若是咱們的主網關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的信息。code
一般業務系統須要保證7×24小時不DOWN機,好比公司內部的OA系統,天天公司人員都須要使用,則不容許Down機,做爲業務系統來講隨時均可用router
一、如何肯定誰是主節點誰是背節點(選舉投票,優先級)
二、若是Master故障,Backup自動接管,那麼Master回覆後會奪權嗎(搶佔試、非搶佔式)
三、若是兩臺服務器都認爲本身是Master會出現什麼問題(腦裂)
做用 | IP | 角色 |
---|---|---|
節點1 | 10.0.0.5 | Master |
節點2 | 10.0.0.6 | Backup |
VIP | 10.0.0.3 |
[root@lb01 ~]# yum install -y keepalived [root@lb02 ~]# yum install -y keepalived
#找到配置文件 [root@lb02 ~]# rpm -qc keepalived /etc/keepalived/keepalived.conf /etc/sysconfig/keepalived #編輯配置文件 [root@lb01 ~]# cat /etc/keepalived/keepalived.conf 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地址 } }
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf 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配置區別 | Master節點配置 | Backup節點配置 |
---|---|---|
route_id(惟一標識) | router_id lb01 | router_id lb02 |
state(角色狀態) | state MASTER | state BACKUP |
priority(競選優先級) | priority 150 | priority 100 |
#Master節點 [root@lb01 ~]# systemctl start keepalived [root@lb01 ~]# systemctl enable keepalived #Backup節點 [root@lb02 ~]# systemctl start keepalived [root@lb02 ~]# systemctl enable keepalived
#因爲節點1的優先級高於節點2,因此VIP在節點1上面 [root@lb01 ~]# ip addr | grep 10.0.0.3 inet 10.0.0.3/32 scope global eth0
[root@lb01 ~]# systemctl stop keepalived #節點2聯繫不上節點1,主動接管VIP [root@lb02 ~]# ip addr | grep 10.0.0.3 inet 10.0.0.3/32 scope global eth0
[root@lb01 ~]# systemctl start keepalived [root@lb01 ~]# ip addr | grep 10.0.0.3 inet 10.0.0.3/32 scope global eth0
一、兩個節點的state都必須配置爲BACKUP 二、兩個節點都必須加上配置 nopreempt 三、其中一個節點的優先級必需要高於另一個節點的優先級。 兩臺服務器都角色狀態啓用nopreempt後,必須修改角色狀態統一爲BACKUP,惟一的區分就是優先級。 Master配置 vrrp_instance VI_1 { state BACKUP priority 150 nopreempt } Backup配置 vrrp_instance VI_1 { state BACKUP priority 100 nopreempt }
#查看VIP在節點1上面 [root@lb01 ~]# ip addr | grep 10.0.0.3 inet 10.0.0.3/32 scope global eth0 #windows查看Mac地址
#將節點1的keepalived停掉 [root@lb01 ~]# systemctl stop keepalived #節點2接管VIP [root@lb02 ~]# ip addr | grep 10.0.0.3 inet 10.0.0.3/32 scope global eth0 #再次查看mac地址 arp -a
因爲某些緣由,致使兩臺keepalived高可用服務器在指定時間內,沒法檢測到對方的心跳,個字去的資源及服務的全部權,而此時的兩臺高可用服務器又都還活着。
一、服務器網線鬆動等網絡故障
二、服務器硬件故障發生損壞現象而崩潰
三、主備都開啓firewalld防火牆
#將節點1和節點2的防火牆都打開 [root@lb01 ~]# systemctl start firewalld [root@lb02 ~]# systemctl start firewalld #fireshark抓包查看
#若是發生鬧裂,則隨機kill掉一臺便可 #在備上編寫檢測腳本, 測試若是能ping通主而且備節點還有VIP的話則認爲產生了列腦 [root@lb02 ~]# cat check_split_brain.sh #!/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 -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
Nginx默認監聽在全部的IP地址上,VIP會飄到一臺節點上,至關於那臺nginx多了VIP這麼一個網卡,因此能夠訪問到nginx所在機器
[root@lb01 ~]# mkdir /server/scripts [root@lb01 ~]# vim /server/scripts/check_web.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 #給腳本增長執行權限 [root@lb01 ~]# chmod +x /server/scripts/check_web.sh
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf global_defs { router_id lb01 } #每5秒執行一次腳本,腳本執行內容不能超過5秒,不然會中斷再次從新執行腳本 vrrp_script check_web { script "/server/scripts/check_web.sh" interval 5 } 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 } #調用並運行腳本 track_script { check_web } } #在Master的keepalived中調用腳本,搶佔式,僅需在master配置便可。(注意,若是配置爲非搶佔式,那麼須要兩臺服務器都使用該腳本)