Haproxy+Keepalived高可用環境部署梳理(主主和主從模式)

Nginx、LVS、HAProxy 是目前使用最廣泛的三種負載均衡軟件,本人都在多個項目中實施過,通常會結合Keepalive做健康檢查,實現故障轉移的高可用功能。

1)在四層(tcp)實現負載均衡的軟件:

lvs------>重量級

nginx------>輕量級,帶緩存功能,正則表達式較靈活

haproxy------>模擬四層轉發,較靈活

  

2)在七層(http)實現反向代理的軟件:

haproxy------>天生技能,全面支持七層代理,會話保持,標記,路徑轉移;

nginx------>只在http協議和mail協議上功能比較好,性能與haproxy差不多;

apache------>功能較差<br>

 

總的來說,一般是lvs做4層負載;nginx做7層負載;haproxy比較靈活,4層和7層負載均衡都能做

 

一般對負載均衡的使用是隨着網站規模的提升根據不同的階段來使用不同的技術。具體的應用需求還得具體分析:

1)如果是中小型的 Web 應用,比如日PV小於1000 萬,用 Nginx 就完全可以了;

2)如果機器不少,可以用DNS輪詢, LVS所耗費的機器還是比較多的;大型網站或重要的服務,且服務器比較多時, 可以考慮用LVS。

還有一種是通過硬件來進行進行,常見的硬件有比較昂貴的F5和Array等商用的負載均衡器,它的優點就是有專業的維護團隊來對這些服務進行維護、缺點就是花銷太大,所以對於規模較小的網絡服務來說暫時還沒有需要使用;另外一種就是類似Nginx/LVS/HAProxy 的基於 Linux 的開源免費的負載均衡軟件,這些都是通過軟件級別來實現,所以費用非常低廉。目前關於網站架構一般比較合理流行的架構方案: Web 前端採用Nginx/HAProxy+Keepalived 作負載均衡器;後端採用 MySQL 數據庫一主多從和讀寫分離,LVS+Keepalived 的架構。 當然要根據項目具體需求制定方案。下面說說各自的特點和適用場合。

 

------------------------------------------------------------------------------------------------------------------

下面簡單說下Nginx、LVS、HAProxy 負載均衡軟件的優缺點:

 

一、Nginx的優點是:

1)工作在網絡的7層之上,可以針對 http 應用做一些分流的策略,比如針對域名、目錄結構,它的正則規則比 HAProxy 更爲強大和靈活,這也是它目前廣泛流行的主要原因之一, Nginx 單憑這點可利用的場合就遠多於 LVS 了。

2) Nginx 對網絡穩定性的依賴非常小,理論上能 ping 通就就能進行負載功能,這個也是它的優勢之一;相反 LVS 對網絡穩定性依賴比較大,這點本人深有體會;

3) Nginx 安裝和配置比較簡單,測試起來比較方便,它基本能把錯誤用日誌打印出來。 LVS 的配置、測試就要花比較長的時間了, LVS 對網絡依賴比較大。

4)可以承擔高負載壓力且穩定,在硬件不差的情況下一般能支撐幾萬次的併發量,負載度比 LVS 相對小些。

5) Nginx 可以通過端口檢測到服務器內部的故障,比如根據服務器處理網頁返回的狀態碼、超時等等,並且會把返回錯誤的請求重新提交到另一個節點,不過其中缺點就是不支持url來檢測。比如用戶正在上傳一個文件,而處理該上傳的節點剛好在上傳過程中出現故障, Nginx 會把上傳切到另一臺服務器重新處 理,而LVS就直接斷掉了,如果是上傳一個很大的文件或者很重要的文件的話,用戶可能會因此而不滿。

6)Nginx 不僅僅是一款優秀的負載均衡器/反向代理軟件,它同時也是功能強大的 Web 應用服務器。 LNMP 也是近幾年非常流行的 web 架構,在高流量的環境中穩定性也很好。

7)Nginx 現在作爲 Web 反向加速緩存越來越成熟了,速度比傳統的 Squid 服務器更快,可以考慮用其作爲反向代理加速器。

8)Nginx 可作爲中層反向代理使用,這一層面 Nginx 基本上無對手,唯一可以對比 Nginx 的就只有 lighttpd 了,不過 lighttpd 目前還沒有做到 Nginx 完全的功能,配置也不那麼清晰易讀,社區資料也遠遠沒 Nginx 活躍。

9) Nginx 也可作爲靜態網頁和圖片服務器,這方面的性能也無對手。還有 Nginx社區非常活躍,第三方模塊也很多。

 

Nginx 的缺點是:

1)Nginx 僅能支持 http、 https 和 Email 協議,這樣就在適用範圍上面小些,這個是它的缺點。

2)對後端服務器的健康檢查,只支持通過端口來檢測,不支持通過 url 來檢測。不支持 Session 的直接保持,但能通過 ip_hash 來解決。

 

二、LVS:使用 Linux 內核集羣實現一個高性能、 高可用的負載均衡服務器,它具有很好的可伸縮性( Scalability)、可靠性( Reliability)和可管理性(Manageability)。

LVS 的優點是:

1)抗負載能力強、是工作在網絡 4 層之上僅作分發之用, 沒有流量的產生,這個特點也決定了它在負載均衡軟件裏的性能最強的,對內存和 cpu 資源消耗比較低。

2)配置性比較低,這是一個缺點也是一個優點,因爲沒有可太多配置的東西,所以並不需要太多接觸,大大減少了人爲出錯的機率。

3)工作穩定,因爲其本身抗負載能力很強,自身有完整的雙機熱備方案,如LVS+Keepalived,不過我們在項目實施中用得最多的還是 LVS/DR+Keepalived。

4)無流量, LVS 只分發請求,而流量並不從它本身出去,這點保證了均衡器 IO的性能不會收到大流量的影響。

5)應用範圍比較廣,因爲 LVS 工作在 4 層,所以它幾乎可以對所有應用做負載均衡,包括 http、數據庫、在線聊天室等等。

 

LVS 的缺點是:

1)軟件本身不支持正則表達式處理,不能做動靜分離;而現在許多網站在這方面都有較強的需求,這個是 Nginx/HAProxy+Keepalived 的優勢所在。

2)如果是網站應用比較龐大的話, LVS/DR+Keepalived 實施起來就比較複雜了,特別後面有 Windows Server 的機器的話,如果實施及配置還有維護過程就比較複雜了,相對而言,Nginx/HAProxy+Keepalived 就簡單多了。

 

三、HAProxy 的特點是:

1)HAProxy 也是支持虛擬主機的。

2)HAProxy 的優點能夠補充 Nginx 的一些缺點,比如支持 Session 的保持,Cookie的引導;同時支持通過獲取指定的 url 來檢測後端服務器的狀態。

3)HAProxy 跟 LVS 類似,本身就只是一款負載均衡軟件;單純從效率上來講HAProxy 會比 Nginx 有更出色的負載均衡速度,在併發處理上也是優於 Nginx 的。

4)HAProxy 支持 TCP 協議的負載均衡轉發,可以對 MySQL 讀進行負載均衡,對後端的 MySQL 節點進行檢測和負載均衡,大家可以用 LVS+Keepalived 對 MySQL主從做負載均衡。

5)HAProxy 負載均衡策略非常多, HAProxy 的負載均衡算法現在具體有如下8種:

1> roundrobin,表示簡單的輪詢,這個不多說,這個是負載均衡基本都具備的;

2> static-rr,表示根據權重,建議關注;

3> leastconn,表示最少連接者先處理,建議關注;

4> source,表示根據請求源 IP,這個跟 Nginx 的 IP_hash 機制類似,我們用其作爲解決 session 問題的一種方法,建議關注;

5> ri,表示根據請求的 URI;

6> rl_param,表示根據請求的 URl 參數’balance url_param’ requires an URLparameter name;

7> hdr(name),表示根據 HTTP 請求頭來鎖定每一次 HTTP 請求;

8> rdp-cookie(name),表示根據據 cookie(name)來鎖定並哈希每一次 TCP 請求。

 

四、Nginx和LVS 對比的總結:

1)Nginx 工作在網絡的 7 層,所以它可以針對 http 應用本身來做分流策略,比如針對域名、目錄結構等,相比之下 LVS 並不具備這樣的功能,所以 Nginx 單憑這點可利用的場合就遠多於LVS了;但 Nginx 有用的這些功能使其可調整度要高於 LVS,所以經常要去觸碰觸碰,觸碰多了,人爲出問題的 機率也就會大。

2)Nginx 對網絡穩定性的依賴較小,理論上只要 ping 得通,網頁訪問正常, Nginx就能連得通,這是 Nginx 的一大優勢! Nginx 同時還能區 分內外網,如果是同時擁有內外網的節點,就相當於單機擁有了備份線路; LVS 就比較依賴於網絡環境,目前來看服務器在同一網段內並且 LVS 使用 direct 方式分流,效果較能得到保證。另外注意, LVS 需要向託管商至少申請多一個 ip 來做Visual IP,貌似是不能用本身的 IP 來做 VIP 的。要做好 LVS 管理員,確實得跟進學習很多有關網絡通信方面的知識,就不再是一個 HTTP 那麼簡單了。

3)Nginx 安裝和配置比較簡單,測試起來也很方便,因爲它基本能把錯誤用日誌打印出來。 LVS 的安裝和配置、測試就要花比較長的時間了; LVS 對網絡依賴比較大,很多時候不能配置成功都是因爲網絡問題而不是配置問題,出了問題要解決也相應的會麻煩得多。

4)Nginx 也同樣能承受很高負載且穩定,但負載度和穩定度差 LVS 還有幾個等級:Nginx 處理所有流量所以受限於機器 IO 和配置;本身的 bug 也還是難以避免的。

5)Nginx 可以檢測到服務器內部的故障,比如根據服務器處理網頁返回的狀態碼、超時等等,並且會把返回錯誤的請求重新提交到另一個節點。目前 LVS 中ldirectd 也能支持針對服務器內部的情況來監控,但 LVS 的原理使其不能重發請求。比如用戶正在上傳一個文件,而處理該上傳的節點剛好在上傳過程中 出現故障, Nginx 會把上傳切到另一臺服務器重新處理,而 LVS 就直接斷掉了,如果

是上傳一個很大的文件或者很重要的文件的話,用戶可能會因此而惱火。

6)Nginx 對請求的異步處理可以幫助節點服務器減輕負載,假如使用 apache 直接對外服務,那麼出現很多的窄帶鏈接時 apache 服務器將會佔用大 量內存而不能釋放,使用多一個 Nginx 做 apache代理的話,這些窄帶鏈接會被 Nginx 擋住,apache 上就不會堆積過多的請求,這樣就減少了相 當多的資源佔用。這點使用squid 也有相同的作用,即使 squid 本身配置爲不緩存,對 apache 還是有

很大幫助的。

7)Nginx 能支持 http、 https 和 email( email 的功能比較少用), LVS 所支持的應用在這點上會比 Nginx 更多。在使用上,一般最 前端所採取的策略應是 LVS,也就是 DNS 的指向應爲 LVS 均衡器,LVS 的優點令它非常適合做這個任務。重要的ip地址,最好交由 LVS 託管,比如數據 庫的 ip、 webservice 服務器的 ip等等,這些 ip 地址隨着時間推移,使用面會越來越大,如果更換 ip 則故障會接踵而至。所以將這些重要 ip 交給 LVS 託管是最爲穩妥的,這樣做的唯一缺點是需要的 VIP 數量會比較多。Nginx 可作爲 LVS 節點機器使用,一是可以利用 Nginx的功能,二是可以利 用 Nginx 的性能。當然這一層面也可以直接使用 squid,squid 的功能方面就比 Nginx 弱不少了,性能上也有所遜色於 Nginx。Nginx 也可作爲中層代理使用,這一層面 Nginx 基本上無對手,唯一可以撼動 Nginx 的就只有 lighttpd了,不過 lighttpd 目前還沒有能做到 Nginx 完全的功能,配置也不那麼清晰易讀。另外,中層代理的 IP 也是重要的,所以中層代理也擁有一個VIP 和 LVS 是最完美的方案了。具體的應用還得 具體分析,如果

是比較小的網站(日 PV 小於 1000 萬),用 Nginx 就完全可以了,如果機器也不少,可以用DNS 輪詢, LVS 所耗費的機器還是比較多 的;大型網站或者重要的服務,機器不發愁的時候,要多多考慮利用 LVS。

 

現在對網絡負載均衡的使用是隨着網站規模的提升根據不同的階段來使用不同的技術:

1)第一階段:利用 Nginx 或 HAProxy 進行單點的負載均衡,這一階段服務器規模剛脫離開單服務器、單數據庫的模式,需要一定的負載均衡,但是仍 然規模較小沒有專業的維護團隊來進行維護,也沒有需要進行大規模的網站部署。這樣利用Nginx 或 HAproxy 就是第一選擇,此時這些東西上手快, 配置容易,在七層之上利用 HTTP 協議就可以。這時是第一選擇。

2)第二階段:隨着網絡服務進一步擴大,這時單點的 Nginx 已經不能滿足,這時使用 LVS 或者商用 Array 就是首要選擇, Nginx 此時就作爲 LVS 或者 Array 的節點來使用,具體 LVS 或 Array 的是選擇是根據公司規模和預算來選擇,Array 的應用交付功能非常強大,本人在某項目中使用過,性價比也遠高於 F5,商用首選!但是一般來說這階段相關人才跟不上業務的提升,所以購買商業負載均衡已經成爲了必經之路。

3)第三階段:這時網絡服務已經成爲主流產品,此時隨着公司知名度也進一步擴展,相關人才的能力以及數量也隨之提升,這時無論從開發適合自身產品的定製,以及降低成本來講開源的 LVS,已經成爲首選,這時LVS 會成爲主流。最終形成比較理想的基本架構爲: Array/LVS — Nginx/Haproxy —Squid/Varnish — AppServer。

現在用HAProxy主要在於它有以下優點:軟件負載均衡一般通過兩種方式來實現:基於操作系統的軟負載實現和基於第三方應用的軟負載實現。LVS就是基於Linux操作系統實現的一種軟負載,HAProxy就是開源的並且基於第三應用實現的軟負載。HAProxy相比LVS的使用要簡單很多,功能方面也很豐富。當前,HAProxy支持兩種主要的代理模式:"tcp"也即4層(大多用於郵件服務器、內部協議通信服務器等),和7層(HTTP)。在4層模式 下,HAProxy僅在客戶端和服務器之間轉發雙向流量。7層模式下,HAProxy會分析協議,並且能通過允許、拒絕、交換、增加、修改或者刪除請求 (request)或者回應(response)裏指定內容來控制協議,這種操作要基於特定規則。

 

1)免費開源,穩定性也是非常好,這個可通過我做的一些小項目可以看出來,單Haproxy也跑得不錯,穩定性可以與LVS相媲美;

2)根據官方文檔,HAProxy可以跑滿10Gbps-New benchmark of HAProxy at 10 Gbps using Myricom's 10GbE NICs (Myri-10G PCI-Express),這個作爲軟件級負載均衡,也是比較驚人的;

3)HAProxy可以作爲MySQL、郵件或其它的非web的負載均衡,我們常用於它作爲MySQL(讀)負載均衡;

4)自帶強大的監控服務器狀態的頁面,實際環境中我們結合Nagios進行郵件或短信報警,這個也是我非常喜歡它的原因之一;

5)HAProxy支持虛擬主機。

 

HAProxy介紹
反向代理服務器,支持雙機熱備支持虛擬主機,但其配置簡單,擁有非常不錯的服務器健康檢查功能,當其代理的後端服務器出現故障, HAProxy會自動將該服務器摘除,故障恢復後再自動將該服務器加入。新的1.3引入了frontend,backend;frontend根據任意 HTTP請求頭內容做規則匹配,然後把請求定向到相關的backend.

keepalived簡介  
keepalived是一個類似於layer3, 4 & 5交換機制的軟件,也就是我們平時說的第3層、第4層和第5層交換。Keepalived的作用是檢測web服務器的狀態,如果有一臺web服務器死機,或工作出現故障,Keepalived將檢測到,並將有故障的web服務器從系統中剔除,當web服務器工作正常後Keepalived自動將web服務器加入到服務器羣中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web服務器。
類似的HA工具還有heatbeat、drbd等,heatbeat、drbd配置都較爲複雜。

keepalived工作原理
keepalived可提供vrrp以及health-check功能,可以只用它提供雙機浮動的vip(vrrp虛擬路由功能),這樣可以簡單實現一個雙機熱備高可用功能。
keepalived是一個類似於layer3, 4,5交換機制的軟件,也就是我們平時說的第3層、第4層和第5層交換。Keepalived的作用是檢測web 服務器的狀態。 Layer3,4&5工作在IP/TCP協議棧的IP層,TCP層,及應用層,原理分別如下:

Layer3:Keepalived使用Layer3的方式工作式時,Keepalived會定期向服務器羣中的服務器發送一個ICMP的數據包(既我們平時用的Ping程序),如果發現某臺服務的IP地址沒有激活,Keepalived便報告這臺服務器失效,並將它從服務器羣中剔除,這種情況的典型例子是某臺服務器被非法關機。Layer3的方式是以服務器的IP地址是否有效作爲服務器工作正常與否的標準。在本文中將採用這種方式。

Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的狀態來決定服務器工作正常與否。如web server的服務端口一般是80,如果Keepalived檢測到80端口沒有啓動,則Keepalived將把這臺服務器從服務器羣中剔除。

Layer5:Layer5就是工作在具體的應用層了,比Layer3,Layer4要複雜一點,在網絡上佔用的帶寬也要大一些。Keepalived將根據用戶的設定檢查服務器程序的運行是否正常,如果與用戶的設定不相符,則Keepalived將把服務器從服務器羣中剔除。

 

vip即虛擬ip,是附在主機網卡上的,即對主機網卡進行虛擬,此IP仍然是佔用了此網段的某個IP。

 


Keepalived是一個基於VRRP協議來實現的WEB 服務高可用方案,可以利用其來避免單點故障。一個WEB服務至少會有2臺服務器運行Keepalived,一臺爲主服務器(MASTER),一臺爲備份服務器(BACKUP),但是對外表現爲一個虛擬IP,主服務器會發送特定的消息給備份服務器,當備份服務器收不到這個消息的時候,即主服務器宕機的時候,備份服務器就會接管虛擬IP,繼續提供服務,從而保證了高可用性。keepalived是VRRP的完美實現!keepalived作用
隨着網站業務量的增長,網站的服務器壓力越來越大,需要負載均衡方案!商業的硬件如F5又太貴,創業型互聯公司如何有效節約成本,節省不必要的浪費呢?同時實現商業硬件一樣的高性能高可用的功能?有什麼好的負載均衡可伸張可擴展的方案嗎?答案是肯定的!有!可以利用Haproxy+Keepalived基於完整開源軟件的架構可以爲你提供一個負載均衡及高可用的服務器。
Keepalived的作用是檢測web服務器的狀態,如果有一臺web服務器死機,或工作出現故障,Keepalived將檢測到,並將有故障的web服務器從系統中剔除,當web服務器工作正常後Keepalived自動將web服務器加入到服務器羣中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web服務器。

VRRP協議簡介
在現實的網絡環境中,兩臺需要通信的主機大多數情況下並沒有直接的物理連接。對於這樣的情況,它們之間路由怎樣選擇?主機如何選定到達目的主機的下一跳路由,這個問題通常的解決方法有二種:

1)在主機上使用動態路由協議(RIP、OSPF等)

2)在主機上配置靜態路由


VRRP工作機制很明顯在主機上配置路態路由是非常不切實際的,因爲管理、維護成本以及是否支持等諸多問題,配置靜態路由就變得十分流行,但路由器(或者說默認網關default gateway)卻經常成爲單點。
VRRP的目的就是爲了解決靜態路由單點故障問題。VRRP通過一競選(election)協議來動態的將路由任務交給LAN中虛擬路由器中的某臺VRRP路由器。

在一個VRRP虛擬路由器中,有多臺物理的VRRP路由器,但是這多臺的物理的機器並不能同時工作,而是由一臺稱爲MASTER的負責路由工作,其它的都是BACKUP,MASTER並非一成不變,VRRP讓每個VRRP路由器參與競選,最終獲勝的就是MASTER。MASTER擁有一些特權,比如 擁有虛擬路由器的IP地址,我們的主機就是用這個IP地址作爲靜態路由的。擁有特權的MASTER要負責轉發發送給網關地址的包和響應ARP請求。
VRRP通過競選協議來實現虛擬路由器的功能,所有的協議報文都是通過IP多播(multicast)包(多播地址 224.0.0.18)形式發送的。虛擬路由器由VRID(範圍0-255)和一組IP地址組成,對外表現爲一個周知的MAC地址。所以,在一個虛擬路由 器中,不管誰是MASTER,對外都是相同的MAC和IP(稱之爲VIP)。客戶端主機並不需要因爲MASTER的改變而修改自己的路由配置,對他們來 說,這種主從的切換是透明的。
在一個虛擬路由器中,只有作爲MASTER的VRRP路由器會一直髮送VRRP廣告包(VRRPAdvertisement message),BACKUP不會搶佔MASTER,除非它的優先級(priority)更高。當MASTER不可用時(BACKUP收不到廣告包), 多臺BACKUP中優先級最高的這臺會被搶佔爲MASTER。這種搶佔是非常快速的(<1s),以保證服務的連續性。由於安全性考慮,VRRP包使用了加密協議進行加密。

----------------------------------------------------------------------------------------------------------------------------------------------------
Haproxy+Keepalived的負載均衡和高可用環境的部署過程,有主從和主主兩種模式:

主從模式:一個vip,vip在master機器上,當master機器出現故障後,vip漂移到slave機器上,slave變爲master提供服務。

主主模式:兩個vip,兩臺機器都設置vip,當其中一臺機器出現故障後,它的vip就漂移到另一臺機器上(即另一臺機器有兩個vip),當故障機器恢復後,再將vip重新漂移過來。

  

各自作用:

1)Keepalived 的作用是檢測web服務器的狀態,如果有一臺web服務器死機,或工作出現故障,Keepalived將檢測到,並將有故障的web服務器從系統中剔除, 當web服務器工作正常後Keepalived自動將web服務器加入到服務器羣中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的 web服務器。

2)HAProxy 提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支持虛擬主機,它是免費、快速並且可靠的一種解決方案。HAProxy 特別適用於那些負載特大的 web 站點, 這些站點通常又需要會話保持或七層處理。HAProxy 運行在當前的硬件上,完全可以支持數以萬計的併發連接。並且它的運行模式使得它可以很簡單安全的整 合進您當前的架構中, 同時可以保護你的 web 服務器不被暴露到網絡上。

 


0)需求描述:一、Haproxy+Keepalived主主架構部署記錄

網站的域名之前都是放在機房的兩臺服務器上,前面做CDN加速,CDN節點會同步緩存到網站數據,用戶訪問網站,流量壓力都在前面的CDN設備上。

後續網站服務器被攻擊,又在CDN前面加了一個上層,即又多加一層緩存,剛加這個上層的時候,流量回源會很大,訪問量也會減少,不過隨着回源,訪問量漸漸恢復。

 

後來爲了安全考慮,計劃做Keepalivedd+Haproxy負載均衡的高可用,部署好之後,可以將後端源站服務器的外網ip拿下,進來的請求通過Haproxy代理進來,出去的請求可以通過squid代理出去。

後端源站機器的web端口只需要對Haproxy機器開放即可,然後CDN解析那邊將源站ip改爲Haproxy服務器ip即可。

 

 

1

2

3

4

5

6

7

8

9

10

Haproxy_Keepalived_Master      182.148.15.237

VIP1                           182.148.15.239

 

Haproxy_Keepalived_Backup      182.148.15.236

VIP2                           182.148.15.235

 

Real_Server1                   182.148.15.233

Real_Server2                   182.148.15.238

 

系統版本都是centos6.8

1)環境準備

基本的網絡拓撲圖如下:

2)Haproxy_keepalived_Master和Haproxy_keepalived_Backup兩臺服務器上安裝配置haproxy和keepalived的操作記錄:

--------------------------------------------------------------------------------------------------------------------------

關閉 SElinux、配置防火牆(Haproxy_Keepalived_Master 和 Haproxy_Keepalived_Backup兩臺機器都要操作)

[root@Haproxy_Keepalived_Master ~]# vim /etc/sysconfig/selinux

#SELINUX=enforcing                #註釋掉

#SELINUXTYPE=targeted             #註釋掉

SELINUX=disabled                  #增加

 

[root@Haproxy_Keepalived_Master ~]# setenforce 0      #臨時關閉selinux。上面文件配置後,重啓機器後就永久生效。

 

注意下面182.148.15.0/24是服務器的公網網段,192.168.1.0/24是服務器的私網網段

一定要注意:加上這個組播規則後,MASTER和BACKUP故障時,才能實現VIP資源的正常轉移。其故障恢復後,VIP也還會正常轉移回來。

[root@Haproxy_Keepalived_Master ~]# vim /etc/sysconfig/iptables   

.......

-A INPUT -s 182.148.15.0/24 -d 224.0.0.18 -j ACCEPT      #允許組播地址通信。

-A INPUT -s 192.168.1.0/24 -d 224.0.0.18 -j ACCEPT

-A INPUT -s 182.148.15.0/24 -p vrrp -j ACCEPT            #允許 VRRP(虛擬路由器冗餘協)通信

-A INPUT -s 192.168.1.0/24 -p vrrp -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

 

[root@Haproxy_Keepalived_Master ~]# /etc/init.d/iptables restart

 

 

----------------------------------------------------------------------------------------------------------------------

下載Haproxy地址:http://www.haproxy.org/download/1.6/src/

 

1)安裝Haproxy(Haproxy_Keepalived_Master 和 Haproxy_Keepalived_Backup兩臺機器都要操作)  注意:安裝之前,先執行yum install gcc gcc-c++ make openssl-devel kernel-devel

[root@Haproxy_Keepalived_Master src]# wget http://www.haproxy.org/download/1.6/src/haproxy-1.6.12.tar.gz

[root@Haproxy_Keepalived_Master src]# tar -zvxf haproxy-1.6.12.tar.gz

[root@Haproxy_Keepalived_Master src]# cd haproxy-1.6.12

[root@Haproxy_Keepalived_Master haproxy-1.6.12]# make TARGET=linux26 CPU=x86_64 PREFIX=/usr/local/haprpxy USE_OPENSSL=1 ADDLIB=-lz

 

參數說明:

TARGET=linux26      #使用 uname -r 查看內核,如:2.6.32-642.el6.x86_64,此時該參數就爲linux26

CPU=x86_64          #使用 uname -r 查看系統信息,如 x86_64 GNU/Linux,此時該參數就爲 x86_64

PREFIX=/usr/local/haprpxy      #haprpxy 安裝路徑

 

[root@Haproxy_Keepalived_Master haproxy-1.6.12]# ldd haproxy | grep ssl

  libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f6f3d9b2000)

[root@Haproxy_Keepalived_Master haproxy-1.6.12]# make install PREFIX=/usr/local/haproxy

   

[root@Haproxy_Keepalived_Master haproxy-1.6.12]# mkdir -p /usr/local/haproxy/conf

[root@Haproxy_Keepalived_Master haproxy-1.6.12]# mkdir -p /etc/haproxy

[root@Haproxy_Keepalived_Master haproxy-1.6.12]# cp /usr/local/src/haproxy-1.6.12/examples/option-http_proxy.cfg /usr/local/haproxy/conf/haproxy.cfg

[root@Haproxy_Keepalived_Master haproxy-1.6.12]# ln -s /usr/local/haproxy/conf/haproxy.cfg /etc/haproxy/haproxy.cfg

[root@Haproxy_Keepalived_Master haproxy-1.6.12]# cp -r /usr/local/src/haproxy-1.6.12/examples/errorfiles  /usr/local/haproxy/errorfiles

[root@Haproxy_Keepalived_Master haproxy-1.6.12]# ln -s /usr/local/haproxy/errorfiles /etc/haproxy/errorfiles

[root@Haproxy_Keepalived_Master haproxy-1.6.12]# mkdir -p /usr/local/haproxy/log

[root@Haproxy_Keepalived_Master haproxy-1.6.12]# touch /usr/local/haproxy/log/haproxy.log

[root@Haproxy_Keepalived_Master haproxy-1.6.12]# ln -s /usr/local/haproxy/log/haproxy.log /var/log/haproxy.log

[root@Haproxy_Keepalived_Master haproxy-1.6.12]# cp /usr/local/src/haproxy-1.6.12/examples/haproxy.init /etc/rc.d/init.d/haproxy

[root@Haproxy_Keepalived_Master haproxy-1.6.12]# chmod +x /etc/rc.d/init.d/haproxy

[root@Haproxy_Keepalived_Master haproxy-1.6.12]# chkconfig haproxy on

[root@Haproxy_Keepalived_Master haproxy-1.6.12]# ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin

 

2)配置 haproxy.cfg 參數(Haproxy_Keepalived_Master 和 Haproxy_Keepalived_Backup兩臺機器都要操作)

[root@Haproxy_Keepalived_Master ~]# cp /usr/local/haproxy/conf/haproxy.cfg /usr/local/haproxy/conf/haproxy.cfg.bak

[root@Haproxy_Keepalived_Master ~]# vim /usr/local/haproxy/conf/haproxy.cfg

global                              

   log 127.0.0.1 local3 info  #在本機記錄日誌

   maxconn 65535      #每個進程可用的最大連接數

   chroot /usr/local/haproxy         #haproxy 安裝目錄

   uid 99       #運行haproxy的用戶uid(cat /etc/passwd 查看,這裏是nobody的uid)

   gid 99       #運行haproxy的用戶組id(cat /etc/passwd 查看,這裏是nobody組id)

   daemon       #以後臺守護進程運行

 

defaults

   log global

   mode http      #運行模式 tcp、 http、 health

   retries 3      #三次連接失敗,則判斷服務不可用

   option redispatch  #如果後端有服務器宕機,強制切換到正常服務器

   stats uri /haproxy             #統計頁面 URL 路徑

   stats refresh 30s      #統計頁面自動刷新時間

   stats realm haproxy-status  #統計頁面輸入密碼框提示信息

   stats auth admin:dxInCtFianKtL]36   #統計頁面用戶名和密碼

   stats hide-version   #隱藏統計頁面上 HAProxy 版本信息

   maxconn 65535       #每個進程可用的最大連接數

   timeout connect 5000    #連接超時

   timeout client 50000    #客戶端超時

   timeout server 50000    #服務器端超時

 

frontend http-in                     #自定義描述信息

   mode http            #運行模式 tcp、 http、 health

   maxconn 65535          #每個進程可用的最大連接數

   bind :80            #監聽 80 端口

   log global                       

   option httplog                   

   option httpclose                  #每次請求完畢後主動關閉 http 通道

   acl is_a hdr_beg(host) -i www.wangshibo.com        #規則設置,-i 後面是要訪問的域名

   acl is_b hdr_beg(host) -i www.guohuihui.com        #如果多個域名,就寫多個規則,一規則對應一個域名;即後面有多個域名,就寫 is_c、 is-d….,這個名字可以隨意起。但要與下面的use_backend 對應

   use_backend web-server if is_a    #如果訪問 is_a 設置的域名,就負載均衡到下面backend 設置的對應 web-server 上。web-server所負載的域名要都部署到下面的web01和web02上。如果是不同的域名部署到不同的機器上,就定義不同的web-server。

   use_backend web-server if is_b

 

backend web-server

   mode http

   balance roundrobin   #設置負載均衡模式,source 保存 session 值,roundrobin 輪詢模式

   cookie SERVERID insert indirect nocache

   option httpclose

   option forwardfor

   server web01 182.148.15.233:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5

   server web02 182.148.15.238:80 weight 1 cookie 4 check inter 2000 rise 2 fall 5

 

注意參數解釋:inter 2000 心跳檢測時間;rise 2 三次連接成功,表示服務器正常;fall 5 三次連接失敗,表示服務器異常; weight 1 權重設置

 

 

3)啓動haproxy(Haproxy_Keepalived_Master 和 Haproxy_Keepalived_Backup兩臺機器都要操作)

[root@Haproxy_Keepalived_Master ~]# service haproxy start    #啓動

[root@Haproxy_Keepalived_Master ~]# service haproxy stop     #關閉

[root@Haproxy_Keepalived_Master ~]# service haproxy restart  #重啓

[root@Haproxy_Keepalived_Master ~]# service haproxy status   #查看服務狀態

 

4)設置HAProxy日誌(Haproxy_Keepalived_Master 和 Haproxy_Keepalived_Backup兩臺機器都要操作)

[root@Haproxy_Keepalived_Master ~]# vim /etc/rsyslog.conf

.......

$ModLoad imudp                       #取消註釋 ,這一行不註釋,日誌就不會寫

$UDPServerRun 514                    #取消註釋 ,這一行不註釋,日誌就不會寫

.......

local0.*     /var/log/haproxy.log      #這一行可以沒有,可以不用寫

local3.*     /var/log/haproxy.log      #這一行必須要寫

 

[root@Haproxy_Keepalived_Master ~]# vim /etc/sysconfig/rsyslog

SYSLOGD_OPTIONS="-r -m 0"           #接收遠程服務器日誌

 

[root@Haproxy_Keepalived_Master ~]# service rsyslog restart

 

 

-------------------------------------------------------------------------------------------------------------------------

 

1)安裝Keepalived(Haproxy_Keepalived_Master 和 Haproxy_Keepalived_Backup兩臺機器都要操作)

[root@Haproxy_keepalived_Master ~]# yum install -y openssl-devel

[root@Haproxy_keepalived_Master ~]# cd /usr/local/src/

[root@Haproxy_keepalived_Master src]# wget http://www.keepalived.org/software/keepalived-1.3.5.tar.gz

[root@Haproxy_keepalived_Master src]# tar -zvxf keepalived-1.3.5.tar.gz

[root@Haproxy_keepalived_Master src]# cd keepalived-1.3.5

[root@Haproxy_keepalived_Master keepalived-1.3.5]# ./configure --prefix=/usr/local/keepalived

[root@Haproxy_keepalived_Master keepalived-1.3.5]# make && make install

       

[root@Haproxy_keepalived_Master keepalived-1.3.5]# cp /usr/local/src/keepalived-1.3.5/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/

[root@Haproxy_keepalived_Master keepalived-1.3.5]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

[root@Haproxy_keepalived_Master keepalived-1.3.5]# mkdir /etc/keepalived/

[root@Haproxy_keepalived_Master keepalived-1.3.5]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

[root@Haproxy_keepalived_Master keepalived-1.3.5]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

[root@Haproxy_keepalived_Master keepalived-1.3.5]# echo "/etc/init.d/keepalived start" >> /etc/rc.local

 

[root@Haproxy_keepalived_Master keepalived-1.3.5]# chmod +x /etc/rc.d/init.d/keepalived      #添加執行權限

[root@Haproxy_keepalived_Master keepalived-1.3.5]# chkconfig keepalived on     #設置開機啓動

[root@Haproxy_keepalived_Master keepalived-1.3.5]# service keepalived start     #啓動

[root@Haproxy_keepalived_Master keepalived-1.3.5]# service keepalived stop      #關閉

[root@Haproxy_keepalived_Master keepalived-1.3.5]# service keepalived restart    #重啓

 

2)Haproxy_Keepalived_Master服務器上的Keepalived配置如下:

[root@Haproxy_Keepalived_Master ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf-bak

[root@Haproxy_Keepalived_Master ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

  notification_email {

    root@localhost

    }

 

notification_email_from keepalived@localhost

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id HAproxy237

}

 

vrrp_script chk_haproxy {          #HAproxy 服務監控腳本                    

  script "/etc/keepalived/check_haproxy.sh"

  interval 2

  weight 2

}

 

vrrp_instance VI_1 {

  state MASTER

  interface eth0

  virtual_router_id 51

  priority 100

  advert_int 1

  authentication {

    auth_type PASS

    auth_pass 1111

}

  track_script {

    chk_haproxy

}

virtual_ipaddress {

    182.148.15.239

}

notify_master "/etc/keepalived/clean_arp.sh 182.148.15.239"

}

vrrp_instance VI_2 {

  state BACKUP

  interface eth0

  virtual_router_id 52

  priority 99

  advert_int 1

  authentication {

    auth_type PASS

    auth_pass 1111

}

virtual_ipaddress {

  182.148.15.235

}

notify_master "/etc/keepalived/clean_arp.sh 182.148.15.235"

}

 

 

3)Haproxy_Keepalived_Backup服務器上的Keepalived配置如下:

[root@Haproxy_Keepalived_Backup ~]# /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf-bak

[root@Haproxy_Keepalived_Backup ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

  notification_email {

    root@localhost

    }

 

notification_email_from keepalived@localhost

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id HAproxy236

}

 

vrrp_script chk_haproxy {                            

  script "/etc/keepalived/check_haproxy.sh"

  interval 2

  weight 2

}

 

vrrp_instance VI_1 {

  state BACKUP

  interface eth0

  virtual_router_id 51

  priority 99

  advert_int 1

  authentication {

    auth_type PASS

    auth_pass 1111

}

  track_script {

    chk_haproxy

}

virtual_ipaddress {

    182.148.15.239

}

notify_master "/etc/keepalived/clean_arp.sh 182.148.15.239"

}

vrrp_instance VI_2 {

  state MASTER

  interface eth0

  virtual_router_id 52

  priority 100

  advert_int 1

  authentication {

    auth_type PASS

    auth_pass 1111

}

virtual_ipaddress {

  182.148.15.235

}

notify_master "/etc/keepalived/clean_arp.sh 182.148.15.235"

}

 

4)設置HAproxy服務監控腳本(Haproxy_Keepalived_Master 和 Haproxy_Keepalived_Backup兩臺機器都要操作)

[root@Haproxy_Keepalived_Master ~]# vim /etc/keepalived/check_haproxy.sh

#!/bin/bash

A=`ps -C haproxy --no-header | wc -l`

if [ $A -eq 0 ];then

/etc/init.d/haproxy start

sleep 3

if [ `ps -C haproxy --no-header | wc -l ` -eq 0 ];then

/etc/init.d/keepalived stop

fi

fi

 

[root@Haproxy_Keepalived_Master ~]# chmod +x /etc/keepalived/check_haproxy.sh

 

5)設置更新虛擬服務器(VIP)地址的arp記錄到網關腳本(Haproxy_Keepalived_Master 和 Haproxy_Keepalived_Backup兩臺機器都要操作)

[root@Haproxy_Keepalived_Master ~]# vim /etc/keepalived/clean_arp.sh

#!/bin/sh

VIP=$1

GATEWAY=182.148.15.254              這個是本機的外網網卡網關地址

/sbin/arping -I eth0 -c 5 -s $VIP $GATEWAY &>/dev/null

 

6)系統內核優化(Haproxy_Keepalived_Master 和 Haproxy_Keepalived_Backup兩臺機器都要操作)

[root@Haproxy_Keepalived_Master ~]# echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range

[root@Haproxy_Keepalived_Master ~]# echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout

[root@Haproxy_Keepalived_Master ~]# echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog

[root@Haproxy_Keepalived_Master ~]# echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets

[root@Haproxy_Keepalived_Master ~]# echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans

[root@Haproxy_Keepalived_Master ~]# echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time

[root@Haproxy_Keepalived_Master ~]# echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle

[root@Haproxy_Keepalived_Master ~]# echo 0 > /proc/sys/net/ipv4/tcp_timestamps

[root@Haproxy_Keepalived_Master ~]# echo 0 > /proc/sys/net/ipv4/tcp_ecn

[root@Haproxy_Keepalived_Master ~]# echo 1 > /proc/sys/net/ipv4/tcp_sack

[root@Haproxy_Keepalived_Master ~]# echo 0 > /proc/sys/net/ipv4/tcp_dsack

 

7)分別啓動Haproxy_Keepalived_Master 和 Haproxy_Keepalived_Backup的keealived和haproxy服務,並查看vip

[root@Haproxy_Keepalived_Master ~]# /etc/init.d/keepalived start

[root@Haproxy_Keepalived_Master ~]# /etc/init.d/haproxy start

[root@Haproxy_Keepalived_Master ~]# ip addr              

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 52:54:00:68:dc:b6 brd ff:ff:ff:ff:ff:ff

    inet 182.148.15.237/27 brd 182.148.15.255 scope global eth0

    inet 182.148.15.239/32 scope global eth0

    inet6 fe80::5054:ff:fe68:dcb6/64 scope link

       valid_lft forever preferred_lft forever

 

[root@Haproxy_Keepalived_Backup ~]# /etc/init.d/keepalived start

[root@Haproxy_Keepalived_Backup ~]# /etc/init.d/haproxy start

[root@Haproxy_Keepalived_Backup ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 52:54:00:7c:b8:f0 brd ff:ff:ff:ff:ff:ff

    inet 182.148.15.236/27 brd 182.148.15.255 scope global eth0

    inet 182.148.15.235/32 scope global eth0

    inet6 fe80::5054:ff:fe7c:b8f0/64 scope link

       valid_lft forever preferred_lft forever

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

在兩臺Real Server上配置好nginx,nginx安裝配置過程省略。

  

分別在兩臺Real Server上配置兩個域名www.wangshibo.com和www.guohuihui.com

 

在Haproxy_Keepalived_Master 和 Haproxy_Keepalived_Backup兩臺機器上要能正常訪問這兩個域名

[root@Haproxy_Keepalived_Master ~]# curl http://www.wangshibo.com

this is page of Real_Server1:182.148.15.238 www.wangshibo.com

[root@Haproxy_Keepalived_Master ~]# curl http://www.guohuihui.com

this is page of Real_Server2:182.148.15.238 www.guohuihui.com

 

[root@Haproxy_Keepalived_Backup ~]# curl http://www.wangshibo.com

this is page of Real_Server1:182.148.15.238 www.wangshibo.com

[root@Haproxy_Keepalived_Backup ~]# curl http://www.guohuihui.com

this is page of Real_Server2:182.148.15.238 www.guohuihui.com

 

關閉182.148.15.238這臺機器(即Real_Server2)的nginx,發現對於域名的請求就會到Real_Server1上

[root@Real_Server2 ~]# /usr/local/nginx/sbin/nginx -s stop

[root@Real_Server2 ~]# lsof -i:80

 

[root@Haproxy_Keepalived_Master ~]# curl http://www.wangshibo.com

this is page of Real_Server1:182.148.15.233 www.wangshibo.com

[root@Haproxy_Keepalived_Master ~]# curl http://www.guohuihui.com

this is page of Real_Server1:182.148.15.233 www.guohuihui.com

[root@Haproxy_Keepalived_Backup ~]# curl http://www.wangshibo.com

this is page of Real_Server1:182.148.15.233 www.wangshibo.com

[root@Haproxy_Keepalived_Backup ~]# curl http://www.guohuihui.com

this is page of Real_Server1:182.148.15.233 www.guohuihui.com

 

另外,設置這兩臺Real Server的iptables,讓其80端口只對前面的兩個vip資源開放

[root@Real_Server1 ~]# vim /etc/sysconfig/iptables

......

-A INPUT -s 182.148.15.235 -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

-A INPUT -s 182.148.15.239 -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

[root@Real_Server1 ~]# /etc/init.d/iptables restart

3)兩臺Real Server上的操作

4)測試 HAProxy+Keepalived 是否正常運行
將www.wangshibo.com和www.guohuihui.com域名解析到這兩個VIP資源上
打開 HAProxy 監控頁面。輸入在haproxy.cfg文件裏配置的用戶名和密碼(如上,即用戶名admin和密碼dxInCtFianKtL]36)

 

 

可以看出後端兩臺Real Server服務器的web狀態,如上截圖,發現web01狀態是ok的,web02狀態是down,即Real_Server2這臺服務器的nginx進程關閉,它已不在負載均衡內。
啓動web02的nginx,再次查看,就在負載均衡內了

1

[root@Real_Server2 ~]# /usr/local/nginx/sbin/nginx

 在瀏覽器裏訪問這兩個域名,是可以正常訪問的,如下訪問請求負載到Real Server1(即182.148.15.233這臺機器上)

 

嘗試關閉Real Server1的nginx,再次訪問這兩個域名,發現訪問請求就會負載到另一臺Real Server2機器上了

1

[root@Real_Server1 ~]# /usr/local/nginx/sbin/nginx -s stop

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

接着測試Keepalived心跳測試的高可用

默認情況下,Haproxy_Keepalived_Master 和Haproxy_Keepalived_Backup 這兩臺機器各自綁定自己的vip,並都提供服務。使用ip addr可以查看到VIP情況

[root@Haproxy_Keepalived_Master ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 52:54:00:68:dc:b6 brd ff:ff:ff:ff:ff:ff

    inet 182.48.115.237/27 brd 182.48.115.255 scope global eth0

    inet 182.48.115.239/32 scope global eth0

    inet6 fe80::5054:ff:fe68:dcb6/64 scope link

       valid_lft forever preferred_lft forever

 

[root@Haproxy_Keepalived_Backup ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 52:54:00:7c:b8:f0 brd ff:ff:ff:ff:ff:ff

    inet 182.48.115.236/27 brd 182.48.115.255 scope global eth0

    inet 182.48.115.235/32 scope global eth0

    inet6 fe80::5054:ff:fe7c:b8f0/64 scope link

       valid_lft forever preferred_lft forever

 

 

1)先關閉 Haproxy_Keepalived_Master的keepalived服務。查看/var/log/message日誌,可以發現VIP資源已經轉移走了

[root@Haproxy_Keepalived_Master ~]# /etc/init.d/keepalived stop

Stopping keepalived:                                       [  OK  ]

 

[root@Haproxy_Keepalived_Master ~]# tail -f /var/log/messages

May  5 16:16:45 Haproxy_Keepalived_Master Keepalived_vrrp[29820]: VRRP_Instance(VI_1) sent 0 priority

May  5 16:16:45 Haproxy_Keepalived_Master Keepalived_vrrp[29820]: VRRP_Instance(VI_1) removing protocol VIPs.

 

[root@Haproxy_Keepalived_Master ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 52:54:00:68:dc:b6 brd ff:ff:ff:ff:ff:ff

    inet 182.48.115.237/27 brd 182.48.115.255 scope global eth0

    inet6 fe80::5054:ff:fe68:dcb6/64 scope link

       valid_lft forever preferred_lft forever

 

接着查看Haproxy_Keepalived_Backup的/var/log/messages日誌,發現已經將Haproxy_Keepalived_Master的VIP接管過來了

[root@Haproxy_Keepalived_Backup ~]# tail -f /var/log/messages

.......

May  5 16:16:45 locahost Keepalived_vrrp[23381]: VRRP_Instance(VI_1) Transition to MASTER STATE

May  5 16:16:46 locahost Keepalived_vrrp[23381]: VRRP_Instance(VI_1) Entering MASTER STATE

May  5 16:16:46 locahost Keepalived_vrrp[23381]: VRRP_Instance(VI_1) setting protocol VIPs.

May  5 16:16:46 locahost Keepalived_vrrp[23381]: Sending gratuitous ARP on eth0 for 182.48.115.239

May  5 16:16:46 locahost Keepalived_vrrp[23381]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 182.48.115.239

May  5 16:16:46 locahost Keepalived_vrrp[23381]: Sending gratuitous ARP on eth0 for 182.48.115.239

May  5 16:16:46 locahost Keepalived_vrrp[23381]: Sending gratuitous ARP on eth0 for 182.48.115.239

May  5 16:16:46 locahost Keepalived_vrrp[23381]: Sending gratuitous ARP on eth0 for 182.48.115.239

May  5 16:16:46 locahost Keepalived_vrrp[23381]: Sending gratuitous ARP on eth0 for 182.48.115.239

May  5 16:16:51 locahost Keepalived_vrrp[23381]: Sending gratuitous ARP on eth0 for 182.48.115.239

 

[root@Haproxy_Keepalived_Backup ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 52:54:00:7c:b8:f0 brd ff:ff:ff:ff:ff:ff

    inet 182.48.115.236/27 brd 182.48.115.255 scope global eth0

    inet 182.48.115.235/32 scope global eth0

    inet 182.48.115.239/32 scope global eth0

    inet6 fe80::5054:ff:fe7c:b8f0/64 scope link

       valid_lft forever preferred_lft forever

 

在瀏覽器裏訪問這兩個域名,發現訪問正常,沒有受到影響!

 

然後將Haproxy_Keepalived_Master的Keepalived服務啓動,就會發現它的vip又會自動轉移回來

[root@Haproxy_Keepalived_Master ~]# /etc/init.d/keepalived start

Starting keepalived:                                       [  OK  ]

[root@Haproxy_Keepalived_Master ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 52:54:00:68:dc:b6 brd ff:ff:ff:ff:ff:ff

    inet 182.48.115.237/27 brd 182.48.115.255 scope global eth0

    inet 182.48.115.239/32 scope global eth0

    inet6 fe80::5054:ff:fe68:dcb6/64 scope link

       valid_lft forever preferred_lft forever

 

而此時Haproxy_Keepalived_Backup的只有自己的vip了

[root@Haproxy_Keepalived_Backup ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 52:54:00:7c:b8:f0 brd ff:ff:ff:ff:ff:ff

    inet 182.48.115.236/27 brd 182.48.115.255 scope global eth0

    inet 182.48.115.235/32 scope global eth0

    inet6 fe80::5054:ff:fe7c:b8f0/64 scope link

       valid_lft forever preferred_lft forever

 

同理,關閉Haproxy_Keepalived_Backup的keepalived,它的vip也會轉移到Haproxy_Keepalived_Master機器上,等它重新啓動keepalived後,它的vip也會重新轉移回來!

 

--------------------------------------------------------------------------------------------------------------

 

最後關閉Haproxy_Keepalived_Master的haproxy進程,發現haproxy進程關閉後,vip資源還在,說明還在提供服務。

這是因爲在keepalived.conf文件裏配置了haproxy進程的監控腳本,當haproxy進程關閉後,會自動執行監控腳本,當發現haproxy進程不在後,最多2s就會啓動,如若haproxy啓動失敗,纔會強制關閉keeaplived服務,

此時就會轉移vip到另一臺機器上。所以,一般在keepalived服務啓動的情況下,haproxy服務不會關閉,即使關閉了,也會自動重啓。

---------------------------------------------------------------------------------------------------
二、Haproxy+Keepalived主從模式的高可用環境

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

主從環境相比於主主環境,區別只在於keepalived.conf的配置不同,其他的配置都和主主模式下的一樣,並且主從環境下只有一個VIP(默認在Master端配置)

比如:VIP爲182.148.15.239

  

1)Haproxy_Keepalived_Master服務器上的Keepalived配置如下:

[root@Haproxy_Keepalived_Master ~]# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

  notification_email {

    root@localhost

    }

  

notification_email_from keepalived@localhost

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id HAproxy237

}

  

vrrp_script chk_haproxy {                           

  script "/etc/keepalived/check_haproxy.sh"

  interval 2

  weight 2

}

  

vrrp_instance VI_1 {

  state MASTER

  interface eth0

  virtual_router_id 51

  priority 100

  advert_int 1

  authentication {

    auth_type PASS

    auth_pass 1111

}

  track_script {

    chk_haproxy

}

virtual_ipaddress {

    182.148.15.239

}

notify_master "/etc/keepalived/clean_arp.sh 182.148.15.239"

}

  

2)Haproxy_Keepalived_Backup服務器上的Keepalived配置如下:

[root@Haproxy_Keepalived_Backup ~]# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

  notification_email {

    root@localhost

    }

  

notification_email_from keepalived@localhost

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id HAproxy236

}

  

vrrp_script chk_haproxy {                           

  script "/etc/keepalived/check_haproxy.sh"

  interval 2

  weight 2

}

  

vrrp_instance VI_1 {

  state BACKUP

  interface eth0

  virtual_router_id 51

  priority 99

  advert_int 1

  authentication {

    auth_type PASS

    auth_pass 1111

}

  track_script {

    chk_haproxy

}

virtual_ipaddress {

    182.148.15.239

}

notify_master "/etc/keepalived/clean_arp.sh 182.148.15.239"

}

  

  

3)分別重啓兩臺機器的keepalived服務,再次查看vip,發現vip默認是在Haproxy_Keepalived_Master下

[root@Haproxy_Keepalived_Master ~]# /etc/init.d/keepalived restart

Stopping keepalived:                                       [  OK  ]

Starting keepalived:                                       [  OK  ]

[root@Haproxy_Keepalived_Master ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 52:54:00:68:dc:b6 brd ff:ff:ff:ff:ff:ff

    inet 182.148.15.237/27 brd 182.148.15.255 scope global eth0

    inet 182.148.15.239/32 scope global eth0

    inet6 fe80::5054:ff:fe68:dcb6/64 scope link

       valid_lft forever preferred_lft forever

  

[root@Haproxy_Keepalived_Backup ~]# /etc/init.d/keepalived restart

Stopping keepalived:                                       [  OK  ]

Starting keepalived:                                       [  OK  ]

[root@Haproxy_Keepalived_Backup ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 52:54:00:7c:b8:f0 brd ff:ff:ff:ff:ff:ff

    inet 182.148.15.236/27 brd 182.148.15.255 scope global eth0

    inet6 fe80::5054:ff:fe7c:b8f0/64 scope link

       valid_lft forever preferred_lft forever

  

4)測試

關閉Haproxy_Keepalived_Master的keepalived進程,發現VIP資源已經漂移到Haproxy_Keepalived_Backup上了

[root@Haproxy_Keepalived_Master ~]# /etc/init.d/keepalived stop

Stopping keepalived:                                       [  OK  ]

[root@Haproxy_Keepalived_Master ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 52:54:00:68:dc:b6 brd ff:ff:ff:ff:ff:ff

    inet 182.148.15.237/27 brd 182.148.15.255 scope global eth0

    inet6 fe80::5054:ff:fe68:dcb6/64 scope link

       valid_lft forever preferred_lft forever

  

查看Haproxy_Keepalived_Backup機器,發現VIP已經轉移過來

[root@Haproxy_Keepalived_Backup ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 52:54:00:7c:b8:f0 brd ff:ff:ff:ff:ff:ff

    inet 182.148.15.236/27 brd 182.148.15.255 scope global eth0

    inet 182.148.15.239/32 scope global eth0

    inet6 fe80::5054:ff:fe7c:b8f0/64 scope link

       valid_lft forever preferred_lft forever

  

然後再次啓動Haproxy_Keepalived_Master的keepalived進程,發現VIP資源又轉移回來。

[root@Haproxy_Keepalived_Master ~]# /etc/init.d/keepalived start

Starting keepalived:                                       [  OK  ]

[root@Haproxy_Keepalived_Master ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 52:54:00:68:dc:b6 brd ff:ff:ff:ff:ff:ff

    inet 182.148.15.237/27 brd 182.148.15.255 scope global eth0

    inet 182.148.15.239/32 scope global eth0

    inet6 fe80::5054:ff:fe68:dcb6/64 scope link

       valid_lft forever preferred_lft forever

  

再以上測試過程中,對於兩個測試域名的訪問時不受影響的。

  

--------------------------------------------------------------------------------------

關閉Haproxy進程,由於已經在keepalived.conf文件裏配置了chk_haproxy的監控腳本,即:

Haproxy進程關閉後,會自動執行這個監控腳本區啓動haproxy,如果啓動失敗,就會強制關閉keepalived進程,從而實現VIP資源的轉移。

***************當你發現自己的才華撐不起野心時,就請安靜下來學習吧***************

轉載自:https://www.cnblogs.com/kevingrace/p/5892169.html

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