一. 集羣的概念html
服務器集羣簡稱集羣是一種服務器系統,它經過一組鬆散集成的服務器軟件和/或硬件鏈接起來高度緊密地協做完成計算工做。在某種意義上,他們能夠被看做是一臺服務器。
集羣系統中的單個服務器一般稱爲節點,一般經過局域網鏈接,但也有其它的可能鏈接方式。集羣服務器一般用來改進單個服務器的計算速度和/或可靠性。通常狀況下集羣
服務器比單個服務器,好比工做站或超級服務器性能價格比要高得多。集羣就是一組獨立的服務器,經過網絡鏈接組合成一個組合來共同完一個任務。前端
說的直白點,集羣就是一組相互獨立的服務器,經過高速的網絡組成一個服務器系統,每一個集羣節點都是運行其本身進程的一個獨立服務器。對網絡用戶來說,網站後
端就是一個單一的系統,協同起來向用戶提供系統資源,系統服務。mysql
二. 爲何要使用集羣linux
1) 集羣的特色
- 高性能performance
一些須要很強的運算處理能力好比天氣預報,核試驗等。這就不是幾臺服務器可以搞定的。這須要上千臺一塊兒來完成這個工做的。nginx
- 價格有效性
一般一套系統集羣架構,只須要幾臺或數十臺服務器主機便可,與動則上百萬的專用超級服務器具備更高的性價比。web
- 可伸縮性
當服務器負載壓力增加的時候,系統可以擴展來知足需求,且不下降服務質量。算法
- 高可用性
儘管部分硬件和軟件發生故障,整個系統的服務必須是7*24小時運行的。sql
2) 集羣的優點
- 透明性
若是一部分服務器宕機了業務不受影響,通常耦合度沒有那麼高,依賴關係沒有那麼高。好比NFS服務器宕機了其餘就掛載不了了,這樣依賴性太強。shell
- 高性能
訪問量增長,可以輕鬆擴展。編程
- 可管理性
整個系統可能在物理上很大,但很容易管理。
- 可編程性
在集羣系統上,容易開發應用程序,門戶網站會要求這個。
3) 集羣分類及不一樣分類的特色
計算機集羣架構按照功能和結構通常分紅如下幾類:
- 負載均衡集羣(Loadbalancingclusters)簡稱LBC
- 高可用性集羣(High-availabilityclusters)簡稱HAC
- 高性能計算集羣(High-perfomanceclusters)簡稱HPC
- 網格計算(Gridcomputing)
就集羣分類而言, 網絡上面通常認爲是有三個,負載均衡和高可用集羣式咱們互聯網行業經常使用的集羣架構。
1) 負載均衡集羣
負載均衡集羣爲企業提供了更爲實用,性價比更高的系統架構解決方案。負載均衡集羣把不少客戶集中訪問的請求負載壓力可能儘量平均的分攤到計算機集羣中處理。
客戶請求負載一般包括應用程度處理負載和網絡流量負載。這樣的系統很是適合向使用同一組應用程序爲大量用戶提供服務。每一個節點均可以承擔必定的訪問請求負載壓力,
而且能夠實現訪問請求在各節點之間動態分配,以實現負載均衡。
負載均衡運行時,通常經過一個或多個前端負載均衡器將客戶訪問請求分發到後端一組服務器上,從而達到整個系統的高性能和高可用性。這樣集羣有時也被稱爲服務器羣。
通常高可用性集羣和負載均衡集羣會使用相似的技術,或同時具備高可用性與負載均衡的特色。
負載均衡集羣的做用:
a)分擔訪問流量(負載均衡)
b)保持業務的連續性(高可用)
2) 高可用性集羣
通常是指當集羣中的任意一個節點失效的狀況下,節點上的全部任務自動轉移到其餘正常的節點上,而且此過程不影響整個集羣的運行,不影響業務的提供。相似是集羣中運行着兩個或兩個以上的同樣的節點,當某個主節點出現故障的時候,那麼其餘做爲從 節點的節點就會接替主節點上面的任務。從節點能夠接管主節點的資源(IP地址,架構身份等),此時用戶不會發現提供服務的對象從主節點轉移到從節點。
高可用性集羣的做用:當一臺機器宕機另外一臺進行接管。比較經常使用的高可用集羣開源軟件有:keepalive,heardbeat。
3) 高性能計算集羣
高性能計算集羣採用將計算任務分配到集羣的不一樣計算節點兒提升計算能力,於是主要應用在科學計算領域。比較流行的HPC採用Linux操做系統和其它一些免費軟件來完成並行運算。這一集羣配置一般被稱爲Beowulf集羣。這類集羣一般運行特定的程序以發揮HPCcluster的並行能力。這類程序通常應用特定的運行庫, 好比專爲科學計算設計的MPI庫。HPC集羣特別適合於在計算中各計算節點之間發生大量數據通信的計算做業,好比一個節點的中間結果或影響到其它節點計算結果的狀況。
三. 負載均衡集羣介紹
負載均衡集羣是 Load Balance 集羣, 是一種將網絡上的訪問流量分佈於各個節點,以下降服務器壓力,更好的向客戶端提供服務的一種方式。
負載均衡集羣的做用:提供一種廉價、有效、透明的方法,來擴展網絡設備和服務器的負載帶寬、增長吞吐量,增強網絡數據處理能力、提升網絡的靈活性和可用性。簡單來講,也就是:
1) 把單臺計算機沒法承受的大規模的併發訪問或數據流量分擔到多臺節點設備上分別處理,減小用戶等待響應的時間,提高用戶體驗。
2) 單個重負載的運算分擔到多臺節點設備上作並行處理,每一個節點設備處理結束後,將結果彙總,返回給用戶,系統處理能力獲得大幅度提升。
3) 7*24小時的服務保證,任意一個或多個設備節點設備宕機,不能影響到業務。在負載均衡集羣中,全部計算機節點都應該提供相同的服務,集羣負載均衡獲取全部對該服務的如站請求。
經常使用的負載均衡分爲:
1) 開源軟件負載均衡: Nginx, LVS, Haproxy (Nginx和Haproxy一般作七層負載均衡, LVS作四層負載均衡. 可是Nginx也能夠經過stream模塊作四層負載均衡, Haproxy也能夠作四層負載均衡 ) ;
2) 商業的硬件負載均衡: 設備F五、Netscale ;
簡單理解一下軟件負載均衡:
1) 所謂分層的負載均衡,都是以網絡的模型來講的。四層就是基於IP和端口的負載均衡,七層就是基於URL等應用信息的負載均衡。因此簡單的說四層負載均衡就是經過IP和端口接收請求再分發至真實的服務器,七層是經過URL或主機名接收請求,而後分發至真實的服務器。
2) .而七層的實現也是在四層的基礎上是實現的,沒有四層就不可能有七層。在第七層上能夠作許多事情,好比能夠根據七層的瀏覽器類別區分是手機仍是PC,將WEB服務器分爲2組,手機登錄專門的移動端網站。
3) 對客戶端來講,客戶端好像是訪問的同一臺主機。其實爲了有更好的用戶體驗,從智能DNS入手,根據客戶端IP來源將域名解析到距離客戶端最近的一臺服務器或者訪問最快速的一臺服務器,但這些內容客戶端都是感受不到的,客戶端感受到的只能是訪問網站很快。
四. LVS負載均衡集羣說明
1) LVS是什麼?
LVS是linux virtual server的簡寫linux虛擬服務器,是一個虛擬的服務器集羣系統,能夠在unix/linux平臺下實現負載均衡集羣功能。該項目在1998年5月由章文嵩博士組織成立。LVS是一種集羣(Cluster)技術,採用IP負載均衡技術和基於內容請求分發技術。調度器具備很好的吞吐率,將請求均衡地轉移到不一樣的服務器上執行,且調度器自動屏蔽掉服務器
的故障,從而將一組服務器構成一個高性能的、高可用的虛擬服務器。整個服務器集羣的結構對客戶是透明的,並且無需修改客戶端和服務器端的程序。
LVS集羣採用IP負載均衡技術和基於內容請求分發技術。調度器具備很好的吞吐率,將請求均衡地轉移到不一樣的服務器上執行,且調度器自動屏蔽掉服 務器的故障,從而將一組服務器構成一個高性能的、高可用的虛擬服務器。整個服務器集羣的結構對客戶是透明的,並且無需修改客戶端和服務器端的程序。
LVS在設計時須要考慮系統的透明性、可伸縮性、高可用性和易管理性。通常來講,LVS集羣採用三層結構,其體系結構如圖所示:
負載均衡的原理很簡單,就是當客戶端發起請求時,請求直接發給Director Server(調度器),這時會根據設定的調度算法,將請求按照算法的規定智能的分發到真正的後臺服務器。以達到將壓力均攤。可是咱們知道,http的鏈接時無狀態的,假設這樣一個場景,我登陸某寶買東西,當我看上某款商品時,我將它加入購物車,可是我刷新了一下頁面,這時因爲負載均衡的緣由,調度器又選了新的一臺服務器爲我提供服務,我剛纔的購物車內容全都不見了,這樣就會有十分差的用戶體驗。因此就還須要一個存儲共享,這樣就保證了用戶請求的數據是同樣的。因此LVS負載均衡分爲三層架構(也就是LVS負載均衡主要組成部分):
第一層:負載調度器(load balancer/ Director),它是整個集羣的總代理,它在有兩個網卡,一個網卡面對訪問網站的客戶端,一個網卡面對整個集羣的內部。負責將客戶端的請求發送到一組服務器上執行,而客戶也認爲服務是來自這臺主的。舉個生動的例子,集羣是個公司,負載調度器就是在外接攬生意,將接攬到的生意分發給後臺的真正幹活的真正的主機們。固然須要將活按照必定的算法分發下去,讓你們都公平的幹活。
第二層:服務器池(server pool/ Realserver),是一組真正執行客戶請求的服務器,能夠當作WEB服務器。就是上面例子中的小員工。
第三層:共享存儲(shared storage),它爲服務器池提供一個共享的存儲區,這樣很容易使得服務器池擁有相同的內容,提供相同的服務。一個公司得有一個後臺帳目吧,這才能協調。否則客戶把錢付給了A,而換B接待客戶,由於沒有相同的帳目。B說客戶沒付錢,那這樣就不是客戶體驗度的問題了。
2) LVS負載均衡集羣特色
2.1) IP負載均衡與負載調度算法
IP負載均衡技術
負載均衡技術有不少實現方案,有基於DNS域名輪流解析的方法、有基於客戶端調度訪問的方法、有基於應用層系統負載的調度方法,還有基於IP地址的調度方法,在這些負載調度算法中,執行效率最高的是IP負載均衡技術。
LVS的IP負載均衡技術是經過IPVS模塊來實現的,IPVS是LVS集羣系統的核心軟件,它的主要做用是:安裝在Director Server上,同時在Director Server上虛擬出一個IP地址,用戶必須經過這個虛擬的IP地址訪問服務。這個虛擬IP通常稱爲LVS的VIP,即Virtual IP。訪問的請求首先通過VIP到達負載調度器,而後由負載調度器從Real Server列表中選取一個服務節點響應用戶的請求。當用戶的請求到達負載調度器後,調度器如何將請求發送到提供服務的Real Server節點,而Real Server節點如何返回數據給用戶,是IPVS實現的重點技術,IPVS實現負載均衡機制有三種,分別是NAT、TUN和DR(下面會詳細介紹);
負載調度算法
負載調度器是根據各個服務器的負載狀況,動態地選擇一臺Real Server響應用戶請求,那麼動態選擇是如何實現呢,其實也就是咱們這裏要說的負載調度算法,根據不一樣的網絡服務需求和服務器配置,IPVS實現了以下八種負載調度算法:rr、wrr、Wlc、Dh、SH、Lc、Lblc(下面會詳細介紹);
2.2) 高可用性
LVS是一個基於內核級別的應用軟件,所以具備很高的處理性能,後端服務器可運行任何支持TCP/IP的操做系統,包括Linux,各類Unix(如FreeBSD、Sun Solaris、HP Unix等),Mac/OS和Windows NT/2000等。負載調度器可以支持絕大多數的TCP和UDP協議.
2.3) 性能
LVS服務器集羣系統具備良好的伸縮性,可支持幾百萬個併發鏈接。用LVS構架的負載均衡集羣系統具備優秀的處理能力,每一個服務節點的故障不會影響整個系統的正常使用,同時又實現負載的合理均衡,使應用具備超高負荷的服務能力,可支持上百萬個併發鏈接請求。如配置百兆網卡,採用VS/TUN或VS/DR調度技術,整個集羣系統的吞吐量可高達1Gbits/s;如配置千兆網卡,則系統的最大吞吐量可接近10Gbits/s。
2.4)高可靠性
LVS負載均衡集羣軟件已經在企業、學校等行業獲得了很好的普及應用,國內外不少大型的、關鍵性的web站點也都採用了LVS集羣軟件,因此它的可靠性在實踐中獲得了很好的證明。有不少以LVS作的負載均衡系統,運行很長時間,從未作太重新啓動。這些都說明了LVS的高穩定性和高可靠性。
2.5) 適用環境
LVS對前端Director Server目前僅支持Linux和FreeBSD系統,可是支持大多數的TCP和UDP協議,支持TCP協議的應用有:HTTP,HTTPS ,FTP,SMTP,,POP3,IMAP4,PROXY,LDAP,SSMTP等等。支持UDP協議的應用有:DNS,NTP,ICP,視頻、音頻流播放協議等。LVS對Real Server的操做系統沒有任何限制,Real Server可運行在任何支持TCP/IP的操做系統上,包括Linux,各類Unix(如FreeBSD、Sun Solaris、HP Unix等),Mac/OS和Windows等。
2.6) 開源軟件(軟件許可證)
LVS集羣軟件是按GPL(GNU Public License)許可證發行的自由軟件,所以,使用者能夠獲得軟件的源代碼,而且能夠根據本身的須要進行各類修改,可是修改必須是以GPL方式發行。
3) LVS體系結構
LVS集羣負載均衡器接受服務的全部入展客戶端的請求,而後根據調度算法決定哪一個集羣節點來處理回覆客戶端的請求。LVS虛擬服務器的體系以下圖所示,一組服務器經過高速的局域網或者地理分佈的廣域網相互鏈接,在這組服務器以前有一個負載調度器(load balance)。負載調度器負責將客戶的請求調度到真實服務器上。這樣這組服務器集羣的結構對用戶來講就是透明的。客戶訪問集羣系統就如只是訪問一臺高性能,高可用的服務器同樣。客戶程序不受服務器集羣的影響,不作任何修改。
就好比說:咱們去飯店吃飯點菜,客戶只要跟服務員點菜就行。並不須要知道具體他們是怎麼分配工做的,因此他們內部對於咱們來講是透明的。此時這個服務員就會按照必定的規則把他手上的活,分配到其餘人員上去。這個服務員就是負載均衡器(LB)然後面這些真正作事的就是服務器集羣。
LVS結構圖以下:
LVS基本工做過程
客戶請發送向負載均衡服務器發送請求。負載均衡器接受客戶的請求,而後先是根據LVS的調度算法(8種)來決定要將這個請求發送給哪一個節點服務器。而後依據本身的工做模式(3種)來看應該如何把這些客戶的請求如何發送給節點服務器,節點服務器又應該如何來把響應數據包發回給客戶端。
LVS組成
lvs分爲兩個部分,分別是內核模塊和lvs的管理工具。目前來講,centos6及其以上的內核版本已經包括了ipvs的相關模塊了。
從上面可知, 內核支持的ipvs模塊, 上圖中的rr,wrr,lc,wlc,lblc等等都是lvs中調度器的調度算法,根據不一樣的調度算法能夠更好的分配服務,實現負載均衡。而ipvs(ip virtual server):一段代碼工做在內核空間,實現調度。
上圖是ipvsadm (即LVS客戶端管理工具), 主要負責爲ipvs內核框架編寫規則,定義誰是集羣服務,而誰是後端真實的服務器(Real Server)。
4) LVS的實現原理
lvs的原理其實就是利用了Iptables的功能。瞭解防火牆的都知道四表五鏈。防火牆不只僅有放火的功能還有轉發,地址假裝,限流等等功能。
1) 首先,客戶端向調度器(Director Server)發起一個請求,調度器將這個請求發送至內核
2) PREROUTING鏈首先會接收到用戶請求,判斷目標IP肯定是本機IP,將數據包發往INPUT鏈。
3) 當請求達到INPUT鏈上,調度器判斷報文中的目標端口來肯定這個訪問是否是要訪問集羣服務(由於還有可能只是ssh想單純的遠程登陸主機這個主機),若是是訪問的集羣服務,那麼就會強制修改這個包的目標IP
4) POSTROUTING連接收數據包後發現目標IP地址恰好是本身的後端服務器,那麼此時經過選路,將數據包最終發送給後端的服務器
5) LVS的工做原理
LVS 的工做模式分爲4中分別是 NAT,DR,TUN,FULL-NAT。其中作個比較,因爲工做原理的關係的,NAT的配置最爲簡單,可是NAT對調度器的壓力太大了,致使其效率最低,DR和TUN的工做原理差很少,可是DR中,全部主機必須處於同一個物理環境中,而在TUN中,全部主機能夠分佈在不一樣的位置,服務器一個在紐約,一個在深圳。最多應用的是FULL-NAT。
其中的專業術語
DS:Director Server。指的是前端負載均衡器。
RS:Real Server。後端真實的工做服務器。
VIP:向外部直接面向用戶請求,做爲用戶請求的目標的IP地址。
DIP:Director Server IP,主要用於和內部主機通信的IP地址。
RIP:Real Server IP,後端服務器的IP地址。
CIP:Client IP,訪問客戶端的IP地址。
下面介紹LVS經常使用的三種負載均衡模式
1)NAT模式-網絡地址轉換 Virtualserver via Network address translation(VS/NAT)
這個是經過網絡地址轉換的方法來實現調度的。首先調度器(LB)接收到客戶的請求數據包時(請求的目的IP爲VIP),根據調度算法決定將請求發送給哪一個後端的真實服務器(RS)。而後調度就把客戶端發送的請求數據包的目標IP地址及端口改爲後端真實服務器的IP地址(RIP),這樣真實服務器(RS)就可以接收到客戶的請求數據包了。真實服務器響應完請求後,查看默認路由(NAT模式下咱們須要把RS的默認路由設置爲LB服務器。)把響應後的數據包發送給LB,LB再接收到響應包後,把包的源地址改爲虛擬地址(VIP)而後發送回給客戶端。
VS/NAT是一種最簡單的方式,全部的RealServer只須要將本身的網關指向Director便可。客戶端能夠是任意操做系統,但此方式下,一個Director可以帶動的RealServer比較有限。在VS/NAT的方式下,Director也能夠兼爲一臺RealServer。VS/NAT的體系結構如圖所示。
NAT工做模式下,調度過程IP包詳細圖:
NAT模式的以上原理圖簡述:
1) 客戶端請求數據,目標IP爲VIP
2) 請求數據到達LB服務器,LB根據調度算法將目的地址修改成RIP地址及對應端口(此RIP地址是根據調度算法得出的。)並在鏈接HASH表中記錄下這個鏈接。
3) 數據包從LB服務器到達RS服務器webserver,而後webserver進行響應。Webserver的網關必須是LB,而後將數據返回給LB服務器。
4) 收到RS的返回後的數據,根據鏈接HASH表修改源地址VIP&目標地址CIP,及對應端口80.而後數據就從LB出發到達客戶端。
5) 客戶端收到的就只能看到VIP\DIP信息。
NAT模式優缺點:
1) NAT技術將請求的報文和響應的報文都須要經過LB進行地址改寫,所以網站訪問量比較大的時候LB負載均衡調度器有比較大的瓶頸,通常要求最多之能10-20臺節點。
2) 只須要在LB上配置一個公網IP地址就能夠了。
3) 每臺內部的節點服務器的網關地址必須是調度器LB的內網地址。
4) NAT模式支持對IP地址和端口進行轉換。即用戶請求的端口和真實服務器的端口能夠不一致。
再看下面的NAT模式圖
客戶發出請求,發送請求給連接調度器的VIP,調度器將請求報文中的目標Ip地址改成RIP。這樣服務器RealServer將請求的內容發給調度器,調度器再將報文中的源IP地址改成VIP;
1) 當用戶請求到達Director Server,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP爲CIP,目標IP爲VIP;
2) PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈;
3) IPVS比對數據包請求的服務是否爲集羣服務,如果,修改數據包的目標IP地址爲後端服務器IP,而後將數據包發至POSTROUTING鏈。 此時報文的源IP爲CIP,目標IP爲RIP
4) POSTROUTING鏈經過選路,將數據包發送給Real Server;
5) Real Server比對發現目標爲本身的IP,開始構建響應報文發回給Director Server。 此時報文的源IP爲RIP,目標IP爲CIP;
6) Director Server在響應客戶端前,此時會將源IP地址修改成本身的VIP地址,而後響應給客戶端。 此時報文的源IP爲VIP,目標IP爲CIP;
NAT模式特色和注意事項:
1) 很好配置,原理簡單易懂;
2) 因爲調度器的工做量太大,很容易成爲整個集羣系統的瓶頸;
3) RS應該使用私有地址;
4) RS的網關的必須指向DIP;
5) RIP和DIP必須在同一網段內;
6) 請求和響應的報文都得通過Director;在高負載場景中,Director極可能成爲系統性能瓶頸;
7) 支持端口映射;
8) RS可使用任意支持集羣服務的OS;
2)TUN模式-IP隧道模式 Virtual Server via IP Tunneling(VS/TUN)
IP隧道(IP tunneling)是將一個IP報文封裝在另外一個IP報文的技術,這可使得目標爲一個IP地址的數據報文能被封裝和轉發到另外一個IP地址。IP隧道技術亦稱爲IP封裝技術(IP encapsulation)。
IP隧道主要用於移動主機和虛擬私有網絡(Virtual Private Network),在其中隧道都是靜態創建的,隧道一端有一個IP地址,另外一端也有惟一的IP地址。它的鏈接調度和管理與VS/NAT中的同樣,只是它的報文轉發方法不一樣。調度器根據各個服務器的負載狀況,動態地選擇一臺服務器,將請求報文封裝在另外一個IP報文中,再將封裝後的IP報文轉發給選出的服務器; 服務器收到報文後,先將報文解封得到原來目標地址爲 VIP 的報文,服務器發現VIP地址被配置在本地的IP隧道設備上,因此就處理這個請求,而後根據路由表將響應報文直接返回給客戶。
採用NAT模式時,因爲請求和響應的報文必須經過調度器地址重寫,當客戶請求愈來愈多時,調度器處理能力將成爲瓶頸。爲了解決這個問題,調度器把請求的報文經過IP隧道轉發到真實的服務器。真實的服務器將響應處理後的數據直接返回給客戶端。這樣調度器就只處理請求入站報文,因爲通常網絡服務應答數據比請求報文大不少,採用VS/TUN模式後,集羣系統的最大吞吐量能夠提升10倍。
VS/TUN的工做原理流程圖以下所示,它和NAT模式不一樣的是,它在LB和RS之間的傳輸不用改寫IP地址。而是把客戶請求包封裝在一個IP tunnel裏面,而後發送給RS節點服務器,節點服務器接收到以後解開IP tunnel後,進行響應處理。而且直接把包經過本身的外網地址發送給客戶不用通過LB服務器。
TUN模式下的以上原理圖過程簡述:
1)客戶請求數據包,目標地址VIP發送到LB上;
2)LB接收到客戶請求包,進行IP Tunnel封裝。即在原有的包頭加上IP Tunnel的包頭。而後發送出去;
3)RS節點機器根據IP Tunnel包頭信息 (此時就又一種邏輯上的隱形隧道,只有LB和RS之間懂)收到請求包,而後解開IP Tunnel包頭信息,獲得客戶的請求包並進行響應處理。
4)響應處理完畢以後,RS服務器使用本身的出公網的線路,將這個響應數據包發送給客戶端。源IP地址仍是VIP地址。(RS節點服務器須要在本地迴環接口配置VIP);
其實TUN模式和下面的DR模式差很少,可是比DR多了一個隧道技術以支持realserver不在同一個物理環境中。就是realserver一個在北京,一個工做在上海。在原有的IP報文外再次封裝多一層IP首部,內部IP首部(源地址爲CIP,目標IIP爲VIP),外層IP首部(源地址爲DIP,目標IP爲RIP. 再看下面的TUN模式圖:
1) 當用戶請求到達Director Server,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP爲CIP,目標IP爲VIP 。
2) PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈;
3) IPVS比對數據包請求的服務是否爲集羣服務,如果,在請求報文的首部再次封裝一層IP報文,封裝源IP爲爲DIP,目標IP爲RIP。而後發至POSTROUTING鏈。 此時源IP爲DIP,目標IP爲RIP;
4) POSTROUTING鏈根據最新封裝的IP報文,將數據包發至RS(由於在外層封裝多了一層IP首部,因此能夠理解爲此時經過隧道傳輸)。 此時源IP爲DIP,目標IP爲RIP;
5) RS接收到報文後發現是本身的IP地址,就將報文接收下來,拆除掉最外層的IP後,會發現裏面還有一層IP首部,並且目標是本身的lo接口VIP,那麼此時RS開始處理此請求,處理完成以後,經過lo接口送給eth0網卡,而後向外傳遞。 此時的源IP地址爲VIP,目標IP爲CIP;
6) 響應報文最終送達至客戶端;
LVS-TUN (ip隧道) 模式特色和注意事項
1) RIP、VIP、DIP全是公網地址
2) RS的網關不會也不可能指向DIP
3) 不支持端口映射
4) RS的系統必須支持隧道
3)DR模式-直接路由模式 Virtual Server via Direct Routing(VS/DR)
DR模式也就是用直接路由技術實現虛擬服務器。它的鏈接調度和管理與VS/NAT和VS/TUN中的同樣,但它的報文轉發方法又有不一樣,VS/DR經過改寫請求報文的MAC地址,將請求發送到Real Server,而Real Server將響應直接返回給客戶,免去了VS/TUN中的IP隧道開銷。這種方式是三種負載調度機制中性能最高最好的,可是必需要求Director Server與Real Server都有一塊網卡連在同一物理網段上。
Director和RealServer必需在物理上有一個網卡經過不間斷的局域網相連。 RealServer上綁定的VIP配置在各自Non-ARP的網絡設備上(如lo或tunl),Director的VIP地址對外可見,而RealServer的VIP對外是不可見的。RealServer的地址便可以是內部地址,也能夠是真實地址。
DR模式是經過改寫請求報文的目標MAC地址,將請求發給真實服務器的,而真實服務器響應後的處理結果直接返回給客戶端用戶。同TUN模式同樣,DR模式能夠極大的提升集羣系統的伸縮性。並且DR模式沒有IP隧道的開銷,對集羣中的真實服務器也沒有必要必須支持IP隧道協議的要求。可是要求調度器LB與真實服務器RS都有一塊網卡鏈接到同一物理網段上,必須在同一個局域網環境。
DR模式是互聯網使用比較多的一種模式,DR模式原理圖以下:
DR模式以上原理過程簡述:
VS/DR模式的工做流程圖如上圖所示,它的鏈接調度和管理與NAT和TUN中的同樣,它的報文轉發方法和前兩種不一樣。DR模式將報文直接路由給目標真實服務器。在DR模式中,調度器根據各個真實服務器的負載狀況,鏈接數多少等,動態地選擇一臺服務器,不修改目標IP地址和目標端口,也不封裝IP報文,而是將請求報文的數據幀的目標MAC地址改成真實服務器的MAC地址。而後再將修改的數據幀在服務器組的局域網上發送。由於數據幀的MAC地址是真實服務器的MAC地址,而且又在同一個局域網。那麼根據局域網的通信原理,真實復位是必定可以收到由LB發出的數據包。真實服務器接收到請求數據包的時候,解開IP包頭查看到的目標IP是VIP。(此時只有本身的IP符合目標IP纔會接收進來,因此咱們須要在本地的迴環藉口上面配置VIP。
另外: 因爲網絡接口都會進行ARP廣播響應,但集羣的其餘機器都有這個VIP的lo接口,都響應就會衝突。因此咱們須要把真實服務器的lo接口的ARP響應關閉掉。)而後真實服務器作成請求響應,以後根據本身的路由信息將這個響應數據包發送回給客戶,而且源IP地址仍是VIP。
其實整個DR模式都是停留在第二層的數據鏈路層, 直接修改MAC。實現報文的轉發。再看下面的DR模式圖:
1) 當用戶請求到達Director Server,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP爲CIP,目標IP爲VIP;
2) PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈;
3) IPVS比對數據包請求的服務是否爲集羣服務,如果,將請求報文中的源MAC地址修改成DIP的MAC地址,將目標MAC地址修改RIP的MAC地址,而後將數據包發至POSTROUTING鏈。 此時的源IP和目的IP均未修改,僅修改了源MAC地址爲DIP的MAC地址,目標MAC地址爲RIP的MAC地址;
4) 因爲DS和RS在同一個網絡中,因此是經過二層來傳輸。POSTROUTING鏈檢查目標MAC地址爲RIP的MAC地址,那麼此時數據包將會發至Real Server;
5) 響應報文最終送達至客戶端;
LVS-DR模式特色和注意事項
1) 在前端路由器作靜態地址路由綁定,將對於VIP的地址僅路由到Director Server
2) arptables:在arp的層次上實如今ARP解析時作防火牆規則,過濾RS響應ARP請求。修改RS上內核參數(arp_ignore和arp_announce)將RS上的VIP配置在網卡接口的別名上,並限制其不能響應對VIP地址解析請求。
3) RS可使用私有地址;但也可使用公網地址,此時能夠直接經過互聯網連入RS以實現配置、監控等;
4) RS的網關必定不能指向DIP;
5) RS跟Dirctory要在同一物理網絡內(不能由路由器分隔);
6) 請求報文通過Directory,但響應報文必定不通過Director
7) 不支持端口映射;
8) RS可使用大多數的操做系統;
DR模式小結:
1)經過在調度器LB上修改數據包的目的MAC地址實現轉發。注意源地址仍然是CIP,目的地址仍然是VIP地址。
2)請求的報文通過調度器,而RS響應處理後的報文無需通過調度器LB,所以併發訪問量大時使用效率很高(和NAT模式比)
3)由於DR模式是經過MAC地址改寫機制實現轉發,所以全部RS節點和調度器LB只能在一個局域網裏面
4)RS主機須要綁定VIP地址在LO接口上(防止IP衝突),而且須要配置ARP機制。
5)RS節點的默認網關不須要配置成LB,而是直接配置爲上級路由的網關,能讓RS直接出網就能夠。
6)因爲DR模式的調度器僅作MAC地址的改寫,因此調度器LB就不能改寫目標端口,那麼RS服務器就得使用和VIP相同的端口提供服務。
三種負載均衡方式簡單比較:
1)NAT模式-網絡地址轉換
VS/NAT 的優勢是服務器能夠運行任何支持TCP/IP的操做系統,它只須要一個IP地址配置在調度器上,服務器組能夠用私有的IP地址。缺點是它的伸縮能力有限,當服務器結點數目升到20時,調度器自己有可能成爲系統的新瓶頸,由於在VS/NAT中請求和響應報文都須要經過負載調度器。若是負載調度器成爲系統新的瓶頸,能夠有三種方法解決這個問題:混合方法、VS/TUN和 VS/DR。在DNS混合集羣系統中,有若干個VS/NAT負調度器,每一個負載調度器帶本身的服務器集羣,同時這些負載調度器又經過RR-DNS組成簡單的域名。但VS/TUN和VS/DR是提升系統吞吐量的更好方法。對於那些將IP地址或者端口號在報文數據中傳送的網絡服務,須要編寫相應的應用模塊來轉換報文數據中的IP地址或者端口號。這會帶來實現的工做量,同時應用模塊檢查報文的開銷會下降系統的吞吐率。
2)TUN模式-IP隧道模式
在TUN 的集羣系統中,負載調度器只將請求調度到不一樣的後端服務器,後端服務器將應答的數據直接返回給用戶。這樣負載調度器就能夠處理大量的請求,它甚至能夠調度百臺以上的服務器(同等規模的服務器),而它不會成爲系統的瓶頸。即便負載調度器只有100Mbps的全雙工網卡,整個系統的最大吞吐量可超過 1Gbps。因此,VS/TUN能夠極大地增長負載調度器調度的服務器數量。VS/TUN調度器能夠調度上百臺服務器,而它自己不會成爲系統的瓶頸,能夠用來構建高性能的超級服務器。VS/TUN技術對服務器有要求,即全部的服務器必須支持"IP Tunneling"或者"IP Encapsulation"協議。目前,VS/TUN的後端服務器主要運行Linux操做系統,咱們沒對其餘操做系統進行測試。由於"IP Tunneling"正成爲各個操做系統的標準協議,因此VS/TUN應該會適用運行其餘操做系統的後端服務器。
3)DR模式
跟VS/TUN方法同樣,VS/DR調度器只處理客戶到服務器端的鏈接,響應數據能夠直接從獨立的網絡路由返回給客戶。這能夠極大地提升LVS集羣系統的伸縮性。跟VS/TUN相比,這種方法沒有IP隧道的開銷,可是要求負載調度器與實際服務器都有一塊網卡連在同一物理網段上,服務器網絡設備(或者設備別名)不做ARP響應,或者能將報文重定向(Redirect)到本地的Socket端口上。
6) LVS負載均衡調度算法
VS的調度算法決定了如何在集羣節點之間分佈工做負荷。當director調度器收到來自客戶端訪問VIP的上的集羣服務的入站請求時,director調度器必須決定哪一個集羣節點應該
處理請求。
Director調度器用的調度方法基本分爲兩類 (以下所列, LVS總共有10種調度算法, 經常使用的也就四種調度算法, 下面會說到):
靜態調度算法:rr,wrr,dh,sh
動態調度算法:wlc,lc,lblc,lblcr, sed, nq
靜態調度 (也就是固定調度算法)的4種算法:
rr(輪詢)
輪詢調度:這種是最簡單的調度算法,就是將請求A一個,B一個,A一個,B一個 ...... 循環的發。就算A主機掛掉了,調度器仍是會將請求發送到A。十分均衡。
wrr(權重, 即加權輪詢)
加權輪詢調度:這種算法是在rr基礎上實現的,只不過加了權重,權重範圍爲1-100,假設A的服務器性能好,就給A的權重設置的高一點,設爲2,而B主機是1。這樣就實現A二個,B一個,A二個,B一個 ...... 循環的發。這樣照顧到了服務器性能。
sh(源地址哈希)
源地址散列:主要是實現將此前的session(會話)綁定。將此前客戶的源地址做爲散列鍵,從靜態的散列表中找出對應的服務器,只要目標服務器是沒有超負荷的就將請求發送過去。就是說某客戶訪問過A,如今這個客戶又來了,因此客戶請求會被髮送到服務過他的A主機。
dh(目的地址哈希)
目的地址散列:以目的地址爲關鍵字查找一個靜態hash表來得到須要的RS。以目標地址爲標準挑選。 功能是和sh近似的,但應用場景不一樣; 舉個dh調度算法的例子:假設1號客戶訪問了web集羣的一個動態頁面,調度器將請求轉發個A服務器,A服務器的PHP將這個動態請求運行了一遍,生成了緩存並回應1號客戶。這下2號客戶也訪問了這個動態頁面,調度器應該將請求發給A。畢竟A已經跑過這段程序了,有緩存,對吧。因此這既是dh算法)
動態調度算法,動態算法與靜態算法最大的區別就是動態算法考慮了服務器的壓力。
活動連接(active):客戶與服務器創建鏈接而且有數據傳送
非活動連接(inactive):只是創建鏈接,沒有數據傳送,沒有斷開鏈接
動態調度的6種算法
lc(最少連接)
最少鏈接調度:這種算法是看A,和B的主機誰的鏈接少,請求就發給誰。
簡單算法:active*256+inactive (誰小發給誰)
wlc(加權最少連接)LVS的理想算法
加權最少連接:這種算法就是比lc多了一個加權。
簡單算法:( active*256+inactive )/weight (誰小就發給誰)
sed(最短時間望延遲)
基於wlc算法,假設A,B的權重分別是1,2 。而A的連接數爲1,B的連接數爲2 。這樣的話,用wlc算法得出的結果同樣,而明顯B的權重大,B的能力較強。用sed算法的話,就能夠避免wlc出現的問題。
簡單算法:(active+1)*256/weight (活動的鏈接數+1)*256/除以權重 誰小發給誰
A:(1+1)/1
B:(2+1)/2 (B小,交給B)
nq(不用排隊)
基於sed算法:在sed的基礎上,若誰的連接數爲0,直接將請求發送給它!
LBLC(基於局部性的最少鏈接)相似於dh,目標地址hash
這個算法主要用於Cache集羣系統,由於Cache集羣的中客戶請求報文的目標IP地址的變化,將相同的目標URL地址請求調度到同一臺服務器,來提升服務器的訪問的局部性和Cache命中率。從而調整整個集羣的系統處理能力。可是,若是realserver的負載處於一半負載,就用最少連接算法,將請求發送給活動連接少的主機。
LBLCR(帶複製的基於局部性的最少連接)
該算法首先是基於最少連接的,當一個新請求收到後,必定會將請求發給最少鏈接的那臺主機的。但這樣又破壞了cache命中率。但這個算法中,集羣服務是cache共享的,假設A的PHP跑了一遍,獲得緩存。但其餘realserver能夠去A那裏拿緩存,這是種緩存複製機制。
負載調度器是根據各個服務器的負載狀況,動態地選擇一臺Real Server響應用戶請求,那麼動態選擇是如何實現呢,其實也就是這裏要說的負載調度算法,根據不一樣的網絡服務需求和服務器配置,IPVS實現瞭如上的十種負載調度算法,下面詳細講述LVS最經常使用的四種調度算法:
- 輪叫調度(Round Robin)
"輪叫"調度也叫1:1調度,調度器經過"輪叫"調度算法將外部用戶請求按順序1:1的分配到集羣中的每一個Real Server上,這種算法平等地對待每一臺Real Server,而無論服務器
上實際的負載情況和鏈接狀態。
- 加權輪叫調度(Weighted Round Robin)
"加權輪叫"調度算法是根據Real Server的不一樣處理能力來調度訪問請求。能夠對每臺Real Server設置不一樣的調度權值,對於性能相對較好的Real Server能夠設置較高的權值,而對於處理能力較弱的Real Server,能夠設置較低的權值,這樣保證了處理能力強的服務器處理更多的訪問流量。充分合理的利用了服務器資源。同時,調度器還能夠自動查詢Real Server的負載狀況,並動態地調整其權值。
- 最少連接調度(Least Connections)
"最少鏈接"調度算法動態地將網絡請求調度到已創建的連接數最少的服務器上。若是集羣系統的真實服務器具備相近的系統性能,採用"最小鏈接"調度算法能夠較好地均衡負載。
- 加權最少連接調度(Weighted Least Connections)
"加權最少連接調度"是"最少鏈接調度"的超集,每一個服務節點能夠用相應的權值表示其處理能力,而系統管理員能夠動態的設置相應的權值,缺省權值爲1,加權最小鏈接調度在分配新鏈接請求時儘量使服務節點的已創建鏈接數和其權值成正比。
LVS調度算法的生產環境選型:
1)通常的網絡服務,如http,nginx,mysql等經常使用的LVS調度算法爲:
a. 基本輪詢調度rr
b. 加權最小鏈接調度wlc
c. 加權輪詢調度wrc
2)基於局部性的最小鏈接lblc和帶複製的給予局部性最小鏈接lblcr主要適用於web cache和DB cache;
3)源地址散列調度SH和目標地址散列調度DH能夠結合使用在防火牆集羣中,能夠保證整個系統的出入口惟一;
其實對於LVS的理解,主要部分仍是在於3種工做方式和8種調度算法,實際這些算法的適用範圍不少,工做中最好參考內核中的鏈接調度算法的實現原理,而後根據具體的業務需求合理的選型。
LVS的 Session持久機制
1)session綁定:始終將同一個請求者的鏈接定向至同一個rs(第一次請求時仍由調度方法選擇);沒有容錯能力,有損均衡效果;
2)session複製:在rs之間同步session,所以,每一個RS持集羣中全部的session;對於大規模集羣環境不適用;
3)session共享或服務器機制:利用單獨部署的服務器來統一管理session;
LVS使用中特別須要注意事項:
1) 關於時間同步:各節點間的時間誤差不大於1s,建議使用統一的ntp服務器進行更新時間;
2) DR模型中的VIP的MAC廣播問題:
在DR模型中,因爲每一個節點均要配置VIP,所以存在VIP的MAC廣播問題,在如今的linux內核中,都提供了相應kernel 參數對MAC廣播進行管理,具體以下:
arp_ignore: 定義接收到ARP請求時的響應級別;
0:只要本地配置的有相應地址,就給予響應;
1:僅在請求的目標地址配置在到達的接口上的時候,纔給予響應;DR模型使用
arp_announce:定義將本身地址向外通告時的通告級別;
0:將本地任何接口上的任何地址向外通告;
1:試圖僅向目標網絡通告與其網絡匹配的地址;
2:僅向與本地接口上地址匹配的網絡進行通告;DR模型使用
五. LVS安裝和簡單管理 (ipvsadm)
LVS全稱爲Linux Virtual Server,工做在ISO模型中的第四層,因爲其工做在第四層,所以與iptables相似,必須工做在內核空間上。所以lvs與iptables同樣,是直接工做在內核中的,叫ipvs,主流linux發行版默認都已經集成了ipvs,所以用戶只需安裝一個管理工具ipvsadm便可, ipvsadm是LVS在應用層的管理命令,能夠經過這個命令去管理LVS的配置。
1) 安裝LVS
先安裝依賴 [root@localhost ~]# yum install -y libnl* popt* 查看是否加載lvs模塊 [root@localhost ~]# modprobe -l |grep ipvs kernel/net/netfilter/ipvs/ip_vs.ko kernel/net/netfilter/ipvs/ip_vs_rr.ko kernel/net/netfilter/ipvs/ip_vs_wrr.ko kernel/net/netfilter/ipvs/ip_vs_lc.ko kernel/net/netfilter/ipvs/ip_vs_wlc.ko kernel/net/netfilter/ipvs/ip_vs_lblc.ko kernel/net/netfilter/ipvs/ip_vs_lblcr.ko kernel/net/netfilter/ipvs/ip_vs_dh.ko kernel/net/netfilter/ipvs/ip_vs_sh.ko kernel/net/netfilter/ipvs/ip_vs_sed.ko kernel/net/netfilter/ipvs/ip_vs_nq.ko kernel/net/netfilter/ipvs/ip_vs_ftp.ko kernel/net/netfilter/ipvs/ip_vs_pe_sip.ko 下載並安裝LVS [root@localhost ~]# cd /usr/local/src/ [root@localhost src]# unlink /usr/src/linux [root@localhost src]# ln -s /usr/src/kernels/2.6.32-431.5.1.el6.x86_64/ /usr/src/linux [root@localhost src]# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz [root@localhost src]# tar -zvxf ipvsadm-1.26.tar.gz [root@localhost src]# cd ipvsadm-1.26 [root@localhost ipvsadm-1.26]# make && make install LVS安裝完成,查看LVS集羣 [root@localhost ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
2) ipvsadm基本命令說明
1) ipvsadm的基本用法: # ipvsadm COMMAND [protocol] service address [scheduling-method] [persistence options] # ipvsadm command [protocol] service address server-address [packet-forwarding-method] [weight options] 第一條命令用於向LVS系統中添加一個用於負載均衡的virtual server(VS); 第二條命令用來修改已經存在的VS的配置,service address用來指定涉及的虛擬服務即虛擬地址,server-address指定涉及的真實地址。 2) ipvsadm的幫助信息 [root@localhost ~]# ipvsadm --help ipvsadm v1.26 2008/5/15 (compiled with popt and IPVS v1.2.1) Usage: ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] ipvsadm -D -t|u|f service-address ipvsadm -C ipvsadm -R ipvsadm -S [-n] ipvsadm -a|e -t|u|f service-address -r server-address [options] ipvsadm -d -t|u|f service-address -r server-address ipvsadm -L|l [options] ipvsadm -Z [-t|u|f service-address] ipvsadm --set tcp tcpfin udp ipvsadm --start-daemon state [--mcast-interface interface] [--syncid sid] ipvsadm --stop-daemon state ipvsadm -h Commands: Either long or short options are allowed. --add-service -A add virtual service with options --edit-service -E edit virtual service with options --delete-service -D delete virtual service --clear -C clear the whole table --restore -R restore rules from stdin --save -S save rules to stdout --add-server -a add real server with options --edit-server -e edit real server with options --delete-server -d delete real server --list -L|-l list the table --zero -Z zero counters in a service or all services --set tcp tcpfin udp set connection timeout values --start-daemon start connection sync daemon --stop-daemon stop connection sync daemon --help -h display this help message Options: --tcp-service -t service-address service-address is host[:port] --udp-service -u service-address service-address is host[:port] --fwmark-service -f fwmark fwmark is an integer greater than zero --ipv6 -6 fwmark entry uses IPv6 --scheduler -s scheduler one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq, the default scheduler is wlc. --pe engine alternate persistence engine may be sip, not set by default. --persistent -p [timeout] persistent service --netmask -M netmask persistent granularity mask --real-server -r server-address server-address is host (and port) --gatewaying -g gatewaying (direct routing) (default) --ipip -i ipip encapsulation (tunneling) --masquerading -m masquerading (NAT) --weight -w weight capacity of real server --u-threshold -x uthreshold upper threshold of connections --l-threshold -y lthreshold lower threshold of connections --mcast-interface interface multicast interface for connection sync --syncid sid syncid for connection sync (default=255) --connection -c output of current IPVS connections --timeout output of timeout (tcp tcpfin udp) --daemon output of daemon information --stats output of statistics information --rate output of rate information --exact expand numbers (display exact values) --thresholds output of thresholds information --persistent-conn output of persistent connection info --nosort disable sorting output of service/server entries --sort does nothing, for backwards compatibility --ops -o one-packet scheduling --numeric -n numeric output of addresses and ports 命令: -A, --add-service: 添加一個集羣服務. 即爲ipvs虛擬服務器添加一個虛擬服務,也就是添加一個須要被負載均衡的虛擬地址。虛擬地址須要是ip地址,端口號,協議的形式。 -E, --edit-service: 修改一個虛擬服務。 -D, --delete-service: 刪除一個虛擬服務。即刪除指定的集羣服務; -C, --clear: 清除全部虛擬服務。 -R, --restore: 從標準輸入獲取ipvsadm命令。通常結合下邊的-S使用。 -S, --save: 從標準輸出輸出虛擬服務器的規則。能夠將虛擬服務器的規則保存,在之後經過-R直接讀入,以實現自動化配置。 -a, --add-server: 爲虛擬服務添加一個real server(RS) -e, --edit-server: 修改RS -d, --delete-server: 刪除 -L, -l, --list: 列出虛擬服務表中的全部虛擬服務。能夠指定地址。添加-c顯示鏈接表。 -Z, --zero: 將全部數據相關的記錄清零。這些記錄通常用於調度策略。 --set tcp tcpfin udp: 修改協議的超時時間。 --start-daemon state: 設置虛擬服務器的備服務器,用來實現主備服務器冗餘。(注:該功能只支持ipv4) --stop-daemon: 中止備服務器。 -h, --help: 幫助。 參數: 如下參數能夠接在上邊的命令後邊。 -t, --tcp-service service-address: 指定虛擬服務爲tcp服務。service-address要是host[:port]的形式。端口是0表示任意端口。若是須要將端口設置爲0,還須要加上-p選項(持久鏈接)。 -u, --udp-service service-address: 使用udp服務,其餘同上。 -f, --fwmark-service integer: 用firewall mark取代虛擬地址來指定要被負載均衡的數據包,能夠經過這個命令實現把不一樣地址、端口的虛擬地址整合成一個虛擬服務,可讓虛擬服務器同時截獲處理去往多個不一樣地址的數據包。fwmark能夠經過iptables命令指定。若是用在ipv6須要加上-6。 -s, --scheduler scheduling-method: 指定調度算法,默認是wlc。調度算法能夠指定如下8種:rr(輪詢),wrr(權重),lc(最後鏈接),wlc(權重),lblc(本地最後鏈接),lblcr(帶複製的本地最後鏈接),dh(目的地址哈希),sh(源地址哈希),sed(最小指望延遲),nq(永不排隊) -p, --persistent [timeout]: 設置持久鏈接,這個模式可使來自客戶的多個請求被送到同一個真實服務器,一般用於ftp或者ssl中。 -M, --netmask netmask: 指定客戶地址的子網掩碼。用於將同屬一個子網的客戶的請求轉發到相同服務器。 -r, --real-server server-address: 爲虛擬服務指定數據能夠轉發到的真實服務器的地址。能夠添加端口號。若是沒有指定端口號,則等效於使用虛擬地址的端口號。 [packet-forwarding-method]: 此選項指定某個真實服務器所使用的數據轉發模式。須要對每一個真實服務器分別指定模式。 -g, --gatewaying: 使用網關(即直接路由),此模式是默認模式。 -i, --ipip: 使用ipip隧道模式。 -m, --masquerading: 使用NAT模式。 -w, --weight weight: 設置權重。權重是0~65535的整數。若是將某個真實服務器的權重設置爲0,那麼它不會收到新的鏈接,可是已有鏈接還會繼續維持(這點和直接把某個真實服務器刪除時不一樣的)。 -x, --u-threshold uthreshold: 設置一個服務器能夠維持的鏈接上限。0~65535。設置爲0表示沒有上限。 -y, --l-threshold lthreshold: 設置一個服務器的鏈接下限。當服務器的鏈接數低於此值的時候服務器才能夠從新接收鏈接。若是此值未設置,則當服務器的鏈接數連續三次低於uthreshold時服務器才能夠接收到新的鏈接。(PS:筆者覺得此設定多是爲了防止服務器在可否接收鏈接這兩個狀態上頻繁變換) --mcast-interface interface: 指定使用備服務器時候的廣播接口。 --syncid syncid:指定syncid, 一樣用於主備服務器的同步。 如下選項用於list命令: -c, --connection: 列出當前的IPVS鏈接。 --timeout: 列出超時 --daemon: --stats: 狀態信息 --rate: 傳輸速率 --thresholds: 列出閾值 --persistent-conn: 堅持鏈接 --sor: 把列表排序。 --nosort: 不排序 -n, --numeric: 不對ip地址進行dns查詢 --exact: 單位 -6: 若是fwmark用的是ipv6地址須要指定此選項。 =========其餘注意事項========= 若是使用IPv6地址,須要在地址兩端加上"[]"。例如:ipvsadm -A -t [2001:db8::80]:80 -s rr 能夠經過設置如下虛擬文件的值來防護DoS攻擊: /proc/sys/net/ipv4/vs/drop_entry /proc/sys/net/ipv4/vs/drop_packet /proc/sys/net/ipv4/vs/secure_tcp
3) ipvsadm 舉例說明
一. LVS集羣服務管理類舉例 1) 添加:-A # ipvsadm -A -t|u|f service-address [-s scheduler] 舉例1: 添加集羣 [root@lvs ~]# ipvsadm -A -t 172.16.60.111:80 -s wlc 2) 修改:-E # ipvsadm -E -t|u|f service-address [-s scheduler] 舉例2: 修改集羣 (修改集羣的調度算法) [root@lvs ~]# ipvsadm -E -t 172.16.60.111:80 -s wrr 3) 刪除:-D # ipvsadm -D -t|u|f service-address 舉例3: 刪除集羣 [root@lvs ~]# ipvsadm -D -t 172.16.60.111:80 二. 管理LVS集羣中的RealServer舉例 1) 添加RS : -a # ipvsadm -a -t|u|f service-address -r server-address [-g|i|m] [-w weight] 舉例1: 往VIP資源爲172.16.60.111的集羣服務裏添加兩個realserver [root@lvs ~]# ipvsadm -a -t 172.16.60.111:80 -r 172.16.60.120 –g -w 5 [root@lvs ~]# ipvsadm -a -t 172.16.60.111:80 -r 172.16.60.130 –g -w 10 2) 修改RS : -e # ipvsadm -e -t|u|f service-address -r server-address [-g|i|m] [-w weight] 舉例2: 修改172.16.60.111集羣服務裏172.16.60.120這個realserver的權重爲3 [root@lvs ~]# ipvsadm -e -t 172.16.60.111:80 -r 172.16.60.120 –g -w 3 3) 刪除RS : -d # ipvsadm -d -t|u|f service-address -r server-address 舉例3: 刪除172.16.60.111集羣服務裏172.16.60.120這個realserver [root@lvs ~]# ipvsadm -d -t 172.16.60.111:80 -r 172.16.60.120 三. 管理LVS集羣服務的查看 # ipvsadm -L|l [options] options能夠爲: -n:數字格式顯示 --stats 統計信息 --rate:統計速率 --timeout:顯示tcp、tcpinfo、udp的會話超時時長 -c:鏈接客戶端數量 舉例1: 查看lvs集羣轉發狀況 [root@lvs ~]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.60.111:80 wlc persistent 600 -> 172.16.60.205:80 Route 1 0 0 -> 172.16.60.206:80 Route 1 0 0 舉例2: 查看lvs集羣的鏈接狀態 [root@lvs ~]# ipvsadm -l --stats IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes -> RemoteAddress:Port TCP 172.16.60.111 4 6 0 308 0 -> 172.16.60.205:80 0 0 0 0 0 -> 172.16.60.206:80 4 6 0 308 0 說明: Conns (connections scheduled) 已經轉發過的鏈接數 InPkts (incoming packets) 入包個數 OutPkts (outgoing packets) 出包個數 InBytes (incoming bytes) 入流量(字節) OutBytes (outgoing bytes) 出流量(字節) 舉例3: 查看lvs集羣的速率 [root@lvs ~]# ipvsadm -l --rate Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS -> RemoteAddress:Port TCP 172.16.60.111 0 0 0 0 0 -> 172.16.60.205:80 0 0 0 0 0 -> 172.16.60.206:80 0 0 0 0 0 說明: CPS (current connection rate) 每秒鏈接數 InPPS (current in packet rate) 每秒的入包個數 OutPPS (current out packet rate) 每秒的出包個數 InBPS (current in byte rate) 每秒入流量(字節) OutBPS (current out byte rate) 每秒入流量(字節) 4) 清除計數器: # ipvsadm -Z [-t|u|f service-address] 5) 清除規則 (刪除全部集羣服務), 該命令與iptables的-F功能相似,執行後會清除全部規則: # ipvsadm -C 6) 保存規則: # ipvsadm -S > /path/to/somefile # ipvsadm-save > /path/to/somefile # ipvsadm-restore < /path/to/somefile ======================================================================================== 一. 使用NAT模式 1) 添加vip地址: 172.16.60.111 [root@lvs ~]# /sbin/ifconfig eth0:0 172.16.60.111 broadcast 172.16.60.111 netmask 255.255.255.255 up [root@lvs ~]# /sbin/route add -host 172.16.60.111 dev eth0:0 [root@lvs ~]# /sbin/arping -I eth0 -c 5 -s 172.16.60.111 172.16.60.1 >/dev/null 2>&1 2) 好比添加地址爲172.16.60.111:80的lvs集羣服務,指定調度算法爲輪轉。 [root@lvs ~]# ipvsadm -A -t 172.16.60.111:80 -s rr 1) 添加真實服務器,指定傳輸模式爲NAT [root@lvs ~]# ipvsadm -a -t 172.16.60.111:80 -r 172.16.60.180:80 -m [root@lvs ~]# ipvsadm -a -t 172.16.60.111:80 -r 172.16.60.181:80 -m [root@lvs ~]# ipvsadm -a -t 172.16.60.111:80 -r 172.16.60.182:80 -m NAT模式是lvs的三種模式中最簡單的一種。此種模式下只須要保證調度服務器與真實服務器互通就能夠運行。 二. 使用DR模式 1) 對於DR模式首先要配置真實服務器: [root@rs-01 ~]# vim /etc/init.d/realserver #!/bin/sh VIP=172.16.60.111 . /etc/rc.d/init.d/functions case "$1" in # 禁用本地的ARP請求、綁定本地迴環地址 start) /sbin/ifconfig lo down /sbin/ifconfig lo up echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce /sbin/sysctl -p >/dev/null 2>&1 /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev lo:0 echo "LVS-DR real server starts successfully.\n" ;; stop) /sbin/ifconfig lo:0 down /sbin/route del $VIP >/dev/null 2>&1 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce echo "LVS-DR real server stopped.\n" ;; status) isLoOn=`/sbin/ifconfig lo:0 | grep "$VIP"` isRoOn=`/bin/netstat -rn | grep "$VIP"` if [ "$isLoON" == "" -a "$isRoOn" == "" ]; then echo "LVS-DR real server has run yet." else echo "LVS-DR real server is running." fi exit 3 ;; *) echo "Usage: $0 {start|stop|status}" exit 1 esac exit 0 在真實服務器上執行上面的腳本 [root@rs-01 ~]# chmod 755 /etc/init.d/realserver [root@rs-01 ~]# /etc/init.d/realserver start 上面腳本執行後, 真實服務器上就在lo:0設備上配置了vip地址, 可使用"ifconfig"命令查看 2) 在LVS機器上接着添加ipvs規則: 先添加vip地址: 172.16.60.111 [root@lvs ~]# /sbin/ifconfig eth0:0 172.16.60.111 broadcast 172.16.60.111 netmask 255.255.255.255 up [root@lvs ~]# /sbin/route add -host 172.16.60.111 dev eth0:0 [root@lvs ~]# /sbin/arping -I eth0 -c 5 -s 172.16.60.111 172.16.60.1 >/dev/null 2>&1 添加地址爲172.16.60.111:80的lvs集羣服務,指定調度算法爲輪轉。 [root@lvs ~]# ipvsadm -A -t 172.16.60.111:80 -s rr 添加真實服務器,指定傳輸模式爲DR [root@lvs ~]# ipvsadm -a -t 172.16.60.111:80 -r 172.16.60.180:80 -g [root@lvs ~]# ipvsadm -a -t 172.16.60.111:80 -r 172.16.60.181:80 -g [root@lvs ~]# ipvsadm -a -t 172.16.60.111:80 -r 172.16.60.182:80 -g 注意:此處的例子中客戶、調度服務器、真實服務器都是位於同一網段的
4) 小案例分析
172.168.60.208 做爲LVS負載代理層, 代理後端兩個web節點172.16.60.205和172.16.60.206的80端口.
VIP資源爲172.16.60.119
1) 在172.16.60.208服務器上安裝LVS (安裝方式如上) [root@lvs-208 ~]# yum install -y libnl* popt* [root@lvs-208 ~]# cd /usr/local/src/ [root@lvs-208 src]# unlink /usr/src/linux [root@lvs-208 src]# ln -s /usr/src/kernels/2.6.32-431.5.1.el6.x86_64/ /usr/src/linux [root@lvs-208 src]# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz [root@lvs-208 src]# tar -zvxf ipvsadm-1.26.tar.gz [root@lvs-208 src]# cd ipvsadm-1.26 [root@lvs-208 ipvsadm-1.26]# make && make install [root@lvs-208 ipvsadm-1.26]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn 2) 在後端兩個web節點(realserver)上配置vip (連個realserver節點操做同樣) [root@rs-205 ~]# vim /etc/init.d/realserver #!/bin/sh VIP=172.16.60.119 . /etc/rc.d/init.d/functions case "$1" in # 禁用本地的ARP請求、綁定本地迴環地址 start) /sbin/ifconfig lo down /sbin/ifconfig lo up echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce /sbin/sysctl -p >/dev/null 2>&1 /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev lo:0 echo "LVS-DR real server starts successfully.\n" ;; stop) /sbin/ifconfig lo:0 down /sbin/route del $VIP >/dev/null 2>&1 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce echo "LVS-DR real server stopped.\n" ;; status) isLoOn=`/sbin/ifconfig lo:0 | grep "$VIP"` isRoOn=`/bin/netstat -rn | grep "$VIP"` if [ "$isLoON" == "" -a "$isRoOn" == "" ]; then echo "LVS-DR real server has run yet." else echo "LVS-DR real server is running." fi exit 3 ;; *) echo "Usage: $0 {start|stop|status}" exit 1 esac exit 0 執行腳本 [root@rs-205 ~]# chmod 755 /etc/init.d/realserver [root@rs-205 ~]# /etc/init.d/realserver start LVS-DR real server starts successfully.\n [root@rs-205 ~]# ifconfig ...... lo:0 Link encap:Local Loopback inet addr:172.16.60.119 Mask:255.255.255.255 UP LOOPBACK RUNNING MTU:65536 Metric:1 後端兩個web節點的80端口爲nginx, nginx安裝配置這裏省略 [root@rs-205 ~]# ps -ef|grep nginx root 24154 1 0 Dec25 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf nginx 24155 24154 0 Dec25 ? 00:00:02 nginx: worker process root 24556 23313 0 01:14 pts/1 00:00:00 grep nginx [root@rs-205 ~]# lsof -i:80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 24154 root 7u IPv4 85119 0t0 TCP *:http (LISTEN) nginx 24155 nginx 7u IPv4 85119 0t0 TCP *:http (LISTEN) 3) 在172.16.60.208服務器上管理LVS 添加LVS集羣服務, vip爲172.16.60.119 接着添加後面兩個realserver,指定傳輸模式爲DR [root@lvs-208~]# /sbin/iptables -F [root@lvs-208~]# /sbin/iptables -Z [root@lvs-208~]# /sbin/ipvsadm -C [root@lvs-208~]# /sbin/ipvsadm --set 30 5 60 [root@lvs-208~]# /sbin/ifconfig eth0:0 172.16.60.119 broadcast 172.16.60.119 netmask 255.255.255.255 up [root@lvs-208~]# /sbin/route add -host 172.16.60.119 dev eth0:0 [root@lvs-208~]# /sbin/ipvsadm -A -t 172.16.60.119:80 -s wlc -p 600 [root@lvs-208~]# /sbin/ipvsadm -a -t 172.16.60.119:80 -r 172.16.60.205:80 -g [root@lvs-208~]# /sbin/ipvsadm -a -t 172.16.60.119:80 -r 172.16.60.206:80 -g [root@lvs-208~]# touch /var/lock/subsys/ipvsadm >/dev/null 2>&1 [root@lvs-208~]# /sbin/arping -I eth0 -c 5 -s 172.16.60.119 172.16.60.1 >/dev/null 2>&1 查看vip [root@lvs-208~]# ifconfig ...... eth0:0 Link encap:Ethernet HWaddr 00:50:56:AC:5B:56 inet addr:172.16.60.119 Bcast:172.16.60.119 Mask:255.255.255.255 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 查看lvs集羣轉發狀況 [root@lvs-208~]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.60.119:80 wlc persistent 600 -> 172.16.60.205:80 Route 1 0 0 -> 172.16.60.206:80 Route 1 0 10 訪問http://172.16.60.219/, 就能夠負載到兩個realserver的80端口了 因爲配置了持久化, 則600秒內的客戶端請求將會轉發到同一個realserver節點上. 若是當前請求轉發到172.16.60.206節點上, 則關閉該節點的80端口, 則訪問http://172.16.60.219/就失敗了! 由於手動將該節點從lvs集羣中踢出去,以下: [root@lvs-208~]# ipvsadm -d -t 172.16.60.119:80 -r 172.16.60.206 [root@lvs-208~]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.60.119:80 wlc persistent 600 -> 172.16.60.205:80 Route 1 0 0 而後訪問http://172.16.60.219/ 顯示的就是172.16.60.205節點的80端口頁面! 以上的LVS沒有實現後端realserver節點健康檢查機制, 若是要想對後端realserver節點進行健康檢查, 則須要結合ldirectord軟件, ldirectord配置裏有參數能夠實現: realserver節點故障發生時自動踢出lvs集羣; realserver節點故障恢復後從新加入lvs集羣; ====================================================== ldirectord部分的安裝和配置能夠參考: https://www.cnblogs.com/kevingrace/p/10170920.html [root@lvs-208src]# pwd /usr/local/src [root@lvs-208src]# ll ldirectord-3.9.5-3.1.x86_64.rpm -rw-rw-r-- 1 root root 90140 Dec 24 15:54 ldirectord-3.9.5-3.1.x86_64.rpm [root@lvs-208src]# yum install -y ldirectord-3.9.5-3.1.x86_64.rpm [root@lvs-208src]# cat /etc/init.d/ldirectord |grep "config file" # Using the config file /etc/ha.d/ldirectord.cf # It uses the config file /etc/ha.d/ldirectord.cf. 如上查找可知, ldirectord的配置文件爲/etc/ha.d/ldirectord.cf [root@lvs-208src]# cd /usr/share/doc/ldirectord-3.9.5 [root@lvs-208ldirectord-3.9.5]# ll ldirectord.cf -rw-r--r-- 1 root root 8301 Feb 7 2013 ldirectord.cf [root@lvs-208ldirectord-3.9.5]# cp ldirectord.cf /etc/ha.d/ [root@lvs-208ldirectord-3.9.5]# cd /etc/ha.d/ [root@lvs-208ha.d]# ll total 20 -rw-r--r-- 1 root root 8301 Dec 26 01:44 ldirectord.cf drwxr-xr-x 2 root root 4096 Dec 26 01:40 resource.d -rw-r--r-- 1 root root 2082 Mar 24 2017 shellfuncs 配置ldirectord.cf, 實現realserver節點的健康檢查機制 (根據文件中的配置範例進行修改) [root@lvs-208ha.d]# cp ldirectord.cf ldirectord.cf.bak [root@lvs-208ha.d]# vim ldirectord.cf checktimeout=3 checkinterval=1 autoreload=yes logfile="/var/log/ldirectord.log" quiescent=no #這個參數配置就實現了realserver的監控檢查機制 virtual=172.16.60.119:80 real=172.16.60.205:80 gate real=172.16.60.206:80 gate fallback=127.0.0.1:80 gate #realserver都故障時, 轉發請求到lvs本機的80端口 service=http scheduler=rr persistent=600 #netmask=255.255.255.255 protocol=tcp checktype=negotiate checkport=80 #request="index.html" #receive="Test Page" #virtualhost=www.x.y.z 重啓ldirectord服務 [root@lvs-208ha.d]# /etc/init.d/ldirectord start [root@lvs-208ha.d]# ps -ef|grep ldirectord root 4399 1 0 01:48 ? 00:00:00 /usr/bin/perl -w /usr/sbin/ldirectord start root 4428 3750 0 01:50 pts/0 00:00:00 grep ldirectord 這樣, 後端的realserver就經過ldirectord配置實現了健康檢查! [root@lvs-208ha.d]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.60.119:80 rr persistent 600 -> 172.16.60.205:80 Route 1 0 0 -> 172.16.60.206:80 Route 1 0 0 當172.16.60.205 和 172.16.60.206 中的任意一個節點故障時, 該節點就會自動從lvs集羣中踢出來, 此時請求都轉發至另外一個節點上; 該故障節點恢復後, 該節點就會自動從新加入到lvs集羣中; 整個過程對於前面的客戶端訪問來講是無感知. 如172.16.60.205節點的80端口掛了, 則lvs轉發狀況: [root@lvs-208ha.d]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.60.119:80 rr persistent 600 -> 172.16.60.206:80 Route 1 0 0 當172.16.60.205節點的80端口恢復後, 則lvs轉發狀況 [root@lvs-208ha.d]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.60.119:80 rr persistent 600 -> 172.16.60.205:80 Route 1 0 0 -> 172.16.60.206:80 Route 1 0 0 這就實現了realserver 層面的高可用了!!! 可是此時lvs層是單點, 若是還想實現lvs層的高可用, 就要利用keepalived 或 heartbeat了!