Keepalived+HAProxy 搭建高可用負(fù)載均衡
“負(fù)載均衡是分布式系統(tǒng)中不可或缺的重要環(huán)節(jié),通過負(fù)載均衡按照指定的調(diào)度算法將請求分發(fā)至網(wǎng)絡(luò)中多個節(jié)點(diǎn)進(jìn)行處理。本文將介紹基于開源軟件HAProxy實現(xiàn)負(fù)載均衡并且通過Keepalived實現(xiàn)高可用的配置方法,希望讀者通過參考本文的探索成果可以快速實現(xiàn)高可用的軟件負(fù)載均衡,也希望讀者能夠舉一反三、觸類旁通,通過自我驅(qū)動進(jìn)行更深入的研究來配置更多的功能來滿足自身需求。
1. 概述
軟件負(fù)載均衡技術(shù)是指可以為多個后端服務(wù)器節(jié)點(diǎn)提供前端IP流量分發(fā)調(diào)度服務(wù)的軟件技術(shù)。Keepalived和HAProxy是眾多軟負(fù)載技術(shù)中的兩種,其中Keepalived既可以實現(xiàn)負(fù)載均衡也可以實現(xiàn)高可用,而HAProxy則更加專注于提供高性能TCP和HTTP反向代理和負(fù)載均衡能力。
1.1 Keepalived
Keepalived工作在OSI模型中的四層傳輸層。最初它是為了管理并監(jiān)控Linux虛擬服務(wù)器(LVS)集群中各服務(wù)節(jié)點(diǎn)的狀態(tài),后來又加入了路由冗余協(xié)議(VRRP)來實現(xiàn)高可用功能,所以Keepalived除了可以管理配置LVS外,還可以作為Nginx、HAProxy等的高可用解決方案。
Keepalived同時運(yùn)行于主服務(wù)器(Master)和備服務(wù)器(Backup)之上,所有的服務(wù)器上運(yùn)行的Keepalived之間通過VRRP交互,VRRP設(shè)計目的是為了解決靜態(tài)路由單點(diǎn)故障問題,保證個別節(jié)點(diǎn)宕機(jī)時,整個網(wǎng)絡(luò)可以不間斷的運(yùn)行。
Keepalived不但可以實現(xiàn)主備服務(wù)器的高可用性,同時還可以管理LVS實現(xiàn)后端服務(wù)器的負(fù)載均衡并進(jìn)行后端服務(wù)器節(jié)點(diǎn)的健康檢查。它啟動核心進(jìn)程時讀取keepalived.conf配置文件。在主服務(wù)器上keepalived進(jìn)程按照配置文件配置的負(fù)載均衡策略開啟LVS轉(zhuǎn)發(fā)并對后端服務(wù)進(jìn)行健康檢查。利用VRRP協(xié)議主服務(wù)器周期性的發(fā)送廣播至備服務(wù)器,備服務(wù)器將會判斷主器服務(wù)器的狀態(tài),如果在配置的同步超時時間內(nèi)主服務(wù)器節(jié)點(diǎn)未能發(fā)出廣播,那么keepalived將啟動高可用切換機(jī)制選出新的主服務(wù)器。切換過程中,原有主服務(wù)器上的虛擬地址(VIP)及負(fù)載能力將由新的主服務(wù)器來接替承載。
1.2 HAProxy
HAProxy 是一款TCP/HTTP 反向代理負(fù)載均衡服務(wù)器軟件,可工作在OSI模型中的四層傳輸層以及七層應(yīng)用層。HAProxy特別適用于那些負(fù)載壓力大的web站點(diǎn),這些站點(diǎn)通常需要會話保持或七層處理。HAProxy運(yùn)行在時下的服務(wù)器上,可以支持?jǐn)?shù)以萬計的并發(fā)連接。并且它的運(yùn)行模式使得它可以很簡單安全地整合進(jìn)現(xiàn)有的系統(tǒng)架構(gòu)中,同時可以保護(hù)web服務(wù)器不被暴露到網(wǎng)絡(luò)上。HAproxy允許用戶定義多組服務(wù)代理,代理由前端和后端組成,前端定義了服務(wù)監(jiān)聽的IP及端口,后端則定義了一組服務(wù)器及負(fù)載均衡的算法。通過服務(wù)代理將流量由前端負(fù)載均衡至后端服務(wù)器節(jié)點(diǎn)上。
1.3 Keepalived和HAProxy組合
由于HAProxy會存在單點(diǎn)故障問題,可以由Keepalived來為HAProxy提供高可用服務(wù),而HAProxy提供四層或七層高性能負(fù)載均衡及反向代理服務(wù),兩者共同實現(xiàn)高可用負(fù)載均衡,結(jié)構(gòu)如圖1所示。

圖1 Keepalived+HAProxy
2. Keepalived功能及安裝配置
2.1 核心功能
1.管理LVS負(fù)載均衡軟件
Keepalived最初是專為解決LVS的問題而誕生的。因此,Keepalived和LVS可緊密結(jié)合。
2.實現(xiàn)對LVS集群節(jié)點(diǎn)健康檢查
當(dāng)LVS集群中某個節(jié)點(diǎn)服務(wù)器發(fā)生故障時,Keepalived服務(wù)會自動將失效的節(jié)點(diǎn)從正常隊列中剔除,并將請求調(diào)度到別的正常的節(jié)點(diǎn)服務(wù)器上,從而保證用戶訪問不受影響。當(dāng)故障節(jié)點(diǎn)被修復(fù)后,Keepalived服務(wù)又會自動切換回來。
3.網(wǎng)絡(luò)服務(wù)高可用功能
Keepalived可以實現(xiàn)任意兩臺主機(jī)之間,如Master服務(wù)器和Backup服務(wù)器間的故障轉(zhuǎn)移和自動切換。假設(shè)某個服務(wù)是不能停機(jī)的,如LVS負(fù)載均衡、Nginx反向代理服務(wù)器等,可以利用Keepalived保證其高可用性。
2.2 高可用原理
Keepalived高可用服務(wù)的故障切換轉(zhuǎn)移是通過VRRP機(jī)制來實現(xiàn)的。在Keepalived服務(wù)正常運(yùn)行時,Master節(jié)點(diǎn)會不斷向Backup節(jié)點(diǎn)發(fā)送(多播方式)心跳信息,用以通知Master節(jié)點(diǎn)的存活狀態(tài)。當(dāng)Master節(jié)點(diǎn)發(fā)生故障時,就無法發(fā)送心跳信息,Backup節(jié)點(diǎn)也就無法檢測到來自Master的心跳信息,于是調(diào)用自身的接管程序,接管Master的資源和服務(wù)。當(dāng)Master恢復(fù)時,Backup又會釋放Master故障時自身接管的資源和服務(wù),恢復(fù)到原來的備用角色。無論Master如何切換,對外都應(yīng)該提供相同的服務(wù)IP地址,該IP也稱作虛擬地址VIP。客戶端并不需要因Master的改變而修改自己的配置,對他們來說這種切換是透明的。
路由冗余協(xié)議VRRP(Virtual Router Redundancy Protocol)早期是用來解決交換機(jī)、路由器等設(shè)備單點(diǎn)故障。VRRP通過競選機(jī)制來實現(xiàn)虛擬路由器的功能,所有的協(xié)議報文都是通過IP多播(Multicast)包形式來發(fā)送。在一組VRRP路由器集群中,有多臺物理路由器,但并不是同時工作,而是由一臺Master路由器負(fù)責(zé)路由工作,其他都是Backup,Master有一些特權(quán),比如擁有VIP地址等,擁有系統(tǒng)資源的Master負(fù)責(zé)轉(zhuǎn)發(fā)發(fā)送給網(wǎng)關(guān)地址的包和響應(yīng)ARP請求。只有Master路由器會一直發(fā)送心跳信息,此時Backup不會搶占Master。當(dāng)Master不可用時,Backup就收不到來自Master的心跳信息,此時多臺Backup中優(yōu)先級最高的路由器會搶占為Master,這種搶占非常快速,以保證服務(wù)的連續(xù)性。
2.3 安裝與配置
由于本文引用的技術(shù)構(gòu)架中Keepalived將僅為HAProxy提供高可用服務(wù),所以管理配置LVS負(fù)載均衡及節(jié)點(diǎn)健康檢查功能將不準(zhǔn)備展開篇幅,僅對高可用功能進(jìn)行介紹演示。
2.3.1 安裝
Keepalived支持源碼安裝,同時也可以通過不同操作系統(tǒng)安裝工具進(jìn)行安裝,本文以CentOS的yum工具為例進(jìn)行安裝介紹。此時應(yīng)該準(zhǔn)備兩臺服務(wù)器分別作為Master節(jié)點(diǎn)和Backup節(jié)點(diǎn),分別在兩臺服務(wù)器上執(zhí)行以下命令進(jìn)行安裝。
yum install -y keepalived
2.3.2 高可用配置
yum安裝后,Keepalived將生成配置文件:/etc/keepalived/keepalived.conf,可利用文本編輯器進(jìn)行配置修改。
vi /etc/keepalived/keepalived.conf
配置文件中主要由全局段、VRRP實例段、腳本段組成。
1.全局段定義(global_defs)
全局段定義允許用戶設(shè)置全局相關(guān)信息,例如通知信息、關(guān)鍵參數(shù)配置等,該段配置在Master節(jié)點(diǎn)和Backup節(jié)點(diǎn)上應(yīng)當(dāng)一致。
global_defs {notification_email {}notification_email_from [email protected]smtp_server 127.0.0.1smtp_connect_timeout 60vrrp_mcast_group4 224.0.0.18}
notification_email定義報警郵件地址,當(dāng)服務(wù)切換時發(fā)送報警郵件。notification_email_from定義發(fā)件人信息,smtp_server和smtp_connect_timeout分別定義了SMTP服務(wù)器及相應(yīng)的連接超時時間,vrrp_mcast_group4為VRRP IPv4多播地址,默認(rèn)為224.0.0.18,如果同一局域網(wǎng)內(nèi)有多組Keepalived時需要指定不同多播地址。
2.VRRP實例段定義(vrrp_instance)
這部分主要用來定義具體服務(wù)的實例配置,包括Keepalived主備狀態(tài)、接口、優(yōu)先級、認(rèn)證方式和VIP信息等,每個VRRP實例可以認(rèn)為是Keepalived服務(wù)的一個實例或作為一個業(yè)務(wù)服務(wù),在一組Keepalived服務(wù)配置中,VRRP實例可以有多個。
注意,存在于Master節(jié)點(diǎn)中的VRRP實例配置在Backup節(jié)點(diǎn)中也要有一致的配置(除了節(jié)點(diǎn)角色、優(yōu)先級不同),這樣才能實現(xiàn)故障切換轉(zhuǎn)移。
vrrp_instance R1{state MASTERinterface eth0virtual_router_id 50priority 100advert_int 1authentication {auth_type PASSauth_pass passwd}virtual_ipaddress {10.230.137.100}track_script {chk_haproxy}nopreemptpreempt_delay 2}
vrrp_instance配置段定義了一個VRRP實例并設(shè)定實例名稱;
state設(shè)定初始VRRP實例角色,配置先要為該實例所在的Keepalived服務(wù)器設(shè)定其角色,在Master服務(wù)器上設(shè)置為“MASTER”,在Backup服務(wù)器上則設(shè)置為“BACKUP”;
priority優(yōu)先級設(shè)定,范圍1-254,數(shù)字越大,表示實例優(yōu)先級越高,在同一個VRRP實例里,Master節(jié)點(diǎn)優(yōu)先級要高于Backup節(jié)點(diǎn);
virtual_router_id虛擬路由ID標(biāo)識,范圍0-255,Master和Backup節(jié)點(diǎn)配置中相同VRRP實例的虛擬路由ID標(biāo)識必須一致,否則將出現(xiàn)腦裂問題;
advert_int用來同步通知間隔,Master節(jié)點(diǎn)和Backup節(jié)點(diǎn)之間通信檢查的時間間隔,單位是秒。
角色相關(guān)信息設(shè)定完畢后就要開始配置VIP并綁定至指定的網(wǎng)絡(luò)接口上,在virtual_ipaddress中配置VIP,可以配置多個VIP,VIP將綁定至interface參數(shù)配置的網(wǎng)絡(luò)接口上。
authentication認(rèn)證配置段作用于同一個VRRP實例的MASTER和BACKUP之前的通信,具體的配置內(nèi)容有auth_type認(rèn)證類型,auth_pass認(rèn)證密碼,認(rèn)證類型有PASS(Simple Passwd)和AH(IPSEC),官方推薦PASS,驗證密碼為明文方式,最多8位。同一個VRRP實例的MASTER和BACKUP使用相同的密碼才能正常通信。
當(dāng)添加nopreemp關(guān)鍵字時表示設(shè)置高可用模式為非搶占模式,如果去掉此關(guān)鍵字則為默認(rèn)的搶占模式。搶占模式是指當(dāng)高優(yōu)先級節(jié)點(diǎn)恢復(fù)后會搶占低優(yōu)先級節(jié)點(diǎn)成為MASTER,非搶占模式允許低優(yōu)先級節(jié)點(diǎn)繼續(xù)擔(dān)任MASTER,preempt_delay用來設(shè)置搶占延遲,單位秒,范圍0~1000,發(fā)現(xiàn)低優(yōu)先級MASTER后多少秒開始搶占。
track_script配置段是用于調(diào)用指定腳本,腳本相關(guān)配置請參考下一節(jié)。
3.腳本段定義(vrrp_script)
默認(rèn)情況下,Keepalived僅僅在節(jié)點(diǎn)宕機(jī)或Keepalived進(jìn)程停掉的時候才會啟動切換機(jī)制。但在實際工作中,有業(yè)務(wù)服務(wù)停止而Keepalived服務(wù)還存在的情況,這就會導(dǎo)致用戶訪問的VIP無法找到對應(yīng)的服務(wù),這時可以利用Keepalived觸發(fā)預(yù)制的監(jiān)測腳本,實現(xiàn)VIP漂移來繼續(xù)提供服務(wù)。
vrrp_script chk_haproxy {script "killall -0 haproxy"interval 2weight -2fall 3rise 1}
vrrp_script配置段定義一段腳本配置并設(shè)定腳本段名稱。script用雙引號設(shè)置引用的shell語句或者shell腳本,通過該語句或腳本執(zhí)行結(jié)果來判斷是否觸發(fā)指定動作,成功的結(jié)果不會觸發(fā)動作,執(zhí)行失敗會觸發(fā)動作。interval設(shè)置監(jiān)控間隔時間,單位為秒,weight設(shè)置當(dāng)監(jiān)控腳本執(zhí)行結(jié)果為失敗時觸發(fā)priority值調(diào)整,正數(shù)為增加優(yōu)先級,負(fù)數(shù)為降低優(yōu)先級,范圍-255~255,fall設(shè)置認(rèn)定結(jié)果為失敗時的執(zhí)行失敗次數(shù),rise設(shè)置判定結(jié)果為成功時的執(zhí)行成功次數(shù)。
2.3.3 啟動
Keepalived配置完成后,在Master節(jié)點(diǎn)和Backup節(jié)點(diǎn)上使用以下命令開啟Keepalived服務(wù)。
systemctl start keepalived
如果需要設(shè)置開機(jī)啟動,則執(zhí)行以下命令。
systemctl enable keepalived
3. HAProxy功能及安裝配置
3.1 核心功能
1.負(fù)載均衡、會話保持
在多個服務(wù)器間實現(xiàn)四層或七層負(fù)載均衡,支持多種負(fù)載均衡算法,并且根據(jù)Hash或者cookies方式實現(xiàn)會話保持。
2.健康檢查
支持TCP、HTTP兩種后端服務(wù)器健康檢查模式。
3.統(tǒng)計監(jiān)控
接受訪問特定端口實現(xiàn)服務(wù)監(jiān)控,并提供帶有用戶認(rèn)證機(jī)制的服務(wù)狀態(tài)報告頁面。
4.SSL卸載
可以解析HTTPS報文并將請求解密為HTTP向后端服務(wù)器傳輸。
5.其他功能
在HTTP請求或響應(yīng)報文中添加、修改、刪除首部信息;HTTP請求重寫與重定向;根據(jù)訪問控制路由或阻斷請求。
3.2 負(fù)載均衡調(diào)度算法
HAProxy負(fù)載均衡調(diào)度算法可以在HAProxy配置文件中設(shè)定。支持配置多組后端服務(wù)組,每個組可以分別指定一種調(diào)度算法。以下是HAProxy支持的幾種調(diào)度算法。
1.輪詢
帶有權(quán)重的輪詢調(diào)度算法。支持權(quán)重的運(yùn)行時調(diào)整,支持慢啟動(在剛啟動時緩慢接收大量請求),僅支持最大4095個后端活動主機(jī)。
2.靜態(tài)輪詢
靜態(tài)輪詢算法,不支持權(quán)重的運(yùn)行時調(diào)整及慢啟動,但后端主機(jī)數(shù)量無限制。
3.最少連接
帶權(quán)重的最少連接調(diào)度算法,將訪問請求動態(tài)調(diào)度至連接數(shù)較少的后端服務(wù)節(jié)點(diǎn)上。
4.源地址哈希
該算法保證在后端服務(wù)器組沒有減少或增加的情況下,能將來自同一客戶端IP的請求分配至同一個服務(wù)端,該算法適合在無法使用cookie插入的四層模式下使用。
5.URI哈希
該算法保證訪問同一URI請求分配至同一服務(wù)端,適用于后端為緩存服務(wù)器的情況,以提高緩存命中率。
6.URL參數(shù)哈希
該算法對請求URL中的指定的參數(shù)的值作哈希計算。該算法適用于有用戶識別參數(shù)的URL ,例如保證同一用戶ID的請求分配至同一服務(wù)節(jié)點(diǎn)。如果指定的參數(shù)沒有值,則降級至輪詢調(diào)度算法。
7.HTTP 首部哈希
該算法將HTTP首部中指定的字段取出做哈希計算。如果HTTP首部字段缺失,則降級至輪詢調(diào)度算法。
3.3 安裝與配置
3.3.1 安裝
HAProxy支持源碼安裝,同時也可以通過不同操作系統(tǒng)安裝工具進(jìn)行安裝,本文以CentOS的yum工具為例進(jìn)行安裝介紹,分別在兩臺已安裝并配置好kkeepalived的服務(wù)器上執(zhí)行以下命令進(jìn)行安裝。
yum install -y haproxy
3.3.2 基本配置
yum安裝后,HAProxy將生成配置文件:/etc/haproxy/haproxy.cfg,利用文本編輯器進(jìn)行配置修改。
vi /etc/haproxy/haproxy.cfg
1.全局段定義(global)
全局參數(shù)配置將配置于所有HAProxy服務(wù)器上。
globallog /dev/log local0 infochroot /var/lib/haproxypidfile /var/run/haproxy.pidmaxconn 4000user haproxygroup haproxydaemon
log設(shè)置全局日志配置,語法為log <address> <facility> <msglevel>,上例中指定使用本機(jī)上的syslog服務(wù)中的local0日志設(shè)備,記錄日志等級為info的日志。chroot設(shè)置HAProxy工作目錄,pidfile設(shè)置HAProxy的pid文件位置,maxconn設(shè)置每個HAProxy進(jìn)程可用的最大連接數(shù),user及group設(shè)置HAProxy進(jìn)程所屬的用戶及用戶組,daemon關(guān)鍵字表示以守護(hù)進(jìn)程方式運(yùn)行haproxy。
2.默認(rèn)段定義(defaults)
默認(rèn)段的作用是為后續(xù)前端代理及后端代理設(shè)置默認(rèn)值。
defaultsmode httplog globaloption httplogoption dontlognulloption http-server-closeoption forwardfor except 127.0.0.0/8option redispatchretries 3timeout http-request 10stimeout queue 1mtimeout connect 10stimeout client 1mtimeout server 1mtimeout http-keep-alive 10stimeout check 10s
Docker+K8s+Jenkins 主流技術(shù)全解視頻資料【干貨免費(fèi)分享】
mode表示HAProxy的工作模式,設(shè)置tcp時為4層模式,設(shè)置http時為7層模式。log設(shè)置日志輸出方式,配置為global表示將采用全局段log的配置。
option httplog關(guān)鍵字表示記錄HTTP詳細(xì)日志,包括HTTP請求、session狀態(tài)、連接數(shù)等。
option dontlognull關(guān)鍵字表示日志中將不會記錄空連接。所謂空連接就是在上游的負(fù)載均衡器或者監(jiān)控系統(tǒng)為了探測該服務(wù)是否存活可用時,需要定期的連接或者獲取某一固定的組件或頁面,或者探測掃描端口是否在監(jiān)聽或開放等動作被稱為空連接,官方文檔中標(biāo)注,如果該服務(wù)上游沒有其他的負(fù)載均衡器的話,建議不要設(shè)置該參數(shù),因為設(shè)置后互聯(lián)網(wǎng)上的惡意掃描或其他動作就不會被記錄下來。
option http-server-close關(guān)鍵字表示每次請求完畢后主動關(guān)閉HTTP通道。
option forwardfor關(guān)鍵字表示應(yīng)用程序想記錄發(fā)起請求的客戶端的IP地址,需要在HAProxy上配置此選項,這樣HAProxy會把客戶端的IP信息發(fā)送給服務(wù)器,在HTTP請求中添加"X-Forwarded-For"字段啟用 X-Forwarded-For,在requests頭部插入客戶端IP發(fā)送給后端的server,使后端server獲取到客戶端的真實IP。
option redispatch關(guān)鍵字表示當(dāng)使用了cookie時,HAProxy將會將其請求的后端服務(wù)器信息插入到cookie中,以保證會話的持久性,如果后端的服務(wù)器服務(wù)不可用,但客戶端的cookie是不會刷新的,設(shè)置此參數(shù)會將客戶的請求強(qiáng)制定向到另外一個后端服務(wù)器上,以保證服務(wù)的正常。
retries定義連接后端服務(wù)器的失敗重連次數(shù),連接失敗次數(shù)超過此值后將會將對應(yīng)后端服務(wù)器標(biāo)記為不可用。
timeout為前綴的關(guān)鍵字指定了一些關(guān)于請求、連接、響應(yīng)的最大超時時間,單位默認(rèn)為毫秒,也可以加入后綴s(秒),m(分鐘),h(小時),d(天)來指定。http-request設(shè)置HTTP請求超時時長,queue設(shè)置一個請求在隊列里的超時時間,connect設(shè)置最大與服務(wù)端建立連接的時長,client設(shè)置客戶端最大非活動時長,server設(shè)置服務(wù)端最大非活動時長,http-keep-alive設(shè)置最大等待新請求的空閑時長,check設(shè)置檢測超時時長。
3.前端代理定義(frontend)
前端代理配置定義一個服務(wù)監(jiān)聽,用于接收用戶請求并將請求轉(zhuǎn)發(fā)給后端代理,可以定義多個前端代理。
frontend mainmode httpbind :80default_backend nginx
frontend前端代理配置段定義一組前端服務(wù)并啟動服務(wù)監(jiān)聽,同時設(shè)置代理名稱。mode設(shè)置工作模式,如果此參數(shù)未被設(shè)定則引用默認(rèn)配置段配置的模式。bind設(shè)置監(jiān)聽地址及端口,地址為空或者表示綁定至所有服務(wù)器的網(wǎng)絡(luò)接口。default_backend指定默認(rèn)后端代理進(jìn)行流量轉(zhuǎn)發(fā)。
4.后端代理定義(backend)
用于接收前端代理請求并根據(jù)設(shè)置的負(fù)載均衡策略將流量轉(zhuǎn)發(fā)至指定后端并對后端執(zhí)行健康檢查,一個前端可以指向多個后端;同時一個后端可以被多個調(diào)用。
backend nginxmode httpbalance roundrobinserver web1 host1:80 check inter 3s rise 1 fall 2server web2 host2:80 check
backend后端代理配置段定義一組后端服務(wù)器,同時設(shè)置代理名稱。mode設(shè)置工作模式如果此參數(shù)未被設(shè)定則引用默認(rèn)配置段的模式。balance設(shè)置后端負(fù)載均衡轉(zhuǎn)發(fā)策略,策略取值請參考表1。
表1 balance取值

server配置了相應(yīng)的后端服務(wù)集群地址,是真實的服務(wù)器,一個backend對應(yīng)一個或者多個實體服務(wù)器。配置依次為節(jié)點(diǎn)名稱、節(jié)點(diǎn)IP和端口、啟用四層健康檢查,在上述示例中web1服務(wù)器還設(shè)定了檢查的相關(guān)參數(shù)表示每3秒(inter)檢查一次,執(zhí)行兩次(fall)失敗認(rèn)為故障,執(zhí)行一次(rise)成功即為服務(wù)可用。
3.3.3 啟動
HAProxy配置完成后,使用以下命令開啟HAProxy服務(wù)。
systemctl start haproxy
如果需要設(shè)置開機(jī)啟動,則執(zhí)行以下命令。
systemctl enable haproxy
修改配置文件后可以通過刷新配置的方式熱加載配置。
systemctl reload haproxy
3.3.4 會話保持
HAProxy在會話保持功能上可以分為四層會話保持和七層會話保持。四層會話保持是基于源地址的會話保持,是指HAProxy在負(fù)載均衡時根據(jù)訪問請求的源地址作為判斷關(guān)聯(lián)會話的依據(jù),對于同一IP地址的所有訪問請求在作負(fù)載均衡時均會被保持到后端的同一臺服務(wù)器上。七層會話保持是基于cookie的會話保持,當(dāng)客戶端HTTP請求進(jìn)入HAProxy時,根據(jù)負(fù)載均衡策略選擇后端的一臺服務(wù)器,后端服務(wù)器將HTTP響應(yīng)返回HAProxy,此時HAproxy會插入該服務(wù)器的cookie并將插入cookie的HTTP響應(yīng)返回至客戶端,當(dāng)該客戶端再次發(fā)出請求時,帶有上次插入cookie的HTTP請求進(jìn)入HAProxy,HAProxy解析出cookie中服務(wù)器信息并將請求發(fā)送至相同的后端服務(wù)器。
四層會話保持的配置方式實際只需要將配置文件中后端代理段的負(fù)載均衡策略設(shè)置為基于源地址哈希并將工作模式設(shè)置為tcp即可,配置文件如下。
backend nginxmode tcpbalance sourceserver web1 10.230.150.68:80 check cookie web1server web3 10.230.150.70:80 check cookie web3
七層會話保持配置方式則需要在配置文件后端代理段中設(shè)置cookie并確保工作模式為http,配置文件如下。
backend nginxmode httpbalance roundrobincookie WEBSRV insert indirect nocacheserver web1 10.230.150.68:80 check cookie web1server web3 10.230.150.70:80 check cookie web3
以上配置文件中的cookie設(shè)置了以WEBSRV為名稱的cookie,然后在server配置中分別定義了不同的cookie值,通過瀏覽器訪問HAProxy前端代理地址可以看到該cookie,利用該cookie實現(xiàn)會話保持,如圖2所示。

圖2 cookie信息
3.3.5 SSL卸載
利用HAProxy可以實現(xiàn)SSL卸載功能,從而使客戶端到HAProxy的訪問采用SSL封裝后的HTTPS,而HAProxy至后端服務(wù)器之間的通信則采用HTTP(圖3),從而消除服務(wù)器端的SSL加密運(yùn)算開銷。

圖3 SSL卸載
實現(xiàn)SSL卸載需要在配置文件全局定義段加入SSL參數(shù)調(diào)整,以及在前端代理段加入SSL配置,涉及的配置如下。
globalmaxconn 20000log 127.0.0.1 local0 infochroot /var/lib/haproxypidfile /var/run/haproxy.piduser haproxygroup haproxydaemon2048stats socket /var/lib/haproxy/statsfrontend mainbind :80bind :443 ssl crt /etc/ssl/certs/web.pemredirect scheme https if !{ ssl_fc }default_backend nginx
全局段配置中增加了SSL參數(shù)tune.ssl.default-dh-param,設(shè)置值為2048,表示使用2048bit加密,和SSL秘鑰加密位數(shù)保持一致。
前端代理配置bind加入443端口、SSL支持并綁定指定證書,證書文件內(nèi)容為網(wǎng)站的證書和私鑰通過命令(cat web.crt web.key | tee web.pem)拼接合成。配置段中還加入了HTTP到HTTPS的自動跳轉(zhuǎn)功能(redirect scheme https if !{ ssl_fc }),在瀏覽器中輸入域名或者IP地址,無需指定協(xié)議類型,如果導(dǎo)入根證書后的瀏覽器顯示的狀態(tài)是安全的則表示配置成功(圖4)。

圖4 開啟HTTPS
3.3.6 流量路由
HAProxy可以為數(shù)據(jù)庫、郵件、頁面等服務(wù)提供四層負(fù)載均衡機(jī)制,也可以從HTTP請求報文中提取指定數(shù)據(jù)并通過特定的訪問控制列表(ACL)提供基于七層的流量轉(zhuǎn)發(fā)機(jī)制。
1.基于URL路徑轉(zhuǎn)發(fā)。HAProxy可以根據(jù)請求的URL路徑做路由,通過配置不同的路徑將不同的URL路徑分發(fā)至不同的后端服務(wù)器,在以下的例子中我們在兩個頁面服務(wù)器上分別配置了兩個測試頁面test1.html、test2.html,頁面內(nèi)容簡單標(biāo)識了所在服務(wù)器的信息,并利用轉(zhuǎn)發(fā)機(jī)制實現(xiàn)基于URL的路徑分發(fā),涉及的相關(guān)配置如下。
frontend mainbind :80bind :443 ssl crt /etc/ssl/certs/web.pemredirect scheme https if !{ ssl_fc }acl is_test1 path_beg /test1acl is_test2 path_beg /test2use_backend test1 if is_test1use_backend test2 if is_test2default_backend nginxbackend nginxbalance roundrobinserver web1 10.230.150.68:80 checkbackend test1balance roundrobinserver web2 10.230.150.69:80 checkbackend test2balance roundrobinserver web3 10.230.150.70:80 check
前端代理配置段中加入acl配置,設(shè)置的路由規(guī)則為匹配路徑的前綴(path_beg)test1及test2,并配置use_backend參數(shù)將指定acl作用于指定后端服務(wù)器,is_test1規(guī)則匹配后路由至test1,is_test2規(guī)則匹配后路由至test2。
定義兩組后端代理配置,分別配置test1及test2后端代理,指向相應(yīng)的頁面服務(wù)器。通過訪問不同的路徑HAProxy可以正確路由轉(zhuǎn)發(fā)到指定后端頁面服務(wù)器,沒有命中acl的請求將轉(zhuǎn)發(fā)至默認(rèn)后端服務(wù)器,如圖5所示。



圖5 URL路徑轉(zhuǎn)發(fā)
2.基于HTTP首部信息轉(zhuǎn)發(fā)。HAProxy可以根據(jù)HTTP首部信息來執(zhí)行路由分發(fā)操作,例如通過首部信息中的User-Agent來判斷請求方的設(shè)備類型是iPhone還是Android,以此作為依據(jù)進(jìn)行路由分發(fā)至不同的后端服務(wù)器上,或者通過首部信息中的Host字段實現(xiàn)以域名為依據(jù)進(jìn)行路由分發(fā)。以Host為例,涉及的相關(guān)配置如下。
frontend mainbind :80bind :443 ssl crt /etc/ssl/certs/web.pemredirect scheme https if !{ ssl_fc }acl is_test1 hdr_beg(host) www.test1.comacl is_test2 hdr_beg(host) www.test2.comuse_backend test1 if is_test1use_backend test2 if is_test2default_backend nginxbackend nginxbalance roundrobincookie WEBSRV insert indirect nocacheserver web1 10.230.150.68:80 check cookie web1backend test1balance roundrobinserver web2 10.230.150.69:80 checkbackend test2balance roundrobinserver web2 10.230.150.70:80 check
前端代理配置段中加入acl配置,通過hdr_beg(host)關(guān)鍵字設(shè)置的路由規(guī)則匹配HTTP首部信息中Host前綴www.test1.com及www.test2.com,并配置use_backend參數(shù)將指定acl作用于指定后端服務(wù)器,is_test1規(guī)則匹配后路由至test1,is_test2規(guī)則匹配后路由至test2。
定義兩組后端代理配置,分別配置test1及test2后端代理,指向相應(yīng)的頁面服務(wù)器。通過不同的域名訪問可以正確路由轉(zhuǎn)發(fā)到指定后端頁面服務(wù)器,沒有命中acl的請求將轉(zhuǎn)發(fā)至默認(rèn)后端服務(wù)器,如圖6所示。



圖6 域名轉(zhuǎn)發(fā)
4. 總結(jié)
負(fù)載均衡可以由專業(yè)硬件設(shè)備提供,由服務(wù)器集群服務(wù)節(jié)點(diǎn)之上架設(shè)專業(yè)負(fù)載均衡器來完成集群節(jié)點(diǎn)的負(fù)載均衡工作。硬件負(fù)載均衡優(yōu)勢明顯,設(shè)備獨(dú)立于操作系統(tǒng)、強(qiáng)大的性能、豐富的功能、多樣化的負(fù)載均衡策略、智能化流量管理,由專業(yè)維護(hù)團(tuán)隊提供維護(hù),缺點(diǎn)是價格昂貴、配置復(fù)雜,部署難度大時間長,不適于中小規(guī)模的網(wǎng)絡(luò)服務(wù)。
軟負(fù)載則在一臺或多臺服務(wù)器操作系統(tǒng)之上安裝附加軟件來實現(xiàn)負(fù)載均衡。采用軟負(fù)載方案后系統(tǒng)構(gòu)架內(nèi)無需額外部署專用于負(fù)載均衡的硬件設(shè)備以降低成本,同時能夠更好地根據(jù)系統(tǒng)與應(yīng)用的狀態(tài)來分配負(fù)載,無縫的嵌入系統(tǒng)架構(gòu)中,也可以根據(jù)實際需求靈活擴(kuò)展,互聯(lián)網(wǎng)公司大多都有自己的軟負(fù)載方案。相比硬件負(fù)載來說軟件負(fù)載具有配置簡單、快速部署、使用靈活、成本低廉、高性價比等諸多優(yōu)勢。
在建設(shè)某銀行應(yīng)用基礎(chǔ)云PaaS平臺的實踐中,采用Keepalived+HAproxy組合搭建了高可用軟負(fù)載方案,為平臺內(nèi)多組控制節(jié)點(diǎn)、多組工作節(jié)點(diǎn)、以及雙副本鏡像倉庫提供服務(wù)接口聚合負(fù)載和高可用性保障。首先,平臺的業(yè)務(wù)流量入口指向Keepalived高可用VIP地址,經(jīng)過Haproxy負(fù)載調(diào)度至后端工作節(jié)點(diǎn)中,這樣一旦其中任意一個負(fù)載均衡節(jié)點(diǎn)或者后端工作節(jié)點(diǎn)宕機(jī),高可用VIP地址和剩余存活的后端工作節(jié)點(diǎn)仍可對外提供服務(wù)。其次,隨著后期業(yè)務(wù)流量的上升,后端工作節(jié)點(diǎn)出現(xiàn)負(fù)載壓力時,可以根據(jù)實際需要靈活配置Haproxy,擴(kuò)展后端工作節(jié)點(diǎn)數(shù)量,降低整體工作節(jié)點(diǎn)負(fù)載壓力。從現(xiàn)有的實踐經(jīng)驗來看,該軟負(fù)載方案具備了良好的穩(wěn)定性、靈活性和可擴(kuò)展性。
- END - 推薦閱讀 Go+Vue DevOps 從入門到項目實戰(zhàn) 網(wǎng)絡(luò)丟包,網(wǎng)絡(luò)延遲?這款神器幫你搞定所有! 頂級 DevOps 工具鏈大盤點(diǎn) 某外企從 0 建設(shè) SRE 運(yùn)維體系經(jīng)驗分享 Nginx+Redis:高性能緩存利器 主流監(jiān)控系統(tǒng) Prometheus 學(xué)習(xí)指南 基于 eBPF 的 Kubernetes 問題排查全景圖發(fā)布 一文掌握 Ansible 自動化運(yùn)維 Linux的10個最危險命令 Kubernetes網(wǎng)絡(luò)難懂?可能是沒看到這篇文章 24 個 Docker 常見問題處理技巧 Shell分析日志文件,全面解鎖新姿勢! 這篇文章帶你全面掌握 Nginx ! 一文搞懂 Kubernetes 網(wǎng)絡(luò)通信原理 SRE本質(zhì)就是一個懂運(yùn)維的資深開發(fā) 搭建一套完整的企業(yè)級 K8s 集群(kubeadm方式) 點(diǎn)亮,服務(wù)器三年不宕機(jī)


