haproxy+keepalived原理特點


所有的系統,都是先經歷一個單台機器搞所有業務的時代,一個程序+一個mysql數據庫,就可以滿足開發及第一個版本上線的要求。隨着,數據的增加以及業務的增長,這些應用就面臨一個訪問量的擴大以及擴展的問題。最簡單的擴展就是水平擴展,原來由一個mysql增加為2個或多個,形成一個集群,這樣最簡單的能力就是提供更強的服務能力。如原來的訪問量支持每秒1000,現在可以支持2000(理想值),相當於將服務能力分散到多個節點。這里面涉及到多個問題,首先就是數據的相互備份,然后就是如何分配計算能力,外部如何來訪問等。本文引入HaProxy和KeepAlived主要處理的就是一個外部訪問問題。

在后面的介紹當中,假定有2個mysql,分別為mysqlA和mysqlB.

1、haproxy請求分發
可以理解為通過nginx來作后端的負載均衡,haproxy可以通過監聽一個統一的端口對外提供能力,然后內部進行分發。除支持http7層處理外,還順便為mysql支持4層轉發。(更高級的可以考慮采用lvs) 在這里,將兩個mysql分別配置在backend當中,並且通過option mysql-check進行相應服務的檢查。

程序進行訪問時,就不再訪問具體的mysql機器,而是訪問這個haproxy所在的機器。這里就提到需要一個額外的機器來提供服務,但是由於只為haproxy使用,其根據很低,一個最低配機器即可,費用不大。同時,相應的端口也填寫haproxy所暴露的端口即可。對外即認為也只仍然只有一個mysql,即對外是透明的。

haproxy在進行處理時,將自己根據相應的策略進行轉發,最簡單的策略就是輪詢(ribbon),當然其它加權或者是隨機等,需要具體進行配置。同時,根據設定的具體時間間隔,對后端服務進行有效性檢測,當mysqlA或B不能工作時,將自動從可用列表中移除。

在加上haproxy之后,負載的問題被解決,但另一個問題又來了,即服務單點的問題。如果一旦這個haproxy機器掛掉(或網絡原因)。雖然,mysql服務器沒掛,但整個服務也是不可用了。前端程序不會自動退回到去訪問原始的mysql(甚至由於防火牆的問題,它也不能訪問)。這時候就要用到另一個東西,保證haproxy不會成為單點,即KeepAlived。

2、KeepAlived高可用
保證服務不會單點的作法就是加機器,但加機器就會出現多個ip,如何保證前端程序使用單個ip又能保證后端的實際處理機器為多台,這就是KeepAlived的作用。

我們為了保證haproxy的高可用,已經又加了一個機器,即為haproxyA和haproxyB(相當於原來的2個mysql機器,又加了2台haproxy機器)。

通過KeepAlived,我們可以創造出第3個IP,由ip3來對外提供服務,但是與HaProxy的轉發性質不同,這里的ip3實際上就是HaProxyA和HaProxyB的一個同名映射。可以理解為HaProxyA和HaProxyB都在爭搶這個ip,哪個爭搶到了,就由哪個來提供服務。可以理解為在一定的時間內,保證以下關系

IP3<=>IP1
IP2 wait IP3

因為KeepAlived不提供任何處理能力,實際上最終的處理落在能夠處理信息的程序上。因此,我們需要將KeepAlived和HaProxy部署在一起,即KeepAlived負責搶ip,接收前端的請求,在接收到了請求之后,由系統自動將請求分發到同一個機器上的HaProxy上進行處理。即一個機器有2個IP,ip1負責接收請求,ip2負責實際的信息處理(比喻而已,就是如何監聽請求和端口處理程序)

在前面的處理模型當中,因為KeepAlived不處理請求,因此如果它所在機器上的haproxy如果不可用,實際上這個模型也是有問題的。因此KeepAlived又要來監聽自己機器上的haproxy是否有效。在配置中,通過track_script指令可以達到這個效果,與haproxy的工作模式差不多,它可以定時執行監控腳本來查看haproxy是否可用。如果不可用,有2種處理辦法,一種就是強行再啟動haproxy,另一種就是取消自己的搶占ip位(如將自己給kill掉),將相應的ip3的位置給讓出來。這樣IP2就能自動與IP3進行綁定(比喻),即由IP2來提供處理能力了。

在KeepAlived的配置之上,在單個時刻只有1台機器在進行工作,另一個機器在進行准備,可以理解為這里的服務能力只有1半。好在KeepAlived和HaProxy所占用資源都較小,費用不高。

最終部署模型
a、MysqlA(ip5)和MysqlB(ip6)水平擴展,通過雙主進行數據通信,並且同時提供服務能力
b、通過HaProxyA(ip3)和HaProxyB(ip4)提供mysql的負載能力,將請求路由到指定的mysql服務器,同時監控后端的mysql數據庫可用性
c、將KeepAlivedA和KeepAlivedB分別和HaProxyA和HaProxyB部署在一起,同時綁定VIP ip1,對外提供訪問ip,同時監控本機的HaProxy的可用性

通過以上的部署,一個最前端的數據訪問可能是以下的訪問路徑

IP1=>IP3->IP5
IP1=>IP3->IP6
IP1=>IP4->IP5
IP1=>IP4->IP6

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM