一. 集群的概念
服務器集群簡稱集群是一種服務器系統,它通過一組松散集成的服務器軟件和/或硬件連接起來高度緊密地協作完成計算工作。在某種意義上,他們可以被看作是一台服務器。
集群系統中的單個服務器通常稱為節點,通常通過局域網連接,但也有其它的可能連接方式。集群服務器通常用來改進單個服務器的計算速度和/或可靠性。一般情況下集群
服務器比單個服務器,比如工作站或超級服務器性能價格比要高得多。集群就是一組獨立的服務器,通過網絡連接組合成一個組合來共同完一個任務。
說的直白點,集群就是一組相互獨立的服務器,通過高速的網絡組成一個服務器系統,每個集群節點都是運行其自己進程的一個獨立服務器。對網絡用戶來講,網站后
端就是一個單一的系統,協同起來向用戶提供系統資源,系統服務。
二. 為什么要使用集群
1) 集群的特點
- 高性能performance
一些需要很強的運算處理能力比如天氣預報,核試驗等。這就不是幾台服務器能夠搞定的。這需要上千台一起來完成這個工作的。
- 價格有效性
通常一套系統集群架構,只需要幾台或數十台服務器主機即可,與動則上百萬的專用超級服務器具有更高的性價比。
- 可伸縮性
當服務器負載壓力增長的時候,系統能夠擴展來滿足需求,且不降低服務質量。
- 高可用性
盡管部分硬件和軟件發生故障,整個系統的服務必須是7*24小時運行的。
2) 集群的優勢
- 透明性
如果一部分服務器宕機了業務不受影響,一般耦合度沒有那么高,依賴關系沒有那么高。比如NFS服務器宕機了其他就掛載不了了,這樣依賴性太強。
- 高性能
訪問量增加,能夠輕松擴展。
- 可管理性
整個系統可能在物理上很大,但很容易管理。
- 可編程性
在集群系統上,容易開發應用程序,門戶網站會要求這個。
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) 商業的硬件負載均衡: 設備F5、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了!