大型網站架構系列:負載均衡詳解(4)

本文是負載均衡詳解的第四篇,主要介紹了LVS的三種請求轉發模式和八種負載均衡算法,以及Haproxy的特點和負載均衡算法。具體參考文章,詳見最后的鏈接。

?

三、LVS負載均衡

LVS是一個開源的軟件,由畢業于國防科技大學的章文嵩博士于1998年5月創立,用來實現Linux平臺下的簡單負載均衡。LVS是Linux Virtual Server的縮寫,意思是Linux虛擬服務器。

基于IP層的負載均衡調度技術,它在操作系統核心層上,將來自IP層的TCP/UDP請求均衡地轉移到不同的?服務器,從而將一組服務器構成一個高性能、高可用的虛擬服務器。

?

操作系統:Liunx

開發語言:C

并發性能:默認4096,可以修改但需要重新編譯。

3.1.功能

LVS的主要功能是實現IP層(網絡層)負載均衡,有NAT,TUN,DR三種請求轉發模式。

3.1.1LVS/NAT方式的負載均衡集群

NAT是指Network Address Translation,它的轉發流程是:Director機器收到外界請求,改寫數據包的目標地址,按相應的調度算法將其發送到相應Real Server上,Real Server處理完該請求后,將結果數據包返回到其默認網關,即Director機器上,Director機器再改寫數據包的源地址,最后將其返回給外界。這樣就完成一次負載調度。

?

構架一個最簡單的LVS/NAT方式的負載均衡集群Real Server可以是任何的操作系統,而且無需做任何特殊的設定,惟一要做的就是將其默認網關指向Director機器。Real Server可以使用局域網的內部IP(192.168.0.0/24)。Director要有兩塊網卡,一塊網卡綁定一個外部IP地址 (10.0.0.1),另一塊網卡綁定局域網的內部IP(192.168.0.254),作為Real Server的默認網關。

LVS/NAT方式實現起來最為簡單,而且Real Server使用的是內部IP,可以節省Real IP的開銷。但因為執行NAT需要重寫流經Director的數據包,在速度上有一定延遲;

當用戶的請求非常短,而服務器的回應非常大的情況下,會對Director形成很大壓力,成為新的瓶頸,從而使整個系統的性能受到限制。

3.1.2LVS/TUN方式的負載均衡集群

TUN是指IP Tunneling,它的轉發流程是:Director機器收到外界請求,按相應的調度算法,通過IP隧道發送到相應Real Server,Real Server處理完該請求后,將結果數據包直接返回給客戶。至此完成一次負載調度。

?

最簡單的LVS/TUN方式的負載均衡集群架構使用IP Tunneling技術,在Director機器和Real Server機器之間架設一個IP Tunnel,通過IP Tunnel將負載分配到Real Server機器上。Director和Real Server之間的關系比較松散,可以是在同一個網絡中,也可以是在不同的網絡中,只要兩者能夠通過IP Tunnel相連就行。收到負載分配的Real Server機器處理完后會直接將反饋數據送回給客戶,而不必通過Director機器。實際應用中,服務器必須擁有正式的IP地址用于與客戶機直接通信,并且所有服務器必須支持IP隧道協議。

?

該方式中Director將客戶請求分配到不同的Real Server,Real Server處理請求后直接回應給用戶,這樣Director就只處理客戶機與服務器的一半連接,極大地提高了Director的調度處理能力,使集群系統能容納更多的節點數。另外TUN方式中的Real Server可以在任何LAN或WAN上運行,這樣可以構筑跨地域的集群,其應對災難的能力也更強,但是服務器需要為IP封裝付出一定的資源開銷,而且后端的Real Server必須是支持IP Tunneling的操作系統。

3.3.3LVS/TUN方式的負載均衡集群

DR是指Direct Routing,它的轉發流程是:Director機器收到外界請求,按相應的調度算法將其直接發送到相應Real Server,Real Server處理完該請求后,將結果數據包直接返回給客戶,完成一次負載調度。

?

構架一個最簡單的LVS/DR方式的負載均衡集群Real Server和Director都在同一個物理網段中,Director的網卡IP是192.168.0.253,再綁定另一個IP: 192.168.0.254作為對外界的virtual IP,外界客戶通過該IP來訪問整個集群系統。Real Server在lo上綁定IP:192.168.0.254,同時加入相應的路由。

?

LVS/DR方式與前面的LVS/TUN方式有些類似,前臺的Director機器也是只需要接收和調度外界的請求,而不需要負責返回這些請求的反饋結果,所以能夠負載更多的Real Server,提高Director的調度處理能力,使集群系統容納更多的Real Server。但LVS/DR需要改寫請求報文的MAC地址,所以所有服務器必須在同一物理網段內。

3.3架構

LVS架設的服務器集群系統有三個部分組成:最前端的負載均衡層(Loader Balancer),中間的服務器群組層,用Server Array表示,最底層的數據共享存儲層,用Shared Storage表示。在用戶看來所有的應用都是透明的,用戶只是在使用一個虛擬服務器提供的高性能服務。

LVS的體系架構如圖:

?

LVS的各個層次的詳細介紹:

Load Balancer層:位于整個集群系統的最前端,有一臺或者多臺負載調度器(Director Server)組成,LVS模塊就安裝在Director Server上,而Director的主要作用類似于一個路由器,它含有完成LVS功能所設定的路由表,通過這些路由表把用戶的請求分發給Server Array層的應用服務器(Real Server)上。同時,在Director Server上還要安裝對Real Server服務的監控模塊Ldirectord,此模塊用于監測各個Real Server服務的健康狀況。在Real Server不可用時把它從LVS路由表中剔除,恢復時重新加入。

Server Array層:由一組實際運行應用服務的機器組成,Real Server可以是WEB服務器、MAIL服務器、FTP服務器、DNS服務器、視頻服務器中的一個或者多個,每個Real Server之間通過高速的LAN或分布在各地的WAN相連接。在實際的應用中,Director Server也可以同時兼任Real Server的角色。

Shared Storage層:是為所有Real Server提供共享存儲空間和內容一致性的存儲區域,在物理上,一般有磁盤陣列設備組成,為了提供內容的一致性,一般可以通過NFS網絡文件系統共享數 據,但是NFS在繁忙的業務系統中,性能并不是很好,此時可以采用集群文件系統,例如Red hat的GFS文件系統,oracle提供的OCFS2文件系統等。

從整個LVS結構可以看出,Director Server是整個LVS的核心,目前,用于Director Server的操作系統只能是Linux和FreeBSD,linux2.6內核不用任何設置就可以支持LVS功能,而FreeBSD作為 Director Server的應用還不是很多,性能也不是很好。對于Real Server,幾乎可以是所有的系統平臺,Linux、windows、Solaris、AIX、BSD系列都能很好的支持。

3.4均衡策略

LVS默認支持八種負載均衡策略,簡述如下:

3.4.1.輪詢調度(Round Robin)

調度器通過“輪詢”調度算法將外部請求按順序輪流分配到集群中的真實服務器上,它均等地對待每一臺服務器,而不管服務器上實際的連接數和系統負載。

3.4.2.加權輪詢(Weighted Round Robin)

調度器通過“加權輪詢”調度算法根據真實服務器的不同處理能力來調度訪問請求。這樣可以保證處理能力強的服務器能處理更多的訪問流量。調度器可以自動問詢真實服務器的負載情況,并動態地調整其權值。

3.4.3.最少鏈接(Least Connections)

調度器通過“最少連接”調度算法動態地將網絡請求調度到已建立的鏈接數最少的服務器上。如果集群系統的真實服務器具有相近的系統性能,采用“最小連接”調度算法可以較好地均衡負載。

3.4.4.加權最少鏈接(Weighted Least Connections)

在集群系統中的服務器性能差異較大的情況下,調度器采用“加權最少鏈接”調度算法優化負載均衡性能,具有較高權值的服務器將承受較大比例的活動連接負載。調度器可以自動問詢真實服務器的負載情況,并動態地調整其權值。

3.4.5.基于局部性的最少鏈接(Locality-Based Least Connections)

“基于局部性的最少鏈接”調度算法是針對目標IP地址的負載均衡,目前主要用于Cache集群系統。該算法根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處于一半的工作負載,則用“最少鏈接” 的原則選出一個可用的服務器,將請求發送到該服務器。

3.4.6.帶復制的基于局部性最少鏈接(Locality-Based Least Connections with Replication)

“帶復制的基于局部性最少鏈接”調度算法也是針對目標IP地址的負載均衡,目前主要用于Cache集群系統。它與LBLC算法的不同之處是它要維護從一個目標IP地址到一組服務器的映射,而LBLC算法維護從一個目標IP地址到一臺服務器的映射。該算法根據請求的目標IP地址找出該目標IP地址對應的服務器組,按“最小連接”原則從服務器組中選出一臺服務器,若服務器沒有超載,將請求發送到該服務器;若服務器超載,則按“最小連接”原則從這個集群中選出一臺服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以降低復制的程度。

3.4.7.目標地址散列(Destination Hashing)

“目標地址散列”調度算法根據請求的目標IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。

3.4.8.源地址散列(Source Hashing)

“源地址散列”調度算法根據請求的源IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。

?

除具備以上負載均衡算法外,還可以自定義均衡策略。

3.5場景

一般作為入口負載均衡或內部負載均衡,結合反向代理服務器使用。相關架構可參考Ngnix場景架構。

4、HaProxy負載均衡

HAProxy也是使用較多的一款負載均衡軟件。HAProxy提供高可用性、負載均衡以及基于TCP和HTTP應用的代理,支持虛擬主機,是免費、快速并且可靠的一種解決方案。特別適用于那些負載特大的web站點。運行模式使得它可以很簡單安全的整合到當前的架構中,同時可以保護你的web服務器不被暴露到網絡上。

4.1.特點

  • 支持兩種代理模式:TCP(四層)和HTTP(七層),支持虛擬主機;
  • 配置簡單,支持url檢測后端服務器狀態;
  • 做負載均衡軟件使用,在高并發情況下,處理速度高于nginx;
  • TCP層多用于Mysql從(讀)服務器負載均衡。 (對Mysql進行負載均衡,對后端的DB節點進行檢測和負載均衡)
  • 能夠補充Nginx的一些缺點比如Session的保持,Cookie引導等工作

4.2.均衡策略

支持四種常用算法:

1.roundrobin:輪詢,輪流分配到后端服務器;

2.static-rr:根據后端服務器性能分配;

3.leastconn:最小連接者優先處理;

4.source:根據請求源IP,與Nginx的IP_Hash類似。

五、本次分享總結

以上是本周的分享,從主要講解了軟件負載均衡的應用背景,Ngnix負載均衡,LVS負載均衡,Haproxy負載均衡。

因為時間關系,有些講解的不細致,大家可以問下度娘/Google,希望本次分享對大家有幫助。

?

參考資料:

Nginx負載均衡實現原理圖解?http://www.server110.com/nginx/201403/7225.html

Nginx架構及其web服務搭建優化配置詳解

http://linux.it.net.cn/e/server/nginx/2015/0102/11183.html

Ngnix雙主場景:http://network.51cto.com/art/201109/288597.htm

用LVS構架負載均衡Linux集群系統 linux lvs

http://blog.chinaunix.net/uid-45094-id-3012037.html

LVS基本介紹

http://os.51cto.com/art/201202/317108.htm

?

分享是快樂的,也是個人成長的過程。文章一般是自己的學習總結,工作經驗,不足之處在所難免,請大家指正,共同進步。建立了一個以架構為中心的QQ群415215516,歡迎大家加入。專注大型分布式網站架構,大數據,架構模式,設計模式。

轉載于:https://www.cnblogs.com/like-minded/p/5157619.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373728.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373728.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373728.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于JavaFX的最常見問題

上周,我在斯德哥爾摩的Jfokus 2012上做了一個關于JavaFX的演講,當時我意識到每次活動都會問三個問題。 似乎有一個普遍的興趣,所以我嘗試在這篇文章中回答他們(盡可能的說實話): iPad或其他移動設備上的Jav…

python中面向對象空間時間_python基礎學習Day15 面向對象、類名稱空間、對象名稱空間 (2)...

一、類先看一段代碼:classPerson:animal 高級動物walk_way 直立行走 # 靜態屬性,靜態變量,靜態字段language 語言def __init__(self,name,age,work): # 函數 動態屬性,方法#print(self)self.name nameself.ageageself.workworkdef…

Linux GRUB 引導Win 7 ---- error: invalid EFI file path

最近新買了個固態硬盤,先裝了個Win 7系統,現在裝的系統和以前裝系統唯一的區別是引導不是以前的MBR,而是最新看似是個趨勢的GPTUEFI方式。 win 7 裝完啦,還是和以往的一樣裝 Ubantu (Ubantu 12.04),ubantu 引導磁盤扇…

其他位不變,具體位的賦值操作

GPIOC (GPIOC & 0xf0) | (Content[s_Index] & 0x0f);        //低四位賦值GPIOB (GPIOB & 0xc3) | ((Content[s_Index]>>2) & 0x3c);     //中間四位賦值 具體某一位置1或取反&#xff1a; 正確寫法&#xff1a; 置1:GPIOC | (1<<i…

使用Spring AOP實現活動記錄模式

在班級設計中&#xff0c;我們應就每個班級的職責分配做出決定。 如果我們選擇的不錯&#xff0c;系統將更易于理解&#xff0c;維護和擴展。 幾乎我們所有的項目都有一個持久層&#xff0c;即關系數據庫&#xff0c;文檔存儲或僅XML文件。 通常&#xff0c;您將使用DAO模式在業…

Java基礎之反射

框架都要用到反射技術&#xff0c;反射都要用到一個類Class. java程序中的各個java類屬于同一類事物&#xff0c;描述這類事物的java類名就是Class. 得到字節碼的方式有三種&#xff1a; Date.class;new Date().getClass();Class.forName("java.lang.String");最后一…

php socketconnect連接失敗_PHP設計模式之模板方法模式

模板方法模式&#xff0c;也是我們經常會在不經意間有會用到的模式之一。這個模式是對繼承的最好詮釋。當子類中有重復的動作時&#xff0c;將他們提取出來&#xff0c;放在父類中進行統一的處理&#xff0c;這就是模板方法模式的最簡單通俗的解釋。就像我們平時做項目&#xf…

linux系統硬件配置查看方法

一&#xff1a;查看cpu more /proc/cpuinfo | grep "model name" grep "model name" /proc/cpuinfo 如果覺得需要看的更加舒服 grep "model name" /proc/cpuinfo | cut -f2 -d: 二&#xff1a;查看內存 grep MemTotal /proc/meminfo grep MemT…

java String源碼學習

public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {/**char數組用于字符的存儲 */private final char value[];/** 緩存string的hash碼 */private int hash; // Default to 0public String() {/**無參構造函數,打印值為&quo…

JBoss AS 7.1.0.Final“ Thunder”發布-Java EE 6 Full Profile認證!

在JBoss AS7上進行了大約一年的開發后&#xff0c;我們現已發布7.1.0.Final“ Thunder” &#xff01; 可從此處的通常位置下載該文件。 對于JBoss AS7團隊來說&#xff0c;這是一個非常大的成就&#xff0c;我們為此版本感到非常自豪。 這個版本包含了7.1.0.CR1b的許多錯誤修復…

數據庫建表練習(10.11作業)

轉載于:https://www.cnblogs.com/HRZJ/p/5951897.html

天干地支計算公式_天干地支主怎樣計算?

回答&#xff1a;少女時代級別&#xff1a;碩士研究生2009-01-08 20:34:04來自&#xff1a;貴州省貴陽市我國古代是用天干地支來紀年的&#xff0c;現代社會已很少使用。一來現今社會已經離不開國際化&#xff0c;沿用老的歷法已經不現實&#xff1b;二來天干地支在民間多用于算…

從程序員到CTO的Java技術路線圖

時間:2013-05-29 17:39來源:www.chengxuyuans.com在技術方面無論我們怎么學習&#xff0c;總感覺需要提升自已不知道自己處于什么水平了。但如果有清晰的指示圖供參考還是非常不錯的&#xff0c;這樣我們清楚的知道我們大概處于那個階段和水平。 Java程序員 高級特性 反射、泛型…

Linux的網卡相關

檢測linux下網卡是否正常 1.dmesg | grep eth 如果出現以下 eth0: link up 說明是網卡正常的 eth0: registered as PCnet/PCI II 79C970Aeth0: link upeth0: no IPv6 routers present 2.如果所用網卡是pcI總線的 。用命令&#xff1a;lspci 能看到網卡是存在的。 3.用ethtool…

設置Spring 3開發環境

本教程簡要說明了如何設置典型的環境來開發基于Spring的應用程序。 除了可以正常工作的Windows XP客戶端具有足夠的CPU能力和內存外&#xff0c;本教程沒有其他先決條件。 在教程中&#xff0c;我們將需要安裝以下組件&#xff1a; Java 6 JDK更新26 用于Java EE開發人員的Ecl…

3. 跟蹤標記 (Trace Flag) 1204, 1222 抓取死鎖信息

跟蹤標記&#xff1a;1204/1222 功能及用途&#xff1a; 捕獲SQL Server死鎖信息&#xff0c;并自動存放到錯誤日志(ERRORLOG)中。 舉例&#xff1a; USE tempdb GO CREATE TABLE t1(id int) INSERT t1 SELECT 1CREATE TABLE t2(id int) INSERT t2 SELECT 1 GO --開啟1204/1222…

postgresql建表帶注釋_postgresql建表帶自增id和注釋語句

work是表名&#xff0c;nextval(work_myid_seq::regclass)這個是自增id的設置CREATE TABLE "public"."work" ("id" int8 NOT NULL DEFAULT nextval(work_myid_seq::regclass),"wid" int8,"address" varchar(100) COLLATE &q…

js中window.onload 與 jquery中$(document.ready()) 測試

js中window.onload 與 jquery中$(document.ready())區別&#xff0c;驗證代碼如下(調換js代碼和Jquer代碼書寫順序測試&#xff0c;運行結果一樣&#xff0c;因此與代碼書寫位置沒關系)&#xff1a;<html> <head> <script typetext/javascript srcjquery-1.11.1…

5. Longest Palindromic Substring

更新&#xff1a; 之前那種dp太笨重了有個非常的輕巧的做法&#xff0c;原理都是一樣的。 轉移方程不變&#xff0c;但是不需要特別的初始化 判斷某個格子是不是true&#xff0c;是 1.要么長度小于3&#xff0c;要么dp[start1][end-1]true 2.并且s.charAt(start) s.charAt(end…

Java中的定制國際化(i18n)

國際化&#xff08;i18n&#xff09;在我們的軟件項目中非常重要。 它主要帶來以下好處&#xff1a; 將UI字符串外部化為除代碼文件之外的外部文件&#xff0c;以及易于管理的UI內容。 支持多種語言。 在這篇文章中&#xff0c;將為Eclipse和Java項目提供一個簡短的i18n實際示…