歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

Lvs 理論知識和實踐

LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集群系統。本項目在1998年5月由章文嵩博士成立,是中國國內最早出現的自由軟件項目之一。   LVS集群采用IP負載均衡技術和基於內容請求分發技術。調度器具有很好的吞吐率,將請求均衡地轉移到不同的服務器上執行,且調度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能的、高可用的虛擬服務器。整個服務器集群的結構對客戶是透明的,而且無需修改客戶端和服務器端的程序。為此,在設計時需要考慮系統的透明性、可伸縮性、高可用性和易管理性。   1,Cluster 理論   1.1,系統拓展的方式:    scale up:向上發展;    scaleout:向外發展;   1.2,集群類型:   LB:負載均衡集群 -->將一個系統上所面臨的諸多負載load Banlancing另外一個主機上; 硬件: F5 Big-ip Citrix Netscaler A10 A10   軟件:Lvs(大型網站)除了負載均衡沒有其他的健康檢測狀態; haproxy, nginx (居多),httpd(proxy模塊) ,varnish ats (apache traffic server)發展需要;  perlbal   基於工作協議層劃分:   傳輸層: Lvs,haproxy(模擬出TCP層可調度mode tcp);   應用層:haproxy(個別協議),nginx,ats,perlbal   HA:高可用集群,high availability   HP:高性能集群,high performancing   分布式存儲及並行處理集群,   1.3,系統:   可擴展性;   可用性;   容量;例如高速公路,可以跑多少汽車; 單位時間內完成的總量;   性能;例如車速,單位時間內通過的汽車數量;響應時間;   注意,系統運維:可用性-->做好標准化-->自動化運維 (穩定性高於一切); #################################################################################   2,構建高可用擴展性系統的重要原則,在系統內部盡量避免穿行和交互; GSLB: Global serviceload balancing全局負載均衡  SLB:service load balancing 服務負載平衡    分層:負載均衡層靜態內容層 數據存儲層  動態內容層    分割:功能上分割,把不同的請求分布到不同的server;  分布式: 分布式應用; 分布式靜態資源; 分布式數據和存儲; 分布式計算;   2.1,四層交換,四層路由   根據請求報文的目標IP和port將其轉發至後端主機集群中的某一台主機(根據負載均衡算法); netfilter: 入站: prerouting------>input; 轉發:prerouting---> forward--->postrouting; 出站:output---->postrouting;   2.2,Lvs :   ipvsadm (寫規則)/ipvs(定義規則) 工作在netfilter的內核中; ipvsadm:用戶空間的命令行工具,用於管理集群服務; ipvs:工作在內核中netfilter INPUT 鉤子協議上; 支持TCP、UDP、AH、EST、AH_EST、SCTP等協議;   2.3,Centos 7 查看調度模塊信息; # grep -i -A 10 'IPVS'/boot/config-3.10.0-229.el7.x86_64   2.4,Lvs arch :  調度器:director(導演)、dispatcher(調度員)、 RS:Real server, client IP:cip directorvirutal ip:vip director ip:dip real serverip:rip   2.5,Lvs type: A, Lvs-nat:基於Dnat模式masquerade(地址偽裝)類型 B,Lvs-dr:直接路由directrouting,gateway類型 C,Lvs-tun:ip隧道 ip tunnelingIPIP 隧道類型 D,Lvs-fullnat:非標准類型 請求報文轉發時修改源、目標地址    A,Lvs-nat:   多目標的DNAT(iptables);    通過修改請求報文的目標IP地址和端口,完成端口映射,至挑選出某RS的RIP地址實現轉發;   (1) RS應該和DIP使用私網地址,且RS的網關需要指向DIP;   (2)請求和響應報文都要經由director轉發;極高負載的場景中,director可能會成為系統瓶頸;   (3)RS 可以使用任意OS,支持端口映射;   (4)RS的RIP和director的DIP必須在同一IP網絡;   如圖1.1所示:   B,Lvs-dr:direct routing   通過修改請求報文的目標mac地址進行轉發;  director:VIP ,DIP  RSs:RIP,VIP   (1)必須保證前段路由器將目標IP為VIP的請求報文發送給director;    解決方案:    靜態綁定;director MAC地址綁定   arptables;在每個real server 啟用arptables,    修改RS主機內核參數(linux 主機);    (2)RS的RIP可以使用私有地址,但也可以使用公網地址;    (3)RS根director必須在同一物理網絡;    (4)請求報文經由director調度,但響應報文不一定能經由director(由RS直接轉發);    (5)不支持端口映射    (6)RS可以大多數OS;    (7)RS的網關不能指向DIP; ################################################################################# 3,Lvs -type Lvs-nat:RIP與DIP必須在同一網段; Lvs-dir: director與RS必須在同一網段; Lvs-tun:    不修改請求報文的IP首部,而是通過原有的IP首部之外,在封裝一個IP首部;    (1)RIP、DIP、VIP都是公網地址;    (2)RS網關不能指向DIP,    (3)請求報文經由director調度,響應報文必須不經由director;    (4)不支持端口映射,RS的OS必須支持隧道功能;    Lvs-fullnat:可以跨機房設置   請求報文到達時,director同時修改報文的源地址和目標地址;    (1)VIP是公網地址,DIP和RIP可以不在同一網段;    (2)RS接收到的請求報文源地址為DIP,因此要響應給DIP;    (3)請求報文和響應報文必須經由director;    (4)支持端口映射,RS的OS可以使用任意OS;    4,http:stateless    追蹤每一客戶端,需要給每一個客戶端發放一個cookie;    session保持:將來自於同一個用戶的請求,調用到同一個RS;    session綁定:請求報文插入cookie, (nginx可以,lvs不可以    session集群;session主從機制會浪費內存、cpu等消耗;    session服務器;共享存儲服務器,KV機制存儲;   5,Lvs scheduler:    靜態方法:僅根據算法本身進行調度,不考慮負載狀態;起點公平   RR: roundrobin ,輪詢   WRR:weighted rr ,加權   SH:source hash 源地址hash 實現session保持;損害負載均衡的效果;    將來自同一個IP的請求始終調度至同一RS;反向代理   DH:destination hash,目標地址hash,不管來自哪一個的請求,請求同一個目標時,都會調度至同一個RS, 正向代理    動態方法:根據算法及各RS的當前負載狀態進行調度;sh  LC:least connection 最少連接數;  overhead=active(活躍的鏈接數量)*256+inactive(不活躍的連接數) WLC:weighted least connection 加權最少連接;  overhead=(active(活躍的)*256+inactive(不活躍的))/weight 服務器權重  SED:最短期望延遲 shortest expection delay  overhead=(active+1)*256/weight  NQ:never queue SED算法改進 LBLC:locality-based lc,動態DH算法,實現正向代理時; LBLCR:帶復制的的LBLC  權重大的響應請求,分配延遲 ####################################################################################### 靜態 局部性:空間 + 時間 制作緩存時,基於內存的緩存方式   動態內容:時間 + 特定 制作緩存時,根據用戶時長判斷;     ######################################################################   6,Lvs的集群服務:TCP、UDP、ah、esp    (1)一個ipvs主機可以同時定義多個clusterserver; 根據tcp,udp (2)一個cluster server上至少有一個real server; 定義時:指明lvs-type 以及lvs scheduler(程序機);   7,ipvsadm的用法: A,管理集群服務; ipvsadm-A|E -t|u|f service-address [-s scheduler] 增加和修改 ipvsadm-D -t|u|f service-address  刪除 ipvsadm-C刪除 ipvsadm -L | l [options]  service-address: tcp:-t ip:port  udp:-u ip:port fwm:-f mark 數字防火牆標記; -sscheculer:默認為wlc 非活動鏈接數量     B,管理集群服務中的RS;  ipvsadm -a|e -t|u|f service-address -rserver-address [-g|i|m] [-wweight]  ipvsadm -d -t|u|f service-address -r server-address   server-address;  ip [:port] 支持端口映射;大多數端口可省略;  Lvs-type:  -g:gateway,dr -i:ipip, tun -m:masquerade,nat nat模型   C, 清空和查看: ipvsadm -C ipvsadm -L | l[options]  -n:numberic 基於數字格式顯示地址和端口;  -c:connection 顯示ipvs連接數;  --stats:統計數據;pkts:總包數  --rate:速率; pps 每秒的包個數  --exact:精確值;  --sort:排序; D, 保存和重載: ipvsadm -R重載 ipvsadm -S [-n] 保存  E,置零計數器: ipvsadm -Z[-t|u|f service-address]     ###################################################################################################### 二,實操部分 Lvs-nat   1,DIP 設置:director准備兩個網口,一個是網橋,一個是虛擬網卡2;  # cd /etc/sysconfig/network-scripts/  # vimifcfg-eno16777736  #ifconfig -a 查看eno16777736地址 設置另外一個端口vmnet2:  # cpifcfg-eno16777736 ifcfg-eno33554984  # vim ifcfg-eno33554984刪除UUID更改NAME、DEVICE參數;   2,接下來我們配置另外兩台web機器: 分別配置兩台web服務器的IP地址,和web服務; 然後在director上面測試兩個頁面;並關閉iptables防護牆; #curl http://192.168.20.7 #curl http://192.168.20.8 #iptables -F  在director上轉發功能打開 # cat /proc/sys/net/ipv4/ip_forward # vim /etc/sysctl.conf編輯添加"net.ipv4.ip_forword = 1"   3,現在在director上面設置規則:  # ipvsadm -A -t 172.16.100.117:80 -s rr  # ipvsadm -a -t 172.16.100.117:80 -r192.168.20.7 -m  # ipvsadm -a -t 172.16.100.117:80 -r192.168.20.8 -m    4,保存配置永久有效: ]# ipvsadm -S > /etc/sysconfig/ipvsadm 5,如果不小心刪除規則,可以及時修復;   6,重讀配置文件,並修復; # ipvsadm -R < /etc/sysconfig/ipvsadm 7,開始驗證Lvs-nat 效果:  http://172.16.100.117來查看; 8,使用"-E"選項修改調度器: #ipvsadm -E -t 172.16.100.117:80 -s sh 9,基於web修改RS端口映射; # ipvsadm -e -t172.16.100.117:80 -r 192.168.20.7:8080 -m # ipvsadm -e -t172.16.100.117:80 -r 192.168.20.8:8080 -m 或者修改 #vim/etc/sysconfig/ipvsadm 裡的參數;然後重讀信息。 wKioL1Yfm3XyKQg_AAEPFaaq0qQ904.jpg   這樣web服務又恢復了正常;   10,刪除一個real server; #ipvsadm -d -t 172.16.100.117:80 -r192.168.20.7:8080   刪除集群服務: #ipvsadm -D -t 172.16.100.117:80   修復ipvsadm #ipvsadm -R < /etc/sysconfig/ipvsadm   11,Lvs-dr 內核參數配置arp_ignore對請求是否響應/ arp_announce 接不接受請求通告 arp_announce(通告)-INTEGER請求 0 默認,不保留通告  1 盡量不通告 2只能、總是避免通告  arp_announce = 1 盡量避免,  arp_announce = 2 只能、總是避免,    arp_ignore -INTEGER 響應 0 -默認 通告全場 1 -僅通告報文請求的入口, Lvs-dr實操圖: A,修改DIP 配置director主機地址和回環地址: # ifconfigeno16777736:0 172.16.100.118/32 broadcast 172.16.100.118 up # route add -host 172.16.100.118 deveno16777736:0限定接口-->目標地址響應    B,配置real server *參數配置--->配置VIP 配置兩台real server內核參數;  # echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore  # echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore  # echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce  # echo 2 >/proc/sys/net/ipv4/conf/eth0/arp_announce  # ifconfig lo:0 172.16.100.118/32broadcast 172.16.100.118 up添加回環Vip地址  # route add -host 172.16.100.118 devlo:0端口限定   C,請求RIP地址驗證;curl 命令; D,director上添加集群服務; #ipvsadm -C 刪除之前的配置 # ipvsadm -A -t172.16.100.118:80 -s rr  # ipvsadm -a-t 172.16.100.118:80 -r 172.16.100.21 -g  # ipvsadm -a-t 172.16.100.118:80 -r 172.16.100.22 -g
Copyright © Linux教程網 All Rights Reserved