負載均衡器(Load Balancer,簡稱 LB)是一種硬件或者軟件設備,它可以將客戶端訪問流量根據轉發策略分發到多個服務器或者設備上,以確保系統的負載均衡,通過負載均衡可以有效避免單點故障,提高系統的可靠性和穩定性。LB是所有流量的入口,LB的高可用架構以及可擴展性對于業務的重要性不言而喻。本文全面剖析LB的架構和底層實現原理,以點帶面,詳細介紹LB的構成組件和實現技術、LB的后端網絡拓撲以及LB集群的高可用性。
圖1 LB的構成組件
用戶每創建一個LB集群,都至少生產兩個負載均衡器節點(LB node),它的承載實體可以是虛擬機也可以是容器,容器具有輕量和高性能特性。LB的構成包含三部分,分別如下:
負載均衡器主要接收client的傳入流量,并按照負載均衡算法,將流量分發給LB node。
用戶可以向負載均衡器添加一個或者多個監聽器,監聽器主要用來配置協議和端口,根據檢查客戶端的流量連接請求,按照定義的轉發策略將請求的映射端口流量分發到后端真正承載業務的后端服務器和端口。
后端服務器就是業務的流量承載實體,可以是虛擬機、裸金屬和容器。監聽器會對后端服務器進行定期健康檢查,如果后端服務器有問題,將會從監聽器中摘掉異常服務器,如果后端服務器恢復正常,監聽器會自動添加該服務器繼續為業務提供服務器。負載均衡器按照用戶設置的負載均衡算法(輪詢/最少鏈接/源地址),將流量分發到后端服務器。
圖2 LB集群
負載均衡器作為用戶的網絡服務入口,一旦發生故障將影響業務的整體可用性,所以負載均衡器集群的目的就是提供高可用的負載均衡器服務。負載均衡器集群中包含多個單獨工作的LB node,這些節點保持一致的負載均衡配置,并且具備相同的服務IP地址,提供統一的對外服務。 LB對外服務的ip地址稱之虛擬ip(一般稱vip),負載均衡器集群會自動將vip映射到某個LB nodeIP地址。如圖2所示,每個LB集群的LB node包括Keepalive、LVS和Haproxy服務,其中LB集群會選擇兩個LB node 組成一個Keepalive集群,一個作為master,一個作為slave,其中master 節點為vip所在節點,是client訪問業務的入口ip。Keepalive集群是一個高可用集群,它通過VRRP協議來防止單點故障。如果master節點有問題,slave節點將轉為master節點,對外提供服務。lb-node0作為Keepalive集群的master節點,上面的LVS服務通過默認的加權輪訓算法,將入口流量分發到LB集群的3個node節點,而作為Keepalive slave的lb-node1上的LVS服務會將流量按照加權輪訓算法分發到 lb-node1和lb-node2上。HAProxy作為監聽器的載體,在其配置中為監聽器添加后端服務器。
圖1 LB的構成組件
用戶每創建一個LB集群,都至少生產兩個負載均衡器節點(LB node),它的承載實體可以是虛擬機也可以是容器,容器具有輕量和高性能特性。LB的構成包含三部分,分別如下:
負載均衡器主要接收client的傳入流量,并按照負載均衡算法,將流量分發給LB node。
用戶可以向負載均衡器添加一個或者多個監聽器,監聽器主要用來配置協議和端口,根據檢查客戶端的流量連接請求,按照定義的轉發策略將請求的映射端口流量分發到后端真正承載業務的后端服務器和端口。
后端服務器就是業務的流量承載實體,可以是虛擬機、裸金屬和容器。監聽器會對后端服務器進行定期健康檢查,如果后端服務器有問題,將會從監聽器中摘掉異常服務器,如果后端服務器恢復正常,監聽器會自動添加該服務器繼續為業務提供服務器。負載均衡器按照用戶設置的負載均衡算法(輪詢/最少鏈接/源地址),將流量分發到后端服務器。
圖3 LB后端網絡拓撲
每個LB node包括兩個網卡,分別為eth0和eth1。其中eth0為私有網絡地址,用于和后端服務通信,eth1為基礎網絡地址,用于接收client數據。Haproxy作為eth0和eth1數據通信的橋梁。根據圖3所示,LB后端網絡拓撲詳細介紹了客戶端流量如何通過負載均衡集群,轉發流量到后端服務器,然后后端服務器將響應數據如何返回至client。
首先client 通過訪問vip(1.2.3.252)到lb-node0,此時流量通過eth1網卡進入iptables規則,通過 PREROUTING 表的LUSTER_DIVERT 鏈上的規則,打上 fwmark。fwmark 的值是根據監聽器的端口來分配,具體以 iptables 規則中的 fwmark 值為準,一般從 0x2710 (即10000) 開始分配,和keepalive中virtual_server_group中的值一致。
然后流量到達lvs后,lvs根據fwmark配置,按照lvs配置算法,選擇一個LB node(1.2.3.9)接受流量,如圖3所示lvs對應的配置。此時haproxy 已經開啟端口監聽,流量進入haproxy 的應用程序,按照RR算法,選擇一個合適的后端服務器進行流量轉發。
此時,通過查看LB node所在物理機hyper-1的arp信息和宿主機路由,流量到達br_vg_out網橋,按照bridge fdb流表配置,通過vxlan隧道,將請求數據發送至后端服務(1.2.3.6)所在的物理機hyper-3。hyper-3的內核對vxlan解包后,數據流入到sxxx網橋,然后根據bridge fdb信息,將數據交付給最終的后端服務器。此時需要注意是在hyper-1上后端服務1.2.3.6的mac地址(圖中標紅色)并不是其真正的mac地址,而是其所在物理服務器上網橋的一個網口pair的mac地址,它是封包流量的統一入口,最后會將流量轉發到最終后端服務。
在hyper-3上的后端服務處理完client的請求后,響應數據是如何返回至client的呢?從LB-node0過來的數據包,進入hyper-3的iptables規則后,會對其打上fwmark,響應數據通過查找hyper-3上的策略路由的fwmark值進行路由匹配,然后將數據發送至hyper-3的br_vg_out網橋,通過vxlan隧道發送至LB-node0,此時數據不再經過lvs服務(lvs采用DR工作模式),而是直接將響應數據發送至client。
每個計算節點上都有lxc-monitor守護進程,它監控著物理機上以LXC形式運行的LB node,當LB node 由于某些原因出現stop情況后,lxc-monitor會接收到lxc對應的停止消息,并將該消息發送至lxc-event-handler,lxc-event-handler發送release指令給compute_server, compute_server 服務將會重建該LB node。同理,當整個hyper意外宕機后,其pair-hyper探測到hyper網絡中斷后(hyper和pair-hyper 相互探活彼此),將會觸發重建hyper上面所有的LB node,保障LB node正常工作。
Keepalive 的master節點配置misc_check,會對LB node里面 haproxy 啟動的監聽器的監聽端口進行健康檢查,探測流量走VBC網絡,即eth1網卡。通過使用nc -vz命令定期對ip和端口進行探測,如果不通,則將它從lvs 后端摘掉,這樣業務流量就不會轉發到有問題監聽器上了。
開啟健康檢測后,負載均衡器會根據對應配置定期檢查后端服務的運行狀態,當某個后端服務出現異常時,會自動隔離該后端服務,并將請求轉發給其他健康的后端服務,實現高可用性。
本文介紹了LB的組成原理、高可用架構、網絡流量模型分析和健康檢查機制。只有全面深入了解負載均衡器的工作原理,才能快速定位業務在LB碰到的各種問題。LB可以為用戶提供強大的功能和靈活配置,便于用戶擴展和管理應用程序的基礎架構,并且提高了服務的可用性和穩定性,為系統的構建和性能延伸提供了強有力的支持。
本文鏈接:http://www.tebozhan.com/showinfo-26-94590-0.html探析負載均衡器的實現原理
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: Kafka如何保證消息的不丟失與不重復