負載均衡(Load Balance)是分布式系統(tǒng)架構設計中必須考慮的因素之一,它通常是指,將請求/數據【均勻】分攤到多個操作單元上執(zhí)行,負載均衡的關鍵在于【均勻】。
負載均衡建立在現有網絡結構之上,它提供了一種廉價有效透明的方法擴展網絡設備和服務器的帶寬、增加吞吐量、加強網絡數據處理能力、提高網絡的靈活性和可用性。
一.負載均衡原理
系統(tǒng)的擴展可分為縱向(垂直)擴展和橫向(水平)擴展??v向擴展,是從單機的角度通過增加硬件處理能力,比如CPU處理能力,內存容量,磁盤等方面,實現服務器處理能力的提升,不能滿足大型分布式系統(tǒng)(網站),大流量,高并發(fā),海量數據的問題。因此需要采用橫向擴展的方式,通過添加機器來滿足大型網站服務的處理能力。比如:一臺機器不能滿足,則增加兩臺或者多臺機器,共同承擔訪問壓力。
l 應用集群:將同一應用部署到多臺機器上,組成處理集群,接收負載均衡設備分發(fā)的請求,進行處理,并返回相應數據。
l 負載均衡設備:將用戶訪問的請求,根據負載均衡算法,分發(fā)到集群中的一臺處理服務器。(一種把網絡請求分散到一個服務器集群中的可用服務器上去的設備)
負載均衡的作用(解決的問題):
1.解決并發(fā)壓力,提高應用處理性能(增加吞吐量,加強網絡處理能力);
2.提供故障轉移,實現高可用;
3.通過添加或減少服務器數量,提供網站伸縮性(擴展性);
4.安全防護;(負載均衡設備上做一些過濾,黑白名單等處理)
二. 負載均衡分類
根據實現技術不同,可分為DNS負載均衡,HTTP負載均衡,IP負載均衡,鏈路層負載均衡等。
2.1 DNS負載均衡
最早的負載均衡技術,利用域名解析實現負載均衡,在DNS服務器,配置多個A記錄,這些A記錄對應的服務器構成集群。大型網站總是部分使用DNS解析,作為第一級負載均衡。
優(yōu)點
1>. 使用簡單:負載均衡工作,交給DNS服務器處理,省掉了負載均衡服務器維護的麻煩;
2>. 提高性能:可以支持基于地址的域名解析,解析成距離用戶最近的服務器地址,可以加快訪問速度,改善性能;
缺點
1>. 可用性差:DNS解析是多級解析,新增/修改DNS后,解析時間較長;解析過程中,用戶訪問網站將失?。?/p>
2>. 擴展性低:DNS負載均衡的控制權在域名商那里,無法對其做更多的改善和擴展;
3>.SPAN>
實踐建議
將DNS作為第一級負載均衡,A記錄對應著內部負載均衡的IP地址,通過內部負載均衡將請求分發(fā)到真實的Web服務器上。一般用于互聯(lián)網公司,復雜的業(yè)務系統(tǒng)不合適使用。
2.2 IP負載均衡
在網絡層通過修改請求目標地址進行負載均衡。
用戶請求數據包,到達負載均衡服務器后,負載均衡服務器在操作系統(tǒng)內核進程獲取網絡數據包,根據負載均衡算法得到一臺真實服務器地址,然后將請求目的地址修改為,獲得的真實ip地址,不需要經過用戶進程處理。
真實服務器處理完成后,響應數據包回到負載均衡服務器,負載均衡服務器,再將數據包源地址修改為自身的ip地址,發(fā)送給用戶瀏覽器。
IP負載均衡,真實物理服務器返回給負載均衡服務器,存在兩種方式:(1)負載均衡服務器在修改目的ip地址的同時修改源地址。將數據包源地址設為自身盤,即源地址轉換(snat)。(2)將負載均衡服務器同時作為真實物理服務器集群的網關服務器。
優(yōu)點:在內核進程完成數據分發(fā),比在應用層分發(fā)性能更好;
缺點:所有請求響應都需要經過負載均衡服務器,集群最大吞吐量受限于負載均衡服務器網卡帶寬;
2.4 鏈路層負載均衡
在通信協(xié)議的數據鏈路層修改mac地址,進行負載均衡。
數據分發(fā)時,不修改ip地址,指修改目標mac地址,配置真實物理服務器集群所有機器虛擬ip和負載均衡服務器ip地址一致,達到不修改數據包的源地址和目標地址,進行數據分發(fā)的目的。
實際處理服務器ip和數據請求目的ip一致,不需要經過負載均衡服務器進行地址轉換,可將響應數據包直接返回給用戶瀏覽器,避免負載均衡服務器網卡帶寬成為瓶頸。也稱為直接路由模式(DR模式)。
優(yōu)點:性能好;
缺點:配置復雜;
實踐建議:DR模式是目前使用最廣泛的一種負載均衡方式。
2.5混合型負載均衡
由于多個服務器群內硬件設備、各自的規(guī)模、提供的服務等的差異,可以考慮給每個服務器群采用最合適的負載均衡方式,然后又在這多個服務器群間再一次負載均衡或群集起來以一個整體向外界提供服務(即把這多個服務器群當做一個新的服務器群),從而達到最佳的性能。將這種方式稱之為混合型負載均衡。
此種方式有時也用于單臺均衡設備的性能不能滿足大量連接請求的情況下。是目前大型互聯(lián)網公司,普遍使用的方式。
以上模式適合有動靜分離的場景,反向代理服務器(集群)可以起到緩存和動態(tài)請求分發(fā)的作用,當時靜態(tài)資源緩存在代理服務器時,則直接返回到瀏覽器。如果動態(tài)頁面則請求后面的應用負載均衡(應用集群)。
當談到網絡架構和性能優(yōu)化時,負載均衡是一個至關重要的概念。在今天這個數字化時代,網站訪問量巨大,服務器壓力空前增加,因此負載均衡技術變得尤為重要。
負載均衡是一種技術,用于在多臺服務器之間分發(fā)負載,確保每臺服務器都能高效處理請求。它通過智能地將流量分發(fā)到不同的服務器上,不僅提高了網站的性能,還增強了系統(tǒng)的穩(wěn)定性和可靠性。
負載均衡通過分配用戶請求來避免單個服務器過載,確保每臺服務器都處于最佳工作狀態(tài)。它可以根據服務器的負載情況,流量量和性能等因素,動態(tài)調整請求分發(fā)策略,從而提高整個系統(tǒng)的性能。
在高流量的網站或應用程序中,單臺服務器可能無法滿足所有用戶的請求,容易導致性能下降甚至宕機。而引入負載均衡技術可以有效地解決這一問題,提高系統(tǒng)的吞吐量和穩(wěn)定性。
另外,在進行系統(tǒng)維護或升級時,可以通過負載均衡將流量導向到其他正常運行的服務器上,從而實現零停機時間,保證用戶的訪問體驗。
域名解析在負載均衡中扮演著至關重要的角色。當用戶輸入一個域名并訪問網站時,域名解析會將域名轉換為對應的IP地址,然后負載均衡將根據特定的算法將用戶請求分配到后端的服務器上。
通過合理配置域名解析和負載均衡,可以實現靈活的負載分配策略,提高系統(tǒng)的可靠性和性能。同時,及時更新域名解析記錄也可以確保負載均衡系統(tǒng)的穩(wěn)定運行。
引入適當的負載均衡方案可以帶來諸多優(yōu)勢,包括:
在當今互聯(lián)網發(fā)展迅猛的環(huán)境下,合理配置負載均衡技術對于保證網站的穩(wěn)定運行和性能優(yōu)化至關重要。通過了解負載均衡的原理、常見算法和與域名解析的結合,可以為網絡架構的設計提供更有效的解決方案,確保系統(tǒng)運行的高可用性和高性能。
所謂負載均衡,就是 Nginx 把請求均勻的分攤給上游的應用服務器,這樣即使某一個服務器宕機也不會影響請求的處理,或者當應用服務器扛不住了,可以隨時進行擴容。
在 x 軸上,可以通過橫向擴展應用服務器集群,Nginx 基于 Round-Robin 或者 Least-Connected 算法分發(fā)請求。但是橫向擴展并不能解決所有問題,當數據量大的情況下,無論擴展多少臺服務,單臺服務器數據量依然很大。
在 y 軸上,可以基于 URL 進行不同功能的分發(fā)。需要對 Nginx 基于 URL 進行 location 的配置,成本較高。
在 z 軸上可以基于用戶信息進行擴展。例如將用戶 IP 地址或者其他信息映射到某個特定的服務或者集群上去。
這就是 Nginx 的負載均衡功能,它的主要目的就是為了增強服務的處理能力和容災能力。
實現負載均衡的原理為:假設Apache接收到http://127.0.0.1 /test請求,由于該請求滿足ProxyPass條件(其URL前綴為“/"),該請求會 被分發(fā)到后臺某一個BalancerMember。
譬如該請求可能會轉發(fā)到http://127.0.0.1:8080/進行處理。
當第二個滿足條件的URL請求過來時,該請求可能會被分發(fā)到另外一臺BalancerMember,譬如,可能會轉發(fā)到 http://127.0.0.1:7080/如此循環(huán)反復,便實現了負載均衡的機制。
負載均衡是一種將工作負載分配到多個服務器或計算資源上的技術,以提高系統(tǒng)的性能、可靠性和可擴展性。它可以通過不同的方式實現,有以下幾種常見的負載均衡方式及其區(qū)別:
基于硬件的負載均衡:使用專用的硬件設備(如負載均衡器)來分發(fā)流量和請求。這些設備通常具有高性能和可靠性,并提供豐富的負載均衡算法和功能。它們可以在網絡層或應用層進行負載均衡,并能夠處理大量的并發(fā)請求。
基于軟件的負載均衡:使用軟件來實現負載均衡功能,通常在服務器上運行。這種方式可以通過軟件負載均衡器、反向代理服務器或應用程序級別的負載均衡來實現。它相對于硬件負載均衡來說成本較低,但性能可能會受到服務器資源的限制。
DNS負載均衡:通過DNS服務器將請求分發(fā)到不同的服務器上。DNS負載均衡可以根據不同的策略(如輪詢、加權輪詢、最少連接等)將請求分發(fā)到不同的IP地址,從而實現負載均衡。然而,DNS負載均衡的效果可能受到DNS緩存和TTL(Time to Live)的影響。
內容分發(fā)網絡(CDN):CDN是一種分布式的網絡架構,通過將內容緩存到離用戶更近的邊緣節(jié)點上,以提供更快的訪問速度和更好的用戶體驗。CDN可以根據用戶的地理位置和網絡狀況來選擇最佳的邊緣節(jié)點,從而實現負載均衡。
總體而言,不同的負載均衡方式適用于不同的場景和需求。硬件負載均衡器通常適用于大規(guī)模、高性能的環(huán)境,而軟件負載均衡和DNS負載均衡適用于中小規(guī)模的環(huán)境。CDN則適用于需要提供全球范圍內快速訪問的應用。選擇適合自己需求的負載均衡方式需要考慮到性能、可靠性、成本和可擴展性等因素。
負載均衡(Load Balance)是指將負載(工作任務)進行平衡、分攤到多個操作單元上運行,促使多臺設備共同更快、更高效完成某一項或者多項任務。負載均衡在現有網絡結構基礎上,提供了一種透明并且廉價有效的方法擴展服務器和網絡設備的帶寬、加強網絡數據處理能力,增加吞吐量、提高網絡的可用性和靈活性。
負載均衡包含兩方面的含義:
①將一個復雜任務拆分成多個子任務,然后交由多個操作單元協(xié)作處理,最后共同完成這項任務。是不是有點像分布式計算呢?
②將海量、高并發(fā)訪問處理均分到多個處理單元中,雨露均沾,避免旱的旱死,澇的澇死
Activemq 的作用就是系統(tǒng)之間進行通信。 當然可以使用其他方式進行系統(tǒng)間通信, 如果使用 Activemq 的話可以對系統(tǒng)之間的調用進行解耦,
實現系統(tǒng)間的異步通信。 原理就是生產者生產消息, 把消息發(fā)送給activemq。 Activemq 接收到消息, 然后查看有多少個消費者,
然后把消息轉發(fā)給消費者, 此過程中生產者無需參與。 消費者接收到消息后做相應的處理和生產者沒有任何關系
負載均衡是一種將網絡流量分配到多個服務器或計算機資源上的技術。當一個服務器的負載過高時,負載均衡可以將部分流量分配到其他服務器上,以達到負載均衡,提高系統(tǒng)的可靠性、可用性和性能。負載均衡可以通過多種方式實現,包括硬件設備、軟件應用和云服務等。負載均衡在現代計算機網絡中扮演著重要的角色,可以幫助企業(yè)提高網站和應用程序的可用性和性能。
負載均衡就是分攤到多個操作單元上進行執(zhí)行,例如Web服務器、FTP服務器、企業(yè)關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工作任務。
負載均衡建立在現有網絡結構之上,它提供了一種廉價有效透明的方法擴展網絡設備和服務器的帶寬、增加吞吐量、加強網絡數據處理能力、提高網絡的靈活性和可用性。
Remoting:網絡通信框架,實現了sync-over-async和request-response消息機制。
RPC:一個遠程過程調用的抽象,支持負載均衡、容災和集群功能。
Registry:服務目錄框架用于服務的注冊和服務事件發(fā)布和訂閱。(類似第一篇文章中的點菜寶)
dubbo架構
Provider: 暴露服務的提供方。
Consumer:調用遠程服務的服務消費方。
Registry: 服務注冊中心和發(fā)現中心。
Monitor: 統(tǒng)計服務和調用次數,調用時間監(jiān)控中心。(dubbo的控制臺頁面中可以顯示)
Container:服務運行的容器。
調用關系:
0、服務器負責啟動,加載,運行提供者(例如在tomcat容器中,啟動dubbo服務端)。
1、提供者在啟動時,向注冊中心注冊自己提供的服務。
2、消費者啟動時,向注冊中心訂閱自己所需的服務。
3、注冊中心返回提供者地址列表給消費者,如果有變更,注冊中心將基于長連接推送變更數據給消費者。
4、消費者,從遠程接口列表中,調用遠程接口,dubbo會基于負載均衡算法,選一臺提供者進行調用,如果調用失敗則選擇另一臺。
5、消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發(fā)送一次統(tǒng)計數據到監(jiān)控中心。(可以在dubbo的可視化界面看到)
dubbo的容錯方案
當我們的系統(tǒng)中用到Dubbo的集群環(huán)境,因為各種原因在集群調用失敗時,Dubbo提供了多種容錯方案,缺省為failover重試。
Dubbo的集群容錯在這里想說說他是因為我們實際的項目中出現了此類的問題,因為依賴的第三方項目出現異常,導致dubbo調用超時,此時使用的是默認的集群容錯方式,而配置的reties='3',這樣前段系統(tǒng)連續(xù)掉用了三次服務,結果可想而知.
先說一下各節(jié)點關系:
這里的Invoker是Provider的一個可調用Service的抽象,Invoker封裝了Provider地址及Service接口信息。
Directory代表多個Invoker,可以把它看成List<Invoker>,但與List不同的是,它的值可能是動態(tài)變化的,比如注冊中心推送變更。
Cluster將Directory中的多個Invoker偽裝成一個Invoker,對上層透明,偽裝過程包含了容錯邏輯,調用失敗后,重試另一個。
Router負責從多個Invoker中按路由規(guī)則選出子集,比如讀寫分離,應用隔離等。
LoadBalance負責從多個Invoker中選出具體的一個用于本次調用,選的過程包含了負載均衡算法,調用失敗后,需要重選。
集群容錯模式:
Failover Cluster
失敗自動切換,當出現失敗,重試其它服務器。(缺省)
通常用于讀操作,但重試會帶來更長延遲。
可通過retries="2"來設置重試次數(不含第一次)。正是文章剛開始說的那種情況.
Failfast Cluster
快速失敗,只發(fā)起一次調用,失敗立即報錯。
通常用于非冪等性的寫操作,比如新增記錄。
Failsafe Cluster
失敗安全,出現異常時,直接忽略。
通常用于寫入審計日志等操作。
Failback Cluster
失敗自動恢復,后臺記錄失敗請求,定時重發(fā)。
通常用于消息通知操作。
Forking Cluster
并行調用多個服務器,只要一個成功即返回。
通常用于實時性要求較高的讀操作,但需要浪費更多服務資源。
可通過forks="2"來設置最大并行數。
Broadcast Cluster
廣播調用所有提供者,逐個調用,任意一臺報錯則報錯。(2.1.0開始支持)
通常用于通知所有提供者更新緩存或日志等本地資源信息。
重試次數配置如:(failover集群模式生效)
<dubbo:serviceretries="2"/>
或:<dubbo:referenceretries="2"/>
或:<dubbo:reference>
<dubbo:methodname="findFoo"retries="2"/>
</dubbo:reference>
集群模式配置如:
<dubbo:servicecluster="failsafe"/>
或:<dubbo:referencecluster="failsafe"/>
dubbo負載均衡策略:
在集群負載均衡時,Dubbo提供了多種均衡策略,缺省為random隨機調用。
RandomLoadBalance
隨機,按權重設置隨機概率。
在一個截面上碰撞的概率高,但調用量越大分布越均勻,而且按概率使用權重后也比較均勻,有利于動態(tài)調整提供者權重。
RoundRobin LoadBalance
輪循,按公約后的權重設置輪循比率。
存在慢的提供者累積請求問題,比如:第二臺機器很慢,但沒掛,當請求調到第二臺時就卡在那,久而久之,所有請求都卡在調到第二臺上。
LeastActive LoadBalance
最少活躍調用數,相同活躍數的隨機,活躍數指調用前后計數差。
使慢的提供者收到更少請求,因為越慢的提供者的調用前后計數差會越大。
ConsistentHashLoadBalance
一致性Hash,相同參數的請求總是發(fā)到同一提供者。
當某一臺提供者掛時,原本發(fā)往該提供者的請求,基于虛擬節(jié)點,平攤到其它提供者,不會引起劇烈變動。
Dubbo的集群容錯和負載均衡同樣也是Dubbo本身的高級特性.正如我們在說自定義擴展的時候一樣,這兩個特征同樣也可以進行自定義擴展,用戶可以根據自己實際的需求來擴展他們從而滿足項目的實際需求.