LVS:Linux Virtual Server
Linux Cluster:集群,為解決某個特定問題將多臺主機組織起來,滿足同一個需求;
單臺主機處理能力有限,包括cpu、IO、內存、帶寬等資源,無法滿足客戶端請求;把用戶的請求分散到多個不同的服務器,分攤壓力;
集群的類型:
LB:Load Balancing,負載均衡集群;負載均衡器,或調度器、分發器;
分擔負載客戶端的多個彼此之間無關聯關系的單獨請求
后端主機(backend server,upstreaming server),“真”服務器(real server)
HA:High Availibility,高可用集群 —— 提高服務可用性,在某一主機出現故障時能夠通過冗余讓備用主機能在主服務器故障時啟用
Actiive:活動服務器;
Passive:備用服務器(standby);
衡量集群的可用性:通常說幾個9來衡量
A=可用性(Avalibility): Avalibility=MTBF/(mtbf+mttr)
可用性=平均時間/(平均無故障時間+平均修復時間)
值為[0,1]之間,常用百分比衡量
例如:100個小時,99%表示有1個小時不可用;99.9%表示有0.1個小時不可用,99.99%表示有0.01小時(36秒)不可用
SPOF:Single Point Of Failure;單點故障;
HP:High Performance 高性能集群;組合多臺計算機分散計算量,解決一個很大很復雜的單一請求,(不多見,由DS代替)
DS:Distrubuted System分布式系統
分布式運算、分布式存儲
hadoop:
mapreduce
hdfs
系統擴展的方式:(當前主機不能滿足需求時的解決方法)
Scale UP:向上擴展,垂直擴展;更換高性能的硬件;
Scale OUT:向外擴展,水平擴展;利用多臺主機,實現分攤壓力;但并不是線性擴展;
LB:Load Balancing,負載均衡集群的實現:
關鍵要點:前端調度器和如何分發用戶請求
硬件實現:各公司的產品
F5—- BIG-IP
Citrix—- Netscaler
A10—-A10
軟件實現:
lvs:Linux Virtual Server
haproxy
nginx
ats(apache traffice server)
perlbal:perl語言研發的高性能分發器
基于工作的協議層次劃分:
傳輸層:通用所有協議,因為沒有套接字限制
lvs(工作在內核中),haproxy,nginx
應用層:專用某個服務,根據具體自定義的請求模型進行分發
haproxy(mod http)、nginx、ats、perlbal、mysql:mysql-proxy
LVS工作在內核中,能支持更多服務第一,不需要監聽套接字并維護套接字文件;第二,無需扮演成客戶端(反代)向后端取用戶請求的資源,如果是在應用層,為后端代理時,還需要ip地址和端口,如果并發請求10萬個,則不能滿足,因為有效端口才65535個端口;這樣,前端打開文件數量沒有問題,但將后端轉發請求時,受限于所能打開的套接字,所以并發數有限,文件數量;在內核中則沒有這樣的限制,因此,第一,就突破了套接字文件的限制;第二,套接字可用端口數量的限制;
站點指標:
PV: Page View 用戶瀏覽網頁數
UV:Unique Vistor 唯一標識的客戶端,一個客戶端可以打開很多PV,但只有一個客戶端
IP:對于公網IP來說,IP與UV并不是同一個概念
會話保持:3種方法
session sticky會話綁定:服務器單獨存儲自己的session,任何一臺服務器down掉,改主機的session將丟失;
session cluster會話集群:把后端需要保持會話的服務器做一個會話集群,每一個主機的會話都通過網絡同步到集群中的其它節點上,使得集群中的每個節點都有集群中的所有會話,從而實現任何一個節點down掉,會話都存在;因此,不用綁定,好處是不會影響負載均衡的效果;任何一臺服務器down掉,不影響會話;壞處,每一臺服務器要存儲集群內的所有服務器的session。
session server會話服務器:
使用一臺服務器專門保存會話;這樣會成為單點,還要提高服務器的可用性;
HA:High Availibility,高可用集群;
keepalived:vrrp協議軟件實現
LVS:Linux Virtual Server—— Linux虛擬服務器
組件:VS: Virtual Server RS: Real Server
1.負載均衡器的作用:
l4(layer 4):四層路由或四層交換,根據端口分發
VS:根據請求報文的目標IP和目標PORT,將其進行調度轉發至后端的某Real Server;根據調度算法來挑選后端Real Server
2、.VS的工作架構:
ipvsadm/ipvs類似于iptables/netfilter:
iptables:是用戶空間的命令行工具;
netfilter:是內核空間框架,真正發揮效用的;
流入:PREROUTING –> INPUT
轉發:PREROUTING –> FORWARD –> POSTROUTING
流出:OUTPUT –> POSTROUTING
3、LVS:由2部分組成ipvsadm/ipvs
ipvsadm:工作在用戶空間的命令行工具;用于管理集群服務及集群服務上的RS;
ipvs:是內核中的框架;工作于內核上的netfilter的INPUT鉤子上的程序,可根據用戶定義的集群實現請求轉發;如果用戶請求到達INPUT,LVS發現用戶請求的是LVS定義的集群服務,此時LVS就將請求直接傳遞給POSTROUTING,由此轉向Real Server
注意:在lvs主機上,不允許在INPUT鏈上添加過濾規則,一般不建議與ipvs一同使用filter規則;更不能使用nat規則,任何鏈接追蹤功能都不能開啟,鏈接會話表就限制了會話能力,否則,并發響應能力將大大受到限制;
支持基于TCP UDP SCTP AH EST AH_EST等協議及端口進行調度;
4、lvs集群的專用術語:
VS:Virtual Server虛擬服務器,Director調度器,Dispatcher分發器,Balancer均衡器
RS:Real Server 后端主機
CIP:Client IP 客戶端IP地址;
VIP:Virtual Server IP 面向客戶端服務的IP地址,不是固定配置在主機上,需要在兩個節點間流動,因為當前主機掛了,備用主機替換上,一般配置在網卡別名上,作為輔助地址存在;
DIP:Director IP 調度器的IP,面向Real Server的IP地址用于與后端服務器通信的IP地址;
RIP:Real Server IP 后端主機IP地址;一般不止一個;
LVS集群的類型:4類工作模式
lvs-nat:修改請求報文的目標IP實現轉發
lvs-dr:操作重新封裝新的MAC地址
lvs-tun:在原請求IP報文之外新加一個IP首部
lvs-fullnat:修改請求報文的源和目標IP
1.lvs-nat:
多目標的DNAT;通過修改請求報文中的目標地址和目標端口修改為挑選出的某RS的RIP和PORT實現轉發;
通過修改請求報文的目標地址,請求和響應報文都經過Director;就是多目標的dnat;必須要各RS的網關要指向DIP,要在同一物理網絡,距離不能太遠;
CIP —> VIP 將 CIP —> RIP 通過VS –> RS返回 RIP —> CIP 到VS 轉換 VIP —> CIP
lvs-nat特點:
(1)RIP和DIP必須在同一IP網絡,且應該使用私有地址;RS的網關必須指向DIP(保證響應報文必須經由VS);
(2)請求報文和響應報文都經由Director轉發,較高負載下,Director易于成為系統性能瓶頸,因為Director要承載請求報文的轉發,也要承載響應報文的轉發;
(3)支持端口映射;后端真實主機盡量為同一端口;
(4)VS必須是Linux,RS可以是任意OS(操作系統);
工作過程:
ipvs工作在INPUT鏈上,所以只有在INPUT鏈上才能判斷出集群服務,然后才能向后轉發,轉發時,基于某種調度算法,ipvs自動從后端主機中挑選出一個來響應用戶請求,挑選出的主機IP會成為報文目標IP的修改對象;
定義負載均衡集群服務時,要定義集群服務,集群服務的真實主機;
客戶端訪問lvs集群服務,此時報文的源地址為cip,目標地址為vip,通過lvs進行dnat轉發后端服務器主機,此時,報文的源地址為cip,目標地址為rip;
后端主機響應時,報文源地址為rip,目標地址為cip,后端的各個真實主機,必須把網關指向lvs集群服務的dip;這樣,才能保證響應給lvs集群服務主機;響應報文到達lvs集群服務進行地址轉換,此時,源地址為vip,目標地址為cip,最終,響應給客戶端;其
實,還支持端口映射,即可修改端口進行端口轉換;
此lvs工作類型,由于使用nat,鏈接跟蹤機制不可避免的啟用;所以,并發數量是受限的;
2、lvs-dr:Direct Routing 直接路由,默認lvs工作類型;
通過修改請求報文的MAC地址,重新封裝一個MAC首部進行轉發;源MAC是DIP所在接口的MAC地址,目標MAC是挑選出的某RS的RIP所在接口的MAC地址;
通過重新封裝請求報文的MAC層地址,目標mac為挑選出的RS的mac地址;請求報文經過Director,響應報文不能經過Director;
特點:
(1)確保前端路由器將目標IP為VIP的請求報文轉發往Director;
解決方案:3種
1.在路由器上靜態綁定VIP和Dieretor的MAC地址;
禁止RS響應VIP的ARP請求,禁止RS的VIP進行通告;
2.arptables:定義限定ip對應MAC地址為VIP所在
3.修改RS的內核參數,并把VIP綁定lo的別名上;
arp_ignore,arp_announce
(2)RS的RIP可以使用私有地址,也可以使用公網地址;
(3)RS跟Director必須在同一物理網絡(基于MAC地址轉發);RS的網關必須不能指向DIP;
(4)請求報文必須由Directory調度,但響應報文必須不能經由Director;
(5)不支持端口映射;
(6)RS可以使用大多數的OS;一般都為Linux系統;
工作流程:
IP首部不會發生變化(依然是CIP<–>VIP)lvs服務主機與后端服務器RS主機接在同一交換機上,且每個后端主機都配有vip,為了避免地址沖突,把各后端主機配置的vip進行隔離;隔離的方法有3種:
方法一:可使用arptables命令,專門控制進行arp廣播隔離;
方法二:Linux內核較新版本中,提供了一個精巧的開關,也能夠實現隔離;
方法三:在前端lvs服務器上游的路由器上綁定lvs的MAC地址與lvs的vip地址;此方法,較為不便,一般路由器有運營商負責,且lvs服務器主機會有兩個,所以綁定MAC后,當一臺壞了時,另一臺則不能通過路由器與外界通信;
每個主機除了與外部通信的接口外,還有lo接口;一個報文從物理接口進來,經過lo接口到達主機,也算為一種轉發,于是,把rip配置在物理接口上,把vip配置在lo的別名上,如lo:0;這樣lo與物理接口不在同一網絡;
Linux內核特性之一是主機上的ip地址是內核的,所以在arp廣播時,正常情況下,無論地址是哪個接口都會響應;如果設定內核參數進行隔離arp廣播報文,從物理接口收到arp廣播報文,即便另一接口有請求的地址,也不響應;讓ip地址真正成為接口的了;
默認情況下,如果主機有3個網絡IP地址,統統向每個網絡中通告;設置內核參數后,可限制,每個接口地址只向它所在網絡通告;
可通過這種方式,每個后端主機上都有vip地址了而沒有發生ip地址沖突;且當有arp廣播請求vip地址時,只有lvs服務器來響應;
lvs接收到請求報文后,此時,數據包的源IP為cip,目標IP為vip,源MAC為上一跳的路由器接口的mac地址,目標MAC為lvs服務主機VIP所在的mac地址,之后,送到INPUT鏈上,發現是集群服務,就挑選出一個后端主機服務器,再把報文封裝源IP為cip和目
標IP是vip不變,源MAC為lvs本機的VIP接口的mac地址,目標MAC為挑選出來的后端主機物理接口的MAC,把報文送給后端主機的lo:0接口,因為此接口地址是vip;
后端主機,響應報文時,Linux主機特點是ip報文從哪個接口出去,源IP就封裝為該接口的ip地址;此時,響應報文必須從lo:0接口出去,即響應報文在離開該接口時源ip就封裝了vip,目標IP為cip;之后,通過后端主機的物理接口發送響應報文;后端主機的rip與vip不在同一網段,需要將rip指向另一個路由器當網關,才能將報文響應給客戶端;
3、lvs-tun:tunnel,lvs隧道模型—通過互聯網連接
轉發方式:不修改請求報文的IP首部(源IP為CIP,目標IP為VIP),而是源IP首部之外再封裝一個IP首部(源IP為DIP,目標IP為挑選出的RS的RIP);
隧道,通過在原有的IP報文之外,再封裝一個IP首部,且源IP為DIP,目標IP為RIP;這兩個地址可為互聯網地址;有可能造成巨型幀,超過MTU的大??;
功用:容災
特點:
(1)RIP,DIP,VIP全得是公網地址;
(2)RS網關不能指向也不可能指向DIP;
(3)請求報文經由Director轉發,但響應報文將直接發往CIP;
(4)不支持端口映射;
(5)RS的OS必須支持隧道功能;
(6)請求報文不能超過MTU1500
工作流程:
請求報文源IP為cip,目標IP為vip,到到達lvs服務進入INPUT鏈上,在整個ip報文外又加了一層ip首部,即IP報文傳輸IP報文所以叫IP隧道,此時外層源IP為dip,目標IP為某一個被挑選出來遠端的rip,遠端的服務主機收到報文經過不斷拆包后,將響應報文發給客戶端,構建響應報文的源IP為cip,目標IP為cip;
4、lvs-fullnat:不是lvs的標準模型;淘寶研發;
通過同時修改請求報文的源IP地址(CIP–>DIP)和目標IP地址(VIP–>RIP)進行轉發;
其實,是nat模型是一種轉換;lvs服務器通過路由器連接后端服務器,即后端服務器可在遠端;
不是標準類型,是擴展了lvs-nat的限制,在lvs-nat中,要求響應報文必須經過Director,必須要各RS的網關要指向DIP,要在同一物理網絡,距離不能太遠;構建跨網段實現時,受到限制;lvs-fullnat解決了此問題的限制;
實現RS和VS能跨路由進行通信
工作流程:
1.客戶端封裝CIP–>VIP訪問到VS,VS進行更改報文為DIP–RIP對后端的RS進行請求響應
2.RS通過封裝RIP–>DIP將報文轉發到VS,VS在將報文更改為VIP–>CIP進行響應給客戶端。
特點:
(1)VIP是公網地址,RIP和DIP一般是私網地址,且通常不再同一網絡中,但需要經由路由器互通;
(2)RS收到的請求報文源IP為DIP,因此響應報文將直接響應給DIP;
(3)請求和響應報文都經由Director;
(4)支持端口映射;
(5)RS可以使用大多數的OS;
lvs scheduler:lvs調度方法
根據其調度時是否考慮后端主機的當前負載,可分為靜態方法和動態方法兩類:
1、靜態調度方法:僅根據算法本身進行調度;(關注起點公平)
RR:Round Robin,輪詢/輪調/輪叫;
調度器通過輪叫調度算法將外部請求按順序輪流分配到集群中的真實服務器上,它均等地對待每一臺服務器,而不管服務器上實際的連接數和系統負載;
WRR:Weighted RR,加權輪詢,基于權重的方式;
調度器通過加權輪叫調度算法,根據真實服務器的不同處理能力來調度訪問請求;這樣可以保證處理能力強的服務器處理更多的訪問流量;調度器可以自動詢問真實服務器的負載情況,并動態地調整其權值;
SH:Source Hashing,源地址哈希;實現session statiy
實現session sticy,源IP地址hash;將來自于同一個IP地址的請求始終發往第一次挑中的RS,從而實現會話綁定;
功能:保存會話時才用到;
來自于同一IP地址的請求,始終發往同一個真實服務器,從而實現會話保持的功能,根據原地址挑選真實服務器;把原地址與挑選真實服務器綁定起來;
基于客戶端瘦cookie+服務器端的session機制,在負載均衡時,同一用戶被調度不同后端服務器時,為了保持會話連接功能不丟失;當第一次用戶請求時,通過調度機制給該用戶分配了一個負責響應后端服務器,以后來自該用戶的請求就由這個服務器負責響應了,而不再調度,這就叫源地址哈希;
在調度器上有會話追蹤表,在這個會話追蹤模板中,把用戶的IP地址和挑選的后端服務器對應的記錄下來,而且定義一個超時時長,在定義的時間內該條目不會刪除;所以,用戶請求到來時,先檢查這個表,把原IP當做k查找,因為哈希就是k/v數據,對應的v就是后端的真實服務器;如果檢查有用戶的IP對應的記錄,則直接將請求報文發給記錄中對應的后端真實服務器,而不通過調度;
缺陷:當記錄的真實服務器掛了時,就沒有會話保持記錄了;當內網用戶同過同一IP地址訪問外網時,可能會把內網用戶的所有請求都發往會話記錄表上的真實服務器,這樣負載均衡能力是收到損害的;
解決辦法:
方法一:
可在更高級實現,基于cookie做綁定,但是cookie是應用層數據,所以lvs在內核,不能通過lvs實現;但,htpd,nginx可實現;
方法二:
要想通過lvs解決,可以把幾個lvs服務器做一個session集群,是實現會話同步的集群,每一個節點創建會話后,通過網絡協議,會立即同步到其它節點,這樣,每一臺節點上保存的都是全局的所有會話,任何一臺節點掛了,用戶請求被重新調度時會話不會丟失;如果有30臺服務器,每一臺服務器都要同步所有服務器上的session會話信息,會給服務器帶來很大壓力,所以此種方法僅適用于小規模的真實主機集群的場景;后面講tomcat時,演示session集群;
方法三:
可用一個session服務器做共享存儲,一般在后端當存儲的節點為專用的k/v數據存儲;例如memche,radis;
DH:Destination Hashing,目標地址哈希;
保存的是目標地址,通常用在正向web代理(有緩存功能),負載均衡內網用戶對外部服務器的請求;哈希的是目標地址;
內網用戶請求的目標地址,在調度器上把目標地址綁定到一個代理緩存服務器上,以后,任何用戶訪問的是該目標地址就發往綁定的代理服務器,代理服務器收到請求后,再發往后端服務器主機,從而實現正向代理負載均衡的作用;
目標地址哈希,將發往同一個目標地址的請求始終轉發至第一次挑中的RS;例:VS記錄訪問www.baidu.com的從RS2進行訪問,那么所有客戶端請求訪問www.baidu.com時都直接響應RS2。
2、動態調度方法:根據算法及各RS當前的負載狀態進行調度;
LC:least connections,最少連接;計算的值小被優先調度
通過Overhead計算公式實現:計算各RS當前的負載狀態,通過Overhead值表示;
Overhead=Active數量*256+Inactive
通過最少路徑調度算法動態地將網絡請求調度到已經建立的鏈接數最少的服務器上;如果集群系統的真實服務器具有相近的系統性能,采用最小鏈接調度算法可以較好的均衡負載;
例:當前RS1的活動數量為30,非活動數量為10,RS2的活動數量為10,非活動數量為30; 通過計算,RS2的值比RS1的值小,所以會有限調度RS2。
WLC:Weight LC,加權的最少連接;計算出的值大的被優先調度
是通用方法,即考慮了算法又考慮了服務器負載,是默認的調度方法;
計算公式:Overhead=(Active數*256+Inactive)/weight
權重越大,得到的結果越?。欢{用方法為權重高的有限調度;如果計算出的權值一樣的,那么之上而下調度第一個RS;
在集群系統中的服務器性能差異較大的情況下,調度器采用加權最少鏈接調度算法優化負載均衡性能,具有較高權值的服務器將承受較大比例的活動連接負載;調度器可以自動詢問真實服務器的負載情況,并動態地調整其權值;
缺陷:如果權值最小的服務器排在第一行,每次會響應客戶端請求,這樣對權值大的服務器利用率就不是很高;
SED:Shortes Expections Delay,最短期望延遲
Overhead=(Active+1)*256/weight
彌補了WLC的缺點;但又出現了缺點:權值最小的服務器,在其它權值較大服務器負載較大時才工作;放棄了非活動鏈接的考量;
NQ:Never Queue 從不排隊
是SED的改進,彌補了SED的缺點;請求到來后,會按權值大小,都會分配每個服務器來響應客戶端請求;放棄了非活動鏈接的考量;
LBLC:Locality-Based LC,基于本地的最少連接
基于本地的LC,其實就是動態的DH算法,考慮了服務器的負載;損失了命中率,提高了均衡性;
針對目標IP地址的負載均衡,目前主要用于cache集群系統;
該算法根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處于一半的工作負載,則用最少鏈接的原則,選出一個可用的服務器,將請求發送到該服務器;
LBLCR:LBLC with Replication,帶復制的基于局部性最少鏈接帶復制的LBLC;
也是針對目標IP地址的負載均衡,目前主要用于cache集群系統;
它與LBLC算法的不同之處是它要維護從一個目標IP地址到一組服務器的映射,而LBLC算法維護從一個目標IP地址到一臺服務器的映射;該算法根據請求的目標IP地址找出該目標IP地址對應的服務器組 ,按最小鏈接原則從服務器組中選出一臺服務器,若服務器沒有超載,將請求發往該服務器,若服務器超載,則按最小鏈接原則從這個集群中選出一臺服務器,將該服務器加入到服務器組中,將請求發往該服務器;同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以降低復制的程度;
Ipvsadm/ipvs:實現
ipvs:工作在內核中的協議棧上實現;工作在netfilter/input鉤子上,強行更改IP報文的響應流程實現調度
支持基于TCP UDP SCTP AH EST AH_EST等協議及端口進行調度;
IPVS工作模式:就是在filter的input鏈上附加了一段代碼,就稱為ipvs功能;類似于鉤子一樣,能夠根據定義的集群規則,監控任何一個送往input鏈上的請求報文,且請求報文中所請求的目標地址和端口被定義成了集群服務,則會根據調度方法和集群類型,強行修改報文的流程到postrouting;一般定義lvs集群時,一定要跟filter分隔,不能同iptables一塊使用,尤其不能跟filter表一起使用;
因為ipvs在內核中工作的特性,解脫了套接字文件數量和套接字自身數量的限制,使得ipvs在優化得當的場景中看,負載能力可達數百個;
如果負載不是特別大,使用配置比較麻煩,維護成本較大;
ipvsadm:工作在用戶空間的集群服務器管理工具;
ipvs/ipvsadm的關系相當于netfilter/iptables的關系;
真正提供lvs服務的是ipvs;
四層交換或四層路徑;根據目標ip和目標端口進行轉發;
一個ipvs(Director)主機可以同時定義多個cluster service;
一個ipvs服務至少應該有一個rs;
因為是根據請求的目標ip地址和目標端口(能識別協議)進行轉發;一個ipvs(Director)主機就可同時為多個集群提供服務進行調度;這就是四層交換的原因;只不過一個Director很有可能成為負載均衡的瓶頸;
注意:單個Director可同時為多個集群提供調度服務;
判斷內核是否支持ipvs:
]# grep -i "IPVS" /boot/config-3.10.0-229.el7.x86_64
CONFIG_NETFILTER_XT_MATCH_IPVS=m 支持模塊化
# IPVS transport protocol load balancing support 支持的四層協議
TCP、DUP、AH、ESP、SCTP、HA_ESP
# IPVS scheduler 支持的調度方法
Static : RR/WRR/SH/DH
Dynamic: LC/WCL/SED/NQ/LBLC/LBLCR
CONFIG_IP_VS_SH_TAB_BITS=8 原地址哈希
ipvsadm命令:用法,3種
管理集群服務及管理集群服務上的real server
1、管理集群服務:增、改、刪、查
ipvsadm -A|E -t|u|f service-address [-s scheduler]
-A:增,添加
-E:修改
-t:tcp,把tcp端口定義成集群服務;
-u:udp,把udp端口定義成集群服務;
-f:Firewalls mark防火墻標記;
service-address:定義集群服務的地址
-t,tcp, 地址格式:vip:port
-u,udp,地址格式:vip:port
-f,FireWall Mark, mark—-防火墻標記,一個數字,在防火墻上把某個地址某個端口相關的報文打成一個標記,基于此標記來定義集群服務,作用在可以將兩個不同端口的服務定義為一個集群服務.
-s scheduler:定義集群服務的調度方法,默認為wlc加權最少連接;
ipvsadm -D -t|u|f service-address
-D:刪除集群服務;
2、管理集群上的RS:增、改、刪
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-a:增,添加RS;
-e:改,修改RS;
-r server-address:向已存在的service-address(集群服務)添加RS的地址;
rip[:port] 端口省略時,表示不做端口映射,與請求服務的端口為同一端口;有些集群服務不支持端口映射,如lvsdr,lvs-tun,只要響應報文不經過Director都不支持;
-g,gateway—dr:指明集群類型為lvs-dr;默認類型;
-i,ipip—-tun:指明集群類型為lvs-tun;
-m,masquerad—-nat(地址偽裝):指明集群類型為lvs-nat;
-w weight:指明權重,對不支持權重的調度算法沒用;用在wrr,wlc,sed調度算法;默認為wlc
3、查看:
ipvsadm -L|l [options]
-L,–list:列出集群服務;
-n, –numeric:數字格式顯示,不反解主機名到ip地址,服務到端口號;
–exact:精確顯示數值,不進行單位換算;
-c, –connection:顯示當前ipvs連接;可查看后端服務器是否連接;
–stats:統計數據;
–rate:速率;
4、清空:clear
ipvsadm -C
5、保存和重載:
保存:輸出重定向 Centos7中建議保存在/etc/sysconfig/ipvsadm中,使用systemctl命令啟動服務會讀取此文件中的定義
ipvsadm -S > /PATH/TO/SOME_RULE_FILE
ipvsadm-save > /PATH/TO/SOME_RULE_FILE
Centos7中建議保存地址:/usr/lib/systemd/system/ipvsadm.service
需要開機自動有效:]# systemctl enable ipvsadm.service
重載:輸入重定向
ipvsadm -R < /PATH/TO/SOME_RULE_FILE
ipvsadm-restore < /PATH/TO/SOME_RULE_FILE
負載均衡集群設計時的要點:
(1)session保持:3種方法
session sticky(ip hash):基于原地址哈希、目標地址哈希;
session cluster:會話集群;
session server:會話服務器;
(2)數據共享:2種方案
共享存儲:多種方案
NAS:Network Attached Storage
網絡附加存儲其實就是文件服務器,訪問接口是文件級別,可掛載使用,但不能做格式化操作;(其實就是NFS,SAMBA文件服務器,但自建網絡文件共享存儲服務器的通常性能不好,有廠家生產專用的NAS存儲);
SAN:Storage Area Network,存儲區域網絡
訪問接口是塊級別;可分區、格式化后才能掛載使用;通過其它傳輸介質是擴展的SCSI(小型計算機擴展接口),SCSI特點,有寬帶和窄帶,寬帶可接15塊target,窄帶可接7塊target,必須使用SCSI協議,用SCSI傳輸介質傳輸SCSI協議報文;
SAN就是用SCSI協議借助于其它網絡技術(FC,以太網)傳輸,擴大了傳輸距離,也擴展了適用性;
NAS和SAN是常見的集中式共享存儲的解決方案;指的是集中的一個單點存儲設備,共享給多主機;
DS:Distributed Storage 分布式存儲
通常是網絡服務,讓多個客戶端訪問;分布式存儲把數據存儲到自己的網絡中,分布式存儲有n個主機組成,每個主機都提供一部分存儲空間;訪問接口通常是文件級別,接口可以是文件系統,也可以API;
ceph,內核級分布式存儲;
多數互聯網公司使用DS數據共享解決方案;
數據格式:
結構化數據:存儲于SQL
數據庫中;
半結構化數據:如xml,json等數據,可存儲于文件系統或NoSQL上;
非結構化數據:存儲文件系統,NAS和SAN、DS;
在前端加緩存,來解決數據存儲中讀取較慢的缺陷;
數據同步:
rsync+inotify
rsync:遠程同步,能夠將兩臺主機上的兩個文件系統,彼此間做同步;有主從之分,同步是單向的,主服務器有支持讀、寫操作,從服務器只能讀操作,要從主服務器上拉取完成同步;類似于dns中的主從區域復制;
inotify機制:是內核的機制;在從服務器拉取主服務器數據時,可能剛來取完,主服務器就變化了,這樣不能準時獲得同步;inotify機制就要解決此問題,當主服務器有變化時,主動通知從服務器;一主一從,或一主兩從,再多就無法使用;
LVS-DR設計要點:
在各主機(Director,RS)均需要配置VIP,因此,要解決地址的沖突的問題,目標是讓各RS上的VIP不可見,僅用接收目標
地址為VIP的報文,同時可作為響應報文的源地址;
(1)在前端的網關接口上靜態綁定(vip+mac);
缺陷:一旦Director掛了,基于高可用轉移另外節點上無法實現;而且,要在網關上有權限操作;
(2)在各RS上使用arptables;添加規則,拒絕自己的VIP地址向外通告及響應arp解析地址的請求;
(3)在各RS上修改內核參數,來限制arp響應和通告;
注意:要將VIP配置在lo的別名上,不能配置在網卡的別名上;
限制響應級別:arp_ignore
0:默認值,使用本地任意接口上配置的地址進行響應;回應任何網絡接口上對任何本地IP地址的arp查詢請求
1:僅在請求的目標IP配置在本地主機的接收報文的接口上時,才給予響應;只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求;
2:只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求,且來訪IP必須在該網絡接口的子網段內;
限制通告級別:arp_announce
0:默認值,把本機所有接口信息向每個接口通告;
1:盡量避免向非本網絡通告;
2:總是避免向非本網絡通告;
(1)各主機一個接口即可,但需要在同一物理網絡中;
(2)RIP的網關不能指向DIP,RIP和DIP通常應在同一網絡,但此二者未必會與VIP在同一網絡;
(3)各RS需要先設置內核參數,再設置VIP和路由;
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
響應報文不用經過Director,每個RS必須配置VIP,為了避免地址沖突,有3種方式; 第一,在路由器上做靜態綁定Director上的MAC與Director上的VIP,各RS還有添加arptables拒絕網絡通告;
第二,在RS上僅適用arptables解決;第三種,修改內核參數解決;每個主機只需一塊網卡即可,各主機都在同一物理網絡中;確保請求報文能到達Director,Director收到報文后挑選出一臺RS負責響應,在Director上把報文重新封裝MAC,把報文轉發給該RS;
在各RS上,先隔離arp通告,再添加入棧路由即到達VIP必須經lo:0這樣的別名(VIP地址配置在的別名接口)接口上,這樣出棧時,源IP才能被改成VIP;
請求報文經過過Director,響應報文不經過Director,各RS的網關不能指向DIP;端口映射不能實現;如果VIP和RIP不在同一網段;如何確保響應報文能出去;
禁止本機向外廣播自己,但可以響應其它主機發的廣播;
在各RS上設置通過網卡別名進來的報文還要通過該別名出去:
在各RS上設置arp通告級別即修改兩個內核參數arp_ignore、arp_announce,因為地址是屬于內核的,所以在Linux主機默認的通告方式是所有本機的可用IP地址通告給每個接口;
arp_announce要限制通告級別,每一個網卡僅在把自己的網絡地址向所在物理網絡中通告,即各網卡間地址絕不交叉通告;
arp_ignore是限制響應別人arp請求的級別;默認響應請求是無論從哪個接口接收到arp請求,只要本機有這個地址都會響應;限制arp響應級別后可實現,從哪個網卡接收的arp請求,必須與該接口屬于同一網絡時才響應;arp_ignore設置為1;
fwm:FireWall Mark
在netfilter上給報文打標記;在mangle表上實現;mangle表可以應用在5個鏈上;
在報文進入時,進行打標記,例如目標IP是VIP端口80,把這類報文分揀出來打標,標記一般為十六進制整數,例如標記1;在input鏈上定義集群服務時,就可判定如果防火墻標記為1,則為集群服務;把本來在input鏈上完成識別、定義集群服務分成了兩步,識別在prerouting做,定義在ipvs(inputing)上實現;
1、打標使用iptables實現:
~]# iptables -t mangle -A PREROUTING -d 172.18.11.7 -p tcp –dport 80 -j MARK –set-mark 1
//在mangle表上的prerouting鏈上,目標ip(VIP)為172.18.11.7,目標端口為80,打標記為1; 查看:iptables -t mangle -vnL
mark標記里包含了IP地址和端口;定義集群服務時使用mark即可;
~]# ipvsadm -A -f 1 -s rr //定義mark標記為1的報文為集群服務,調度算法為rr;
~]# ipvsadm -a -f 1 -r 172.18.11.8 -g -w 1 //添加RS到mark標記為1的集群服務中,集群類型為lvs-dr,權重為1;
]# ipvsadm -a -f 1 -r 172.18.11.9 -g -w 1
2、防火墻標記好處:可以把2個服務打成一個標記;就可把2個服務當做一個集群來調度;
在另一臺主機測試:
]# curl http://172.18.11.7
多次請求后,發現實現了rr調度算法,響應比率為1:1;
3、打標記的方法:
~]#iptables -t mangle -A PREROUTING -d $vip -p $protocol –dport $clusterserverport -j MARK –set-mark #
#:代表十六進制整數;
4、打標作用:
提供輔助持久連接功能;在多個端口定義服務時,可把相關作為一個集群來調度;
lvs persistence:持久連接;
基于持久連接模板(就上一個哈希表),能實現無論使用任何算法調度,都能進行在一段時間內,將來自同一源IP的請求始終發往同一RS;
可定義持久連接時間、無論使用什么算法都能持久連接;還可將兩個不同的服務綁在一塊進行調度;
1、ipvs的持久類型:
Port Affinity:借助于FireWall Mark能過完成將多個端口綁定在一起并使用持久鏈接來實現統一調度;
每端口持久(PPC):per port connect 每集群服務單獨定義,并定義其持久性
來自于同一源IP的客戶端請求不同的服務,當訪問web的80端口時,就可綁定,訪問數據庫服務的3306端口時,則會重新進行調度;只持久單個服務;
每客戶端持久(PCC):per client conect 基于0端口(任意端口)定義集群服務,將客戶端對所有應用的請求通通調度至后端主機,而且可使用
同一個Director調度多個集群服 務,多個集群服務由同一組RS提供即一個RS提供80,443,3306等服務;如果同一客戶端請求,始終發往同一的RS響應;對所有服務同時持久;
每FWM持久: 基于防火墻標記定義持久的集群服務,可實現將多個端口上的應用統一調度,同一個標記下有多個服務時被統一調度
只要是防火墻標記是一樣的,就始終發往同一RS響應;只持久同一防火墻標記下的連接;
2、定義持久連接的方法:
ipvsadm -A|E -t|u|f service-address [-s scheduler] -p [timeout]
默認持久連接時間為300秒;
示例1:定義每FWM
# iptables -t mangle -A PREROUTING -d 172.18.11.7 -p tcp -m multiport –dports 80,443 -j MARK –set-mark 10
# ipvsadm -A -f 10 -s rr -p 60
# ipvsadm -a -f 10 -r 172.18.11.8 -g -w 1
# ipvsadm -a -f 10 -r 172.18.11.9 -g -w 2
示例2:每客戶端持久(PCC)連接:
]# ipvsadm -A -t 172.18.11.7:0 -s rr –p //添加集群服務,設置VIP、端口為0表示所有端口,集群調度使用rr算法,開啟持久連接功能;
]# ipvsadm -a -t 172.18.11.7:0 -r 172.18.11.8 -g -w 1
]# ipvsadm -a -t 172.18.11.7:0 -r 172.18.11.9 -g -w 1
把RS加入集群服務,集群類型為lvs-dr,權重為1;
在另外一臺主機測試80和23端口:
]# curl http://172.18.11.7
]# telnet 172.18.11.7
測試結果為同一RS響應各種服務
實驗:
一、查看狀態
1、]# ipvsadm -Ln 查看ipvs服務,以數值格式顯示;
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
其中:
Port顯示協議,只有三種:tcp、udp、firewalls mark;
Scheduler表示調度方法;
RemoteAddress:Port 表示RS(真實服務器)地址;不同集群服務,一般RS不同;
Forward 表示轉發方法;
Weight 表示權重值;
ActiveConn 活動連接數;
InActConn 非活動連接數;
2、]# ipvsadm -Ln –rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
其中:
CPS:表示每秒鐘的連接數;
InPPS:每秒的入棧報文數;
OutPPS:每秒的出棧報文數;
InBPS:每秒的入棧字節數;
OutBPS:每秒的出棧字節數;
3、]# ipvsadm -Ln –stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
其中:
Conns:表示總的連接數量;
InPkts:入棧報文數;
OutPkts:出棧報文數;
InBytes:入棧字節數;
OutBytes:出棧字節數;
二、添加集群服務
例1:添加一個LVS-nat類型的集群服務
實驗拓撲:
實驗環境:
1.LVS擁有兩個網卡,并且屬于不同網段;
2.RS需要添加從VIP進來的地址必須從lo上的vip出去;
3.RS的網關需要指向DIP;
4.RS只能擁有一個網卡;
5.關閉iptables 和 selinux;
6.LVS開啟內核Forward;
7.RS搭建web服務用于測試;
8.LVS安裝ipvsadm程序:yum install -y ipvsadm
實驗步驟:
一、搭建RS1:
1.設置網絡信息:設定RIP地址
~]# ifconfig eth1 192.168.1.2 up
~]#route add default gw 192.168.1.10
2.搭建文本服務:
~]#yum install -y httpd
~]#echo “<center><h1>Welcome RS1<h1><center>” > /var/www/html/index.html
3.關閉防火墻規則及selinux
~]# iptables -F
~]#setenforce 0
二、搭建RS2:
1.設置網絡信息:設定RIP地址
~]# ifconfig eth1 192.168.1.4 up
~]#route add default gw 192.168.1.10
2.搭建文本服務:
~]#yum install -y httpd
~]#echo “<center><h1>Welcome RS2<h1><center>” > /var/www/html/index.html
3.關閉防火墻規則及selinux
~]# iptables -F
~]#setenforce 0
三、搭建LVS
1.設置IP:
~]# ifconfig eth0 10.1.1.25/16 up //設定VIP
~]# ifconfig eth1 192.168.1.10 up //設定DIP
2.開啟內核Forword功能:
~]#echo “1” > /proc/sys/net/ipv4/ip_forward
3.添加集群服務:
~]# ipvsadm -A -t 10.1.1.25:80 -s rr
-A:添加集群服務
-t:添加tcp協議的集群服務地址為10.1.1.25,端口為80
-s:指定集群服務的調度方法為rr:輪尋調度,不指明為默認wlc;
~]# ipvsadm -a -t 10.1.1.25:80 -r 192.168.1.2 -m
~]# ipvsadm -a -t 10.1.1.25:80 -r 192.168.1.4 -m
-a:添加集群上的RS
-t:指定定義為tcp協議的管理集群服務的地址
-r:向已存在的VS添加RS地址
-m:指明集群的工作類型為LVS-nat
實驗結果:
1.使用curl命令循環請求10.1.1.25web服務,LVS會交替響應不同的web界面
[root@Centos ~]# for i in {1..10} ;do curl http://10.1.1.25 ;done
<center><h1>Welcome RS1<h1><center>
<center><h1>Welcome RS2<h1><center>
…….
注意事項:
1.由于使用的調度方法為rr輪尋,所以在定義RS的時候沒有必要對RS指定權重
2.不能使用瀏覽器進行測試,瀏覽器有緩存,測試不正確
例2:添加一個LVS-DR類型的集群服務
實驗拓撲:
實驗環境:
1.LVS同一個網卡,配置DIP和VIP,VIP配置在網卡別名上,并且屬于同網段。
2.RS的網關不能指向DIP;
3.RS需要對所有網卡設定內核參數arp_ignore和arp_announce分別為1和2;
4.RS需要在lo網卡接口上定義別名,ip為VIP,并且對內核參數進行設置;
5.關閉iptables 和 selinux;
6.RS搭建web服務用于測試;
7.LVS安裝ipvsadm程序:yum install -y ipvsadm
實驗步驟:
一、搭建RS1:
1.設置內核參數:
~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
2.設置網絡信息:設定RIP地址
~]# ifconfig lo:0 10.1.1.20 netmask 255.255.255.255broadcast 10.1.1.20 up //設定VIP
~]# ifconfig eth1 10.1.2.25/16 up //設定RIP
~]# route add -host 10.1.1.20 dev lo:0 //設定從VIP進來的從lo:0出去
3.搭建文本服務:
~]#yum install -y httpd
~]#echo “<center><h1>Welcome RS1<h1><center>” > /var/www/html/index.html
4.關閉防火墻規則及selinux
~]# iptables -F
~]#setenforce 0
二、搭建RS2:
1.設置內核參數:
~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
2.設置網絡信息:設定RIP地址
~]# ifconfig lo:0 10.1.1.20/32 broadcast 10.1.1.20 up //設定VIP
~]# ifconfig eth1 10.1.3.25/16 up //設定RIP
~]# route add -host 10.1.1.20 dev lo:0 //設定從VIP進來的從lo:0出去
3.搭建文本服務:
~]#yum install -y httpd
~]#echo “<center><h1>Welcome RS1<h1><center>” > /var/www/html/index.html
4.關閉防火墻規則及selinux
~]# iptables -F
~]#setenforce 0
三、搭建LVS
1.設置IP:
~]# ifconfig eth1 10.1.1.25/16 up //設定DIP
~]# ifconfig eth1:10 10.1.1.20/32 broadcast 10.1.1.25 up //設定VIP
2.添加集群服務:
~]# ipvsadm -A -t 10.1.1.20:80 -s wrr
-A:添加集群服務
-t:添加tcp協議的集群服務地址為10.1.1.25,端口為80
-s:指定集群服務的調度方法為rr:輪尋調度,不指明為默認wlc;
~]# ipvsadm -a -t 10.1.1.20:80 -r 10.1.2.25 -g -w 1
~]# ipvsadm -a -t 10.1.1.20:80 -r 10.1.3.25 -g -w 10
-a: 添加集群上的RS
-t:指定定義為tcp協議的管理集群服務的地址
-r:向已存在的VS添加RS地址
-g: 指明集群的工作類型為LVS-DR
-w: 指定后端RS的權重
實驗結果:
1.使用curl命令循環請求10.1.1.25web服務
[root@Centos ~]# for i in {1..10} ;do curl http://10.1.1.25 ;done
<center><h1>Welcome RS2<h1><center>
<center><h1>Welcome RS1<h1><center>
<center><h1>Welcome RS2<h1><center>
<center><h1>Welcome RS2<h1><center>
<center><h1>Welcome RS1<h1><center>
…….
2.權重越高的服務量越大
注意事項:
1.在定義RS的lo接口上的VIP時,需要先關閉內核參數;
2.RIP和VIP應該在同一網段,不同網段需要借助路由器實現;
3.RS需要添加從VIP的IP地址進來的地址從lo接口出去的網關(route add -host 10.1.1.20 dev lo),剛好實現封裝轉發VIP–CIP;
4.RS的默認網關不能指向Director
5.關閉防火墻和Selinux;
原創文章,作者:Lii,如若轉載,請注明出處:http://www.www58058.com/55031