文章很長,且持續更新,建議收藏起來,慢慢讀!瘋狂創客圈總目錄 博客園版 爲您奉上珍貴的學習資源 :
免費贈送 :《尼恩Java面試寶典》 持續更新+ 史上最全 + 面試必備 2000頁+ 面試必備 + 大廠必備 +漲薪必備
免費贈送 :《尼恩技術聖經+高併發系列PDF》 ,幫你 實現技術自由,完成職業升級, 薪酬猛漲!加尼恩免費領
免費贈送 經典圖書:《Java高併發核心編程(卷1)加強版》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
免費贈送 經典圖書:《Java高併發核心編程(卷2)加強版》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
免費贈送 經典圖書:《Java高併發核心編程(卷3)加強版》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
免費贈送 資源寶庫: Java 必備 百度網盤資源大合集 價值>10000元 加尼恩領取
滴滴一面:Nginx高可用,IP跳躍、IP漫遊如何實現?
尼恩說在前面
HashMap的工作原理是目前java面試問的較爲常見的問題之一,在40歲老架構師 尼恩的讀者交流羣(50+)中,最近有小夥伴拿到了一線互聯網企業如得物、阿里、滴滴、極兔、有贊、shein 希音、百度、網易的面試資格,遇到很多很重要的面試題:
使用nginx、haproxy 反向代理 HTTP服務,如果 反向代理掛了,了怎麼辦?
Nginx 、haproxy如何實現高可用?
KeepAlived 如何實現 IP的漂移 / IP的跳躍?
很多 小夥伴 沒有回答好,導致面試掛了。KeepAlived + Nginx 這個是一個非常重要的基礎組件,考察的是高可用HA的基本功。
如何才能回答得很漂亮,才能 讓面試官刮目相看、口水直流呢?這裏,尼恩給大家做一下系統化、體系化的梳理,讓面試官愛到 “不能自已、口水直流”,然後幫大家 實現 ”offer自由”。
當然,這道面試題,以及參考答案,也會收入咱們的 《尼恩Java面試寶典》V175版本PDF集羣,供後面的小夥伴參考,提升大家的 3高 架構、設計、開發水平。
注:本文以 PDF 持續更新,最新尼恩 架構筆記、面試題 的PDF文件,請關注本公衆號【技術自由圈】獲取。
nginx-keepalived的高可用方案
我們使用 nginx-keepalived雙機熱備機制,vip主機可以進行漂移,這樣主機掛掉了,還有備用機可以頂上
具體的vip漂移架構圖,如下:
Keepalived是什麼?
Keepalived起初是爲LVS設計的,專門用來監控集羣系統中各個服務節點的狀態,
Keepalived 是一款輕量級HA集羣應用,它的設計初衷是爲了做LVS集羣的HA,即探測LVS健康情況,從而進行主備切換,不僅如此,還能夠探測LVS代理的後端主機的健康狀況,動態修改LVS轉發規則。
當LVS進行主備切換的時候,對外提供服務的IP是如何做到切換的呢?
這就依賴於keepalived 所應用的vrrp協議,即Virtual Reduntant Routing Protocol,虛擬冗餘路由協議。簡單來講,此協議是將IP設置在虛擬接口之上,根據一定的規則實現IP在物理主機上流動,即哪臺主機可以佔有該IP。
而且keepalived具有腳本調用接口,可通過腳本完成拓展功能。
它根據TCP/IP參考模型的第三、第四層、第五層交換機制檢測每個服務節點的狀態,如果某個服務器節點出現異常,或者工作出現故障,Keepalived將檢測到,並將出現的故障的服務器節點從集羣系統中剔除,這些工作全部是自動完成的,不需要人工干涉,需要人工完成的只是修復出現故障的服務節點。
後來Keepalived又加入了VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虛擬路由冗餘協議)出現的目的是解決靜態路由出現的單點故障問題,通過VRRP可以實現網絡不間斷穩定運行,因此Keepalvied一方面具有服務器狀態檢測和故障隔離功能,另外一方面也有HAcluster功能。
健康檢查和失敗切換是keepalived的兩大核心功能。所謂的健康檢查,就是採用tcp三次握手,icmp請求,http請求,udp echo請求等方式對負載均衡器後面的實際的服務器(通常是承載真實業務的服務器)進行保活;而失敗切換主要是應用於配置了主備模式的負載均衡器,利用VRRP維持主備負載均衡器的心跳,當主負載均衡器出現問題時,由備負載均衡器承載對應的業務,從而在最大限度上減少流量損失,並提供服務的穩定性。
VRRP虛擬路由冗餘協議
虛擬路由冗餘協議(Virtual Router Redundancy Protocol,簡稱VRRP)是由IETF提出的解決局域網中配置靜態網關出現單點失效現象的路由協議,1998年已推出正式的RFC2338協議標準。
VRRP廣泛應用在邊緣網絡中,它的設計目標是支持特定情況下IP數據流量失敗轉移不會引起混亂,允許主機使用單路由器,以及即使在實際第一跳路由器使用失敗的情形下仍能夠維護路由器間的連通性。
VRRP協議的來源
在現實的網絡環境中。主機之間的通信都是通過配置靜態路由或者(默認網關)來完成的,而主機之間的路由器一旦發生故障,通信就會失效,因此這種通信模式當中,路由器就成了一個單點瓶頸,爲了解決這個問題,就引入了VRRP協議。
VRRP的核心概念
VRRP是一種路由容錯協議,也可以叫做備份路由協議。
在VRRP協議中,有兩組重要的概念:
- VRRP路由器和虛擬路由器
- 主控路由器和備份路由器
備份路由器(BACKUP):虛擬路由器中的其他物理路由器不擁有對外的虛擬IP,也不對外提供網絡功能,僅接受MASTER的VRRP狀態通告信息,這些路由器被稱爲備份路由器。當主路由器失敗時,處於BACKUP角色的備份路由器將重新進行選舉,產生一個新的主路由器進入MASTER角色,繼續提供對外服務,整個切換對用戶來說是完全透明的。
虛擬路由器
VRRP路由器(物理實體)
什麼是VRRP路由器?
VRRP路由器是指運行VRRP的路由器,是物理實體;
虛擬路由器:
什麼是虛擬路由器?
虛擬路由器是指VRRP協議創建的,是邏輯概念。一組VRRP路由器(物理實體)協同工作,共同構成一臺虛擬路由器。該虛擬路由器對外表現爲一個具有唯一固定的IP地址和MAC地址的邏輯路由器。
虛擬路由器是VRRP備份組中所有路由器的集合,它是一個邏輯概念,並不是正真存在的。從備份組外面看備份組中的路由器,感覺組中的所有路由器就像一個 一樣,可以理解爲在一個組中: 主路由器+所有備份路由器=虛擬路由器。
虛擬路由器有一個虛擬的IP地址和MAC地址。
主機將虛擬路由器當作默認網關。虛擬MAC地址的格式爲00-00-5E-00-01-{VRID}。通常情況下,虛擬路由器迴應ARP請求使用的是虛擬MAC地址,只有虛擬路由器做特殊配置的時候,纔回應接口的真實MAC地址。
主控路由器主路由器(MASTER):
什麼是主控路由器?
處於同一個VRRP組中的路由器具有兩種互斥的角色:主控路由器和備份路由器
一個VRRP組中有且只有一臺處於主控角色的路由器,可以有一個或者多個處於備份角色的路由器VRRP協議從路由器組中選出一臺作爲主控路由器,負責ARP解析和轉發IP數據包,組中的其他路由器作爲備份的角色並處於待命狀態。
虛擬路由器通過虛擬IP對外提供服務,而在虛擬路由器內部同一時間只有一臺物理路由器對外提供服務,這臺提供服務的物理路由器被稱爲主路由器。一般情況下Master是由選舉算法產生,它擁有對外服務的虛擬IP,提供各種網絡功能,如:ARP請求,ICMP數據轉發等。
當由於某種原因主控路由器發生故障時,其中的一臺備份路由器能在瞬間的時延後升級爲主控路由器,由於此切換非常迅速而且不用改變IP地址和MAC地址,故對終端使用者系統是透明的。
一個局域網絡內的所有主機都設置缺省路由,當網內主機發出的目的地址不在本網段時,報文將被通過缺省路由發往外部路由器,從而實現了主機與外部網絡的通信。
當缺省路由器down掉(即端口關閉)之後,內部主機將無法與外部通信,如果路由器設置了VRRP時,那麼這時,虛擬路由將啓用備份路由器,從而實現全網通信。
題外話:ARP協議
地址解析協議,即ARP(Address Resolution Protocol),是根據IP地址獲取物理地址的一個TCP/IP協議。
主機發送信息時將包含目標IP地址的ARP請求廣播到局域網絡上的所有主機,並接收返回消息,以此確定目標的物理地址。
arp緩存:收到返回消息後將該IP地址和物理地址存入本機ARP緩存中並保留一定時間,下次請求時直接查詢ARP緩存以節約資源。
地址解析協議是建立在網絡中各個主機互相信任的基礎上的,局域網絡上的主機可以自主發送ARP應答消息,其他主機收到應答報文時不會檢測該報文的真實性就會將其記入本機ARP緩存;由此攻擊者就可以向某一主機發送僞ARP應答報文,使其發送的信息無法到達預期的主機或到達錯誤的主機,這就構成了一個ARP欺騙。
ARP命令可用於查詢本機ARP緩存中IP地址和MAC地址的對應關係、添加或刪除靜態對應關係等。
相關協議有RARP、代理ARP。NDP用於在IPv6中代替地址解析協議。
ARP協議工作過程
主機A的IP地址爲192.168.1.1,MAC地址爲0A-11-22-33-44-01;
主機B的IP地址爲192.168.1.2,MAC地址爲0A-11-22-33-44-02;
當主機A要與主機B通信時,地址解析協議可以將主機B的IP地址(192.168.1.2)解析成主機B的MAC地址,以下爲工作流程:
第1步:根據主機A上的路由表內容,IP確定用於訪問主機B的轉發IP地址是192.168.1.2。然後A主機在自己的本地ARP緩存中檢查主機B的匹配MAC地址。
第2步:如果主機A在ARP緩存中沒有找到映射,它將詢問192.168.1.2的硬件地址,從而將ARP請求幀廣播到本地網絡上的所有主機。源主機A的IP地址和MAC地址都包括在ARP請求中。本地網絡上的每臺主機都接收到ARP請求並且檢查是否與自己的IP地址匹配。如果主機發現請求的IP地址與自己的IP地址不匹配,它將丟棄ARP請求。
第3步:主機B確定ARP請求中的IP地址與自己的IP地址匹配,則將主機A的IP地址和MAC地址映射添加到本地ARP緩存中。
第4步:主機B將包含其MAC地址的ARP回覆消息直接發送回主機A。
第5步:當主機A收到從主機B發來的ARP回覆消息時,會用主機B的IP和MAC地址映射更新ARP緩存。本機緩存是有生存期的,生存期結束後,將再次重複上面的過程。主機B的MAC地址一旦確定,主機A就能向主機B發送IP通信了。
VRRP協議選舉機制
VRRP路由器在運行過程中有三種狀態:
-
Initialize狀態:
系統啓動後就進入Initialize,此狀態下路由器不對VRRP報文做任何處理;
-
Master狀態;
-
Backup狀態;
一般主路由器處於Master狀態,備份路由器處於Backup狀態。
VRRP使用選舉機制來確定路由器的狀態,優先級選舉:
1.VRRP組中IP擁有者。如果虛擬IP地址與VRRP組中的某臺VRRP路由器IP地址相同,則此路由器爲IP地址擁有者,這臺路由器將被定位主路由器。
2.比較優先級。如果沒有IP地址擁有者,則比較路由器的優先級,優先級的範圍是0~255,優先級大的作爲主路由器
3.比較IP地址。在沒有Ip地址擁有者和優先級相同的情況下,IP地址大的作爲主路由器。
如下圖所示,虛擬IP爲10.1.1.254,在VRRP組中沒有IP地址擁有者,則比較優先級,很明顯RB和RA的優先級要大於RC,則比較RA和RB的IP地址,RB的IP地址大。
所以RB爲組中的主路由器。
選舉流程
路由器使用VRRP 功能後,會根據優先級確定自己在備份組中的角色。優先級高的路由器成爲Master 路由器,優先級低的成爲Backup 路由器。
-
Master 擁有對外服務的虛擬IP,提供各種網絡功能,並定期發送VRRP 報文,通知備份組內的其他設備自己工作正常;
-
Backup 路由器只接收Master 發來的報文信息,用來監控Master 的運行狀態。
當Master 失效時,Backup 路由器進行選舉,優先級高的Backup 將成爲新的Master 。
在搶佔方式下,當Backup路由器收到VRRP 報文後,會將自己的優先級與報文中的優先級進行比較。如果大於通告報文中的優先級,則成爲Master 路由器;否則將保持Backup狀態;
在非搶佔方式下,只要Master 路由器沒有出現故障,備份組中的路由器始終保持 Master 或Backup 狀態,Backup 路由器即使隨後被配置了更高的優先級也不會成爲Master 路由器;
如果Backup 路由器的定時器超時後仍未收到Master 路由器發送來的VRRP報文,則認爲Master 路由器已經無法正常工作,此時Backup 路由器會認爲自己是Master 路由器,並對外發送VRRP報文。
備份組內的路由器根據優先級選舉出Master 路由器,承擔報文的轉發功能。
Keepalived體系結構
Keepalived起初是爲LVS設計的,由於Keeplalived可以實現對集羣節點的狀態檢測,
而IPVS可以實現負載均衡功能,因此,Keepalived藉助於第三方模塊IPVS就可以很方便地搭建一套負載均衡系統。
在Keepalived當中IPVS模塊是可配置的,如果需要負載均衡功能,可以在編譯Keepalived時開打負載均衡功能,也可以通過編譯參數關閉。
keepalived運行時,會啓動3個進程,分別爲:core(核心進程),check和vrrp
- core:負責主進程的啓動,維護和全局配置文件的加載;
- check:負責健康檢查
- vrrp:用來實現vrrp協議
SchedulerI/OMultiplexer是一個I/O複用分發調度器,它負載安排Keepalived所有內部的任務請求;
Memory Mngt是一個內存管理機制,這個框架提供了訪問內存的一些通用方法;
Control Plane 是keepalived的控制版面,可以實現對配置文件編譯和解析;
Core componets 這部分主要包含了5個部分;
- Watchdog:是計算機可靠領域中極爲簡單又非常有效的檢測工具,Keepalived正是通過它監控Checkers和VRRP進程的。
- Checkers: 這是Keepalived最基礎的功能,也是最主要的功能,可以實現對服務器運行狀態檢測和故障隔離。
- VRRP Stack: 這是keepalived後來引用VRRP功能,可以實現HA集羣中失敗切換功能。負責負載均衡器之間的失敗切換FailOver;
- IPVS wrapper:這個是IPVS功能的一個實現,IPVSwarrper模塊將可以設置好的IPVS規則發送的內核空間並且提供給IPVS模塊,最終實現IPVS模塊的負載功能。
- Netlink Reflector:用來實現高可用集羣Failover時虛擬IP(VIP)的設置和切換,
IPVS內核模塊
此模塊是此文的重點。
Linux 的 IPVS內核模塊基本上是一種高效的Layer-4交換機,它提供負載平衡的功能。
ipvs (IP Virtual Server) 實現了傳輸層負載均衡,也就是我們常說的4層LAN交換,作爲 Linux 內核的一部分。
ipvs運行在主機上,在真實服務器集羣前充當負載均衡器。
ipvs可以將基於TCP和UDP的服務請求轉發到真實服務器上,並使真實服務器的服務在單個 IP 地址上顯示爲虛擬服務。
當一個TCP連接的初始SYN報文到達時,IPVS就選擇一臺服務器,將報文轉發給它。
此後通過查發報文的IP和TCP報文頭地址,保證此連接的後繼報文被轉發到相同的服務器。這樣,IPVS不用檢查到請求的內容再選擇服務器,這就要求後端的服務器組是提供相同的服務,不管請求被送到哪一臺服務器,返回結果都應該是一樣的。但是在有一些應用中後端的服務器可能功能不一,有的是提供HTML文檔的Web服務器,有的是提供圖片的Web服務器,有的是提供CGI的Web服務器。這時,就需要基於內容請求分發 (Content-Based Request Distribution),同時基於內容請求分發可以提高後端服務器上訪問的局部性。
當一個TCP連接的初始SYN報文到達時,IPVS就選擇一臺服務器,將報文轉發給它。此後通過查發報文的IP和TCP報文頭地址,保證此連接的後繼報文被轉發到相同的服務器。這樣,IPVS無法檢查到請求的內容再選擇服務器,這就要求後端的服務器組是提供相同的服務,不管請求被送到哪一臺服務器,返回結果都應該是一樣的。但是在有一些應用中後端>的服務器可能功能不一,有的是提供HTML文檔的Web服務器,有的是提供圖片的Web服務器,有的是提供CGI的Web服務器。這時,就需要基於內容請求分發 (Content-Based Request Distribution),同時基於內容請求分發可以提高後端服務器上訪問的局部性。
Keepalived對服務器運行狀態和故障隔離的工作原理
Keepalived工作在TCP/IP參考模型的網絡層/傳輸層/應用層:
網絡層:
Keepalived通過ICMP協議向服務器集羣中的每一個節點發送一個ICMP數據包(有點類似與Ping的功能),如果某個節點沒有返回響應數據包,那麼認爲該節點發生了故障,Keepalived將報告這個節點失效,並從服務器集羣中剔除故障節點。
傳輸層:
Keepalived 在傳輸層裏利用了TCP協議的端口連接和掃描技術來判斷集羣節點的端口是否正常,比如對於常見的WEB服務器80端口。或者SSH服務22端口,Keepalived一旦在傳輸層探測到這些端口號沒有數據響應和數據返回,就認爲這些端口發生異常,然後強制將這些端口所對應的節點從服務器集羣中剔除掉。
應用層:
Keepalived 的運行方式也更加全面化和複雜化,用戶可以通過自定義Keepalived工作方式,例如:
可以通過編寫程序或者腳本來運行Keepalived,而Keepalived將根據用戶的設定參數檢測各種程序或者服務是否允許正常,如果Keepalived的檢測結果和用戶設定的不一致時,Keepalived將把對應的服務器從服務器集羣中剔除。
Keepalived + Nginx 系統架構
在Keepalived + Nginx高可用負載均衡架構中,keepalived負責實現High-availability (HA) 功能控制前端機VIP(虛擬網絡地址),當有設備發生故障時,熱備服務器可以瞬間將VIP自動切換過來,實際運行中體驗只有2秒鐘切換時間,DNS服務可以負責前端VIP的負載均衡。
nginx負責控制後端web服務器的負載均衡,將客戶端的請求按照一定的算法轉發給後端Real Server處理,而Real Server將響應直接返回給客戶端。
系統環境
兩臺負載機器安裝:centos7.5+docker+nginx+keepalived,分別命名爲:NGINX_MASTER,NGINX_BACKUP。
後端web服務器,可以是提供web服務的任何架構,分別命名爲:WEB_1,WEB_2。
後端數據庫機器可任意架構,只要能提供數據庫服務即可。
服務器 | 操作系統 | IP地址 | 安裝軟件 |
---|---|---|---|
NGINX_MASTER | Centos 7.5 64位 | 192.168.2.228 | docker+nginx+keepalived |
NGINX_BACKUP | Centos 7.5 64位 | 192.168.2.229 | docker+nginx+keepalived |
WEB_1 | Centos 7.5 64位 | 192.168.2.226 | docker+springboot |
WEB_2 | Centos 7.5 64位 | 192.168.2.227 | docker+springboot |
數據庫集羣 | Centos 7.5 64位 | mysql集羣 |
keepalive的配置文件
vim /etc/keepalived/keepalived.conf
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_pid.sh" # 檢查nginx狀態的腳本
interval 2
weight 3
}
vrrp_instance VI_1 {
state MASTER #備份服務器上將MASTER改爲BACKUP
interface ens32
virtual_router_id 51
priority 100 #備份服務上將100改爲小於100,可配置成90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.242 #有多個vip可在下面繼續增加
}
track_script {
chk_nginx
}
}
Keepalived的配置文件可以分爲三塊:
- 全局定義塊:對整個 Keepalive 配置生效的,不管是否使用 LVS;
- VRRP 實例定義塊:是 Keepalived 的核心;
- 虛擬服務器(LVS)定義塊:LVS 配置只在使用 Keepalived 來配置和管理 LVS 時才需要使用,如果僅僅使用 Keepalived做 HA,LVS 的配置完全是不需要的。
配置文件都是以塊(block)形式組織的,每個塊都在{和}包圍的範圍內。#和!開頭的行都是註釋。
部署架構
目的: 進一步提高keepalived 可用性
設計:有3臺keepalived 服務器 192.168.1.106 192.168.1.107 192.168.1.108。
vip 是192.168.1.249
效果:只要有一臺keepalive 運行正常。vip 就可以訪問
server | hostname | ip |
---|---|---|
keepalived | z6 | 192.168.1.106 |
keepalived | z7 | 192.168.1.107 |
keepalived | z8 | 192.168.1.108 |
非搶佔模式 默認 是誰先開啓vip 運行在哪臺機器上的。如果發生故障轉移,再比較priority
離線部署keepalived
首先安裝keepalived,下載離線包的命令爲
yum install --downloadonly --downloaddir=./ keepalived
已經提供了安裝包,上傳安裝包到 linux,比如root目錄
keepalived_rpm.tar.gz
解壓縮,然後執行命令安裝
cd /root/
tar -zxvf keepalived_rpm.tar.gz
cd keepalived_rpm
rpm -Uvh --force --nodeps *rpm
輸出
[root@localhost ~]# tar -zxvf keepalived_rpm.tar.gz
keepalived_rpm/
keepalived_rpm/keepalived-1.3.5-19.el7.x86_64.rpm
keepalived_rpm/lm_sensors-libs-3.4.0-8.20160601gitf9185e5.el7.x86_64.rpm
keepalived_rpm/net-snmp-agent-libs-5.7.2-49.el7_9.1.x86_64.rpm
keepalived_rpm/net-snmp-libs-5.7.2-49.el7_9.1.x86_64.rpm
安裝的輸出
[root@localhost ~]# cd keepalived_rpm
[root@localhost keepalived_rpm]# rpm -Uvh --force --nodeps *rpm
warning: keepalived-1.3.5-19.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:net-snmp-libs-1:5.7.2-49.el7_9.1 ################################# [ 25%]
2:lm_sensors-libs-3.4.0-8.20160601g################################# [ 50%]
3:net-snmp-agent-libs-1:5.7.2-49.el################################# [ 75%]
4:keepalived-1.3.5-19.el7 ################################# [100%]
編寫nginx的監控腳本
vi /etc/keepalived/check_nginx.sh
#!/bin/bash
A=`ps -C haproxy --no-header |wc -l`
if [ $A -eq 0 ];then
systemctl stop keepalived
fi
添加檢查nginx狀態的腳本 /etc/keepalived/nginx_pid.sh
#!/bin/bash
##檢查nginx.pid文件是否存在
if [ -e /usr/local/nginx/logs/nginx.pid ];then
echo "nginx 已經啓動"
else
/usr/local/nginx/sbin/nginx
if [ $? -eq 0 ];then
echo "nginx 已經啓動"
fi
fi
或者
#!/bin/bash
##使用ps -C nginx --no-header 來檢測nginx 是否啓動
date=`date`
nginx_status=`ps -C nginx --no-header|wc -l`
if [ $nginx_status -eq 0 ];then
echo "nginx沒有啓動"
/usr/local/nginx/sbin/nginx
if [ $? -eq 0 ];then
echo "$date nginx已經成功啓動"
fi
else
echo "$date nginx 已經啓動 "
fi
上傳腳本,測試一下腳本
sh /etc/keepalived/check_nginx.sh
修改keepalived配置
cat /etc/keepalived/keepalived.conf
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
複製 準備好的文件到離線環境,或者直接編輯。
vi /etc/keepalived/keepalived.conf
global_defs { #全局定義部分
notification_email { #設置警報郵箱
[email protected] #郵箱1
[email protected] #郵箱2
[email protected]
}
notification_email_from [email protected] #設置發件人地址
smtp_server 127.0.0.1 #設置smtp server地址
smtp_connect_timeout 30 #設置smtp超時連接時間 以上參數可以不配置
router_id HA_HAPROXY #是Keepalived服務器的路由標識在一個局域網內,這個標識(router_id)是唯一的
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
}
vrrp_instance VI_1 { #VRRP實例定義區塊名字是VI_1
state BACKUP #表示當前實例VI_1的角色狀態這個狀態只能有MASTER和BACKUP兩種狀態,並且需要大寫這些字符, MASTER 爲正式工作的狀態,BACKUP爲備用的狀態
interface ens33 #綁定ens33網卡
virtual_router_id 101 # VRRP 路由 ID實例,每個實例是唯一的
priority 90 # 優先級,備服務器設置 90
advert_int 1 # 指定VRRP 心跳包通告間隔時間,默認1秒 ,MASTER與BACKUP之間通信檢查的時間間隔,
authentication { #authentication爲權限認證配置不要改動,同一vrrp實例的MASTER與BACKUP使用相同的密碼才能正常通信。
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #設置虛擬IP地址
# 192.168.31.60/24
172.18.8.231/24
}
track_script {
check_nginx
}
}
Keepalived的配置文件可以分爲三塊:
- 全局定義塊:對整個 Keepalive 配置生效的,不管是否使用 LVS;
- VRRP 實例定義塊:是 Keepalived 的核心;
- 虛擬服務器(LVS)定義塊:LVS 配置只在使用 Keepalived 來配置和管理 LVS 時才需要使用,如果僅僅使用 Keepalived做 HA,LVS 的配置完全是不需要的。
配置文件都是以塊(block)形式組織的,每個塊都在{和}包圍的範圍內。#和!開頭的行都是註釋。
離線包裏邊有 第一個節點的 配置文件,複製到 /etc/keepalived/ 目錄就行
cp /home/docker-compose/keepalive-ha/keepalived01.conf /etc/keepalived/keepalived.conf
輸出如下:
[root@localhost keepalive-ha]# pwd
/home/docker-compose/keepalive-ha
[root@localhost keepalive-ha]# cp /home/docker-compose/keepalive-ha/keepalived01.conf /etc/keepalived/keepalived.conf
cp: overwrite ‘/etc/keepalived/keepalived.conf’? yes
[root@localhost keepalive-ha]# cat /etc/keepalived/keepalived.conf
global_defs {
notification_email { #
[email protected]
[email protected]
}
重啓 keepalive服務
命令如下
# systemctl enable keepalived
# systemctl start keepalived
# systemctl restart keepalived
# systemctl status keepalived
輸出如下:
[root@localhost ~]# systemctl enable keepalived
Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
[root@localhost ~]# systemctl restart keepalived
[root@localhost ~]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2021-11-05 13:28:30 CST; 19s ago
Process: 48837 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 48838 (keepalived)
Tasks: 3
Memory: 3.4M
CGroup: /system.slice/keepalived.service
├─48838 /usr/sbin/keepalived -D
├─48839 /usr/sbin/keepalived -D
└─48840 /usr/sbin/keepalived -D
Nov 05 13:28:34 localhost.localdomain Keepalived_vrrp[48840]: Sending gratuitous ARP on ens33 for 192.168.31.60
Nov 05 13:28:34 localhost.localdomain Keepalived_vrrp[48840]: Sending gratuitous ARP on ens33 for 192.168.31.60
Nov 05 13:28:34 localhost.localdomain Keepalived_vrrp[48840]: Sending gratuitous ARP on ens33 for 192.168.31.60
Nov 05 13:28:34 localhost.localdomain Keepalived_vrrp[48840]: Sending gratuitous ARP on ens33 for 192.168.31.60
Nov 05 13:28:39 localhost.localdomain Keepalived_vrrp[48840]: Sending gratuitous ARP on ens33 for 192.168.31.60
Nov 05 13:28:39 localhost.localdomain Keepalived_vrrp[48840]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 ...1.60
Nov 05 13:28:39 localhost.localdomain Keepalived_vrrp[48840]: Sending gratuitous ARP on ens33 for 192.168.31.60
Nov 05 13:28:39 localhost.localdomain Keepalived_vrrp[48840]: Sending gratuitous ARP on ens33 for 192.168.31.60
Nov 05 13:28:39 localhost.localdomain Keepalived_vrrp[48840]: Sending gratuitous ARP on ens33 for 192.168.31.60
Nov 05 13:28:39 localhost.localdomain Keepalived_vrrp[48840]: Sending gratuitous ARP on ens33 for 192.168.31.60
Hint: Some lines were ellipsized, use -l to show in full.
查看IP
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:69:a4:84 brd ff:ff:ff:ff:ff:ff
inet 172.18.8.101/24 brd 172.18.8.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 172.18.8.231/24 scope global secondary ens33
valid_lft forever preferred_lft forever
inet6 fe80::b7be:346e:2f0f:859e/64 scope link noprefixroute
valid_lft forever preferred_lft forever
訪問高可用代理後的nacos
高可用代理
http://172.18.8.231:28848/nacos/#/configurationManagement?dataId=&group=&appName=&namespace=
用戶名:nacos ,密碼 nacos
第2個節點,第3個節點離線部署keepalived
複製文件/並且安裝
scp /root/keepalived_rpm.tar.gz [email protected]:/root
scp /root/keepalived_rpm.tar.gz [email protected]:/root
解壓縮,然後執行命令安裝
cd /root/
tar -zxvf keepalived_rpm.tar.gz
cd keepalived_rpm
rpm -Uvh --force --nodeps *rpm
把離線包裏的 keepalive-ha 傳過去,然後複製到 /etc/keepalived/
第1個節點,執行
cp /home/docker-compose/keepalive-ha/keepalived01.conf /etc/keepalived/keepalived.conf
cp /home/docker-compose/keepalive-ha/check_haproxy.sh /etc/keepalived/
cat /etc/keepalived/keepalived.conf
第二個節點,執行
cp /home/docker-compose/keepalive-ha/keepalived02.conf /etc/keepalived/keepalived.conf
cp /home/docker-compose/keepalive-ha/check_haproxy.sh /etc/keepalived/
cat /etc/keepalived/keepalived.conf
輸出如下:
[root@localhost keepalive-ha]# cp /home/docker-compose/keepalive-ha/keepalived02.conf /etc/keepalived/keepalived.conf
cp: overwrite ‘/etc/keepalived/keepalived.conf’? yes
[root@localhost keepalive-ha]# cp /home/docker-compose/keepalive-ha/check_haproxy.sh /etc/keepalived/
cp: overwrite ‘/etc/keepalived/check_haproxy.sh’? yes
第3個節點,執行
cp /home/docker-compose/keepalive-ha/keepalived03.conf /etc/keepalived/keepalived.conf
cp /home/docker-compose/keepalive-ha/check_haproxy.sh /etc/keepalived/
cat /etc/keepalived/keepalived.conf
輸出如下:
cp /home/docker-compose/keepalive-ha/keepalived03.conf /etc/keepalived/keepalived.conf
cp: overwrite ‘/etc/keepalived/keepalived.conf’? yes
[root@k8s-master keepalived_rpm]# cp /home/docker-compose/keepalive-ha/check_haproxy.sh /etc/keepalived/
cp: overwrite ‘/etc/keepalived/check_haproxy.sh’? yes
重啓 keepalive服務
命令如下
systemctl enable keepalived
systemctl start keepalived
systemctl restart keepalived
systemctl status keepalived
systemctl stop keepalived
查看IP地址
ip a
ip a | grep ens33
ifconfig ens33
輸出結果
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:69:a4:84 brd ff:ff:ff:ff:ff:ff
inet 172.18.8.101/24 brd 172.18.8.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 172.18.8.231/24 scope global secondary ens33
valid_lft forever preferred_lft forever
inet6 fe80::b7be:346e:2f0f:859e/64 scope link noprefixroute
valid_lft forever preferred_lft forever
測試高可用
停止101上的haproxy
sh ./stop_node.sh
sh ./start_node.sh
[root@localhost haproxy-ha]# sh ./stop_node.sh
===========stoping haproxy-ha .....================
WARNING: Some services (ha_sit_proxy) use the 'deploy' key, which will be ignored. Compose does not support 'deploy' configuration - use `docker stack deploy` to deploy to a swarm.
Stopping ha_sit_proxy ... done
Removing ha_sit_proxy ... done
Network ha-network-overlay is external, skipping
訪問vip的ng
http://172.18.8.231:80/
可以正常訪問
訪問vip的nacos (假設已經安裝nacos)
http://172.18.8.231:28848/nacos/#/login
可以正常訪問
訪問高可用代理的minio(假設已經安裝minio)
高可用代理
http://172.18.8.231:29991/minio/
用戶名:nacos ,密碼 nacos
說在最後
高可用相關的面試題,是非常常見的面試題。
以上的內容,如果大家能對答如流,如數家珍,基本上 面試官會被你 震驚到、吸引到。最終,讓面試官愛到 “不能自已、口水直流”。offer, 也就來了。
在面試之前,建議大家系統化的刷一波 5000頁《尼恩Java面試寶典》V175,在刷題過程中,如果有啥問題,大家可以來 找 40歲老架構師尼恩交流。
高可用包括 去掉IDC機房內部的 single of failure, 也包括 去掉 IDC機房之間的 single of failure,尼恩的HA高可用的系列文章,可供參考:
去掉IDC機房內部的 single of failure,參見下面的案例
《美團面試:ES+Redis+MySQL高可用,如何實現?》
去掉 IDC機房之間的 single of failure,主要是異地多活
另外,建議大家系統化的刷一波 5000頁《尼恩Java面試寶典》V175,當然,如果沒有面試機會,可以找尼恩來幫扶、領路。
尼恩已經指導了大量的就業困難的小夥伴上岸,前段時間,幫助一個40歲+就業困難小夥伴拿到了一個年薪100W的offer,小夥伴實現了 逆天改命 。
技術自由的實現路徑:
實現你的 架構自由:
《阿里二面:千萬級、億級數據,如何性能優化? 教科書級 答案來了》
《峯值21WQps、億級DAU,小遊戲《羊了個羊》是怎麼架構的?》
… 更多架構文章,正在添加中
實現你的 響應式 自由:
這是老版本 《Flux、Mono、Reactor 實戰(史上最全)》
實現你的 spring cloud 自由:
《Spring cloud Alibaba 學習聖經》 PDF
《分庫分表 Sharding-JDBC 底層原理、核心實戰(史上最全)》
《一文搞定:SpringBoot、SLF4j、Log4j、Logback、Netty之間混亂關係(史上最全)》
實現你的 linux 自由:
實現你的 網絡 自由:
《網絡三張表:ARP表, MAC表, 路由表,實現你的網絡自由!!》
實現你的 分佈式鎖 自由:
實現你的 王者組件 自由:
《隊列之王: Disruptor 原理、架構、源碼 一文穿透》
《緩存之王:Caffeine 源碼、架構、原理(史上最全,10W字 超級長文)》
《Java Agent 探針、字節碼增強 ByteBuddy(史上最全)》