1、LVS簡介linux
LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集羣系統。本項目在1998年5月由章文嵩博士成立,是中國國內最先出現的自由軟件項目之一。在linux內存2.6中,它已經成爲內核的一部分,在此以前的內核版本則須要從新編譯內核。算法
LVS主要用於多服務器的負載均衡。它工做在網絡層,能夠實現高性能,高可用的服務器集羣技術。可把許多低性能的服務器組合在一塊兒造成一個超級服務器,實現容量的擴張和伸縮。配置很是簡單,且有多種負載均衡的方法。穩定可靠,即便在集羣的服務器中某臺服務器沒法正常工做,也不影響總體效果。bash
2、LVS組件服務器
ipvs:是一個框架,工做於內核中,結合netfilter代碼上的INPUT鉤子函數,根據用戶定義的ipvs規則完成轉發,使請求不進入用戶空間中。網絡
一旦用戶請求進入用戶空間,就意味着每個用戶請求的連接都須要維持一個套接字文件,單主機套接字文件數最多了65535個。因爲LVS工做在內核空間中,無需進入用戶空間,因此能夠突破套接字的限制。session
ipvsadm:是一個用戶空間管理器,用於生成ipvs在INPUT鉤子函數中的規則。
負載均衡
3、LVS IP地址命名規範框架
在LVS集羣中,咱們必須基於節點在集羣內的角色來區別不一樣種類的ip地址,在一個集羣內有四種基本的ip地址類型。curl
①、虛擬ip地址(VIP)
tcp
Director用於向客戶端計算機提供服務的ip地址
用於客戶端計算機鏈接由集羣提供的服務的ip地址叫作虛擬ip地址(VIP),VIP是鏈接Director到常規公共網絡的網卡上的ip別名或從屬ip地址。LVS VIP很重要,由於它是客戶端計算機鏈接集羣時要用到的,客戶端計算機從它們的ip地址向VIP地址發送數據包訪問集羣服務,而後你告訴客戶端計算機使用這個VIP地址的服務名(如DNS、DDNS、WINS、LDAP或NIS),這是客戶端計算機要使用集羣服務常須要知道的惟一名字或地址。(客戶端計算機不知道集羣內剩下的ip地址)
②、真實ip地址(RIP)
用在集羣節點上的ip地址
在LVS術語中,向外部世界提供服務的節點叫作真實服務器,所以在真實服務器上使用的ip地址叫作真實ip地址(RIP)。
RIP地址是分配給鏈接真實服務器到同一網絡上Director的網卡的永久性ip地址,這個網絡爲集羣網絡或Director/真實服務器網絡(D/RIP網絡),Director使用RIP地址在D/RIP網絡上進行正常的網絡通信,可是隻有Director須要知道如何與這個ip地址對話。
③、Director的ip地址(DIP)
Director用於鏈接D/RIP網絡的ip地址
Director的ip地址(DIP)用在鏈接Director到D/RIP網絡的網卡上的,在Director的VIP上接收訪問集羣服務的請求,這些請求經過DIP轉發出去抵達各個集羣節點,DIP和VIP能夠處於同一塊網卡上。
④、客戶端計算機的ip地址(CIP)
分配給客戶端計算機的ip地址,它用做向集羣發送請求的源ip地址
客戶端計算機的ip地址(CIP)多是一個本地的、與VIP在同一網絡的私有ip地址,或者是一個因特網上的公共ip地址。
LVS集羣簡圖(LVS/NAT)和各IP分佈簡圖(點擊放大查看)
4、LVS的類型
①、LVS/NAT類型
客戶經過Virtual IP Address(虛擬服務的IP地址)訪問網絡服務時,請求報文到達調度器,調度器根據鏈接調度算法從一組真實服務器中選出一臺服務器,將報文的目標地址 Virtual IP Address 改寫成選定服務器的地址,報文的目標端口改寫成選定服務器的相應端口,最後將修改後的報文發送給選出的服務器。同時,調度器在鏈接 Hash 表中記錄這個鏈接,當這個鏈接的下一個報文到達時,從鏈接Hash表中能夠獲得原選定服務器的地址和端口,進行一樣的改寫操做,並將報文傳給原選定的服務 器。當來自真實服務器的響應報文通過調度器時,調度器將報文的源地址和源端口改成Virtual IP Address和相應的端口,再把報文發給用戶。
當使用VS/NAT方法時,若是有大量的響應數據通過調度器,調度器將成爲整個集羣的瓶頸
LVS NAT的特性
1.RS的應該使用私有地址
2.RS的網關必須指向DIP
3.RIP和DIP必須在同一網段內
4.請求和響應的報文都得通過Director,在高負載場景中,Director極可能成爲性能憑藉
5.支持端口映射
6.RS可使用任意支持集羣服務的OS
②、LVS/DR類型
調度器和服務器組都必須在物理上有一個網卡經過不分斷的局域網相連,如經過交換機或者高速的HUB相連。VIP地址爲調度器和服務器 組共享,調度器配置的VIP地址是對外可見的,用於接收虛擬服務的請求報文;全部的服務器把VIP地址配置在各自的Non-ARP網絡設備上,它對外面是 不可見的,只是用於處理目標地址爲VIP的網絡請求。在VS/DR中,調度器根據各個服務器的負載狀況,動態地選擇一臺服務器,不修改也不封裝IP報文, 而是將數據幀的MAC地址改成選出服務器的MAC地址,再將修改後的數據幀在與服務器組的局域網上發送。由於數據幀的MAC地址是選出的服務器,因此服務 器確定能夠收到這個數據幀,從中能夠得到該IP報文。當服務器發現報文的目標地址VIP是在本地的網絡設備上,服務器處理這個報文,而後根據路由表將響應 報文直接返回給客戶。
LVS DR類型的特性
1.RS可使用私有地址,還可使用公網地址,此時能夠直接經過互聯網連入RS,以實現配置、監控等
2.RS的網關必定不能指向DIP
3.RS跟Dirctory要在同一物理網絡內(不能有路由器分隔)
4.請求報文通過Directory,但響應報文必定不通過Director
5.不支持端口映射
6.RS可使用大多數的操做系統
③、LVS/TUN類型
LVS/TUN 的鏈接調度和管理與 VS/NAT 中的同樣,只是它的報文轉發方法不一樣。調度器根據各個服務器的負載狀況,動態地選擇一 臺服務器,將請求報文封裝在另外一個IP報文中,再將封裝後的IP報文轉發給選出的服務器;服務器收到報文後,先將報文解封得到原來目標地址爲VIP的報 文,服務器發現VIP地址被配置在本地的IP隧道設備上,因此就處理這個請求,而後根據路由表將響應報文直接返回給客戶。
LVS TUN類型(IP隧道)的特性
1.RIP,DIP,VIP都得是公網地址
2.RS的網關不會指向也不可能指向DIP
3.請求報文通過Directory,但響應報文必定不通過Director
4.不支持端口映射
5.RS的OS必須得支持隧道功能
5、LVS的調度方法
①、靜態方法:僅根據算法自己進行調度
輪叫調度(Round Robin)(簡稱rr)
調度器經過「輪叫」調度算法將外部請求按順序輪流分配到集羣中的真實服務器上,它均等地對待每一臺服務器,而無論服務器上實際的鏈接數和系統負載。
加權輪叫(Weighted Round Robin)(簡稱wrr)
調度器經過「加權輪叫」調度算法根據真實服務器的不一樣處理能力來調度訪問請求。這樣能夠保證處理能力強的服務器能處理更多的訪問流量。調度器能夠自動問詢真實服務器的負載狀況,並動態地調整其權值。
源地址散列(Source Hashing)(SH)
「源地址散列」調度算法根據請求的源IP地址,做爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,不然返回空。
目標地址散列(Destination Hashing)(DH)
「目標地址散列」調度算法根據請求的目標IP地址,做爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,不然返回空。
②、動態方法:根據算法及RS當前的負載狀態
在TCP協議中,某一個連接可能有兩種狀態,活動連接(Active):正處於數據傳輸,非活動連接(Inactive):數據傳輸結束,但連接沒有斷開
最少連接(Least Connections)(LC)
調度器經過「最少鏈接」調度算法動態地將網絡請求調度到已創建的連接數最少的服務器上。若是集羣系統的真實服務器具備相近的系統性能,採用「最小鏈接」調度算法能夠較好地均衡負載。
Overhead=Active*256+Inactive,結果中,小的將成爲下一個調度對象。
加權最少連接(Weighted Least Connections)(WLC)
在集羣系統中的服務器性能差別較大的狀況下,調度器採用「加權最少連接」調度算法優化負載均衡性能,具備較高權值的服務器將承受較大比例的活動鏈接負載。調度器能夠自動問詢真實服務器的負載狀況,並動態地調整其權值。
Overhead=(Active*256+Inactive)/weight,結果中,小的將成爲下一個調度對象。
基於局部性的最少連接(Locality-Based Least Connections)(LBLC)
「基於局部性的最少連接」調度算法是針對目標IP地址的負載均衡,目前主要用於Cache集羣系統。該算法根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處於一半的工做負載,則用「最少連接」 的原則選出一個可用的服務器,將請求發送到該服務器。
帶複製的基於局部性最少連接(Locality-Based Least Connections with Replication)(LBLCR)
「帶複製的基於局部性最少連接」調度算法也是針對目標IP地址的負載均衡,目前主要用於Cache集羣系統。它與LBLC算法的不一樣之處是它要維護從一個目標 IP地址到一組服務器的映射,而LBLC算法維護從一個目標IP地址到一臺服務器的映射。該算法根據請求的目標IP地址找出該目標IP地址對應的服務器組,按「最小鏈接」原則從服務器組中選出一臺服務器,若服務器沒有超載,將請求發送到該服務器;若服務器超載,則按「最小鏈接」原則從這個集羣中選出一臺服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以下降複製的程度。
最短的指望的延遲(Shortest Expected Delay Scheduling SED)(SED)
基於wlc算法。Overhead=(Active+1)*256/weight,結果中,小的將成爲下一個調度對象。
最少隊列調度(Never Queue Scheduling NQ)(NQ)
無需隊列。若是有臺 realserver的鏈接數=0就直接分配過去,不須要在進行sed運算。所有分配後進行sed算法。
補充:Session持久機制
1.Session綁定:始終將統一請求者的鏈接定向至統一RS(第一次請求時仍有調度選擇):沒有容錯哦能力,有損均衡效果
2.session複製:在RS之間經過多播或廣播同步session,所以,每一個RS持集羣中全部的session;對於大服務器集羣環境不適用
3.session服務器:利用單獨部署的服務器來統一管理session
[root@localhost ~]# grep -C 10 -i "ipvs" /boot/config-2.6.32-573.el6.x86_64 CONFIG_IP_SET_HASH_IPPORTNET=m CONFIG_IP_SET_HASH_NET=m CONFIG_IP_SET_HASH_NETPORT=m CONFIG_IP_SET_LIST_SET=m CONFIG_IP_VS=m CONFIG_IP_VS_IPV6=y # CONFIG_IP_VS_DEBUG is not set CONFIG_IP_VS_TAB_BITS=12 # # IPVS transport protocol load balancing support(支持的傳輸協議) # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y CONFIG_IP_VS_PROTO_AH_ESP=y CONFIG_IP_VS_PROTO_ESP=y CONFIG_IP_VS_PROTO_AH=y CONFIG_IP_VS_PROTO_SCTP=y # # IPVS scheduler(支持的調度算法) # CONFIG_IP_VS_RR=m CONFIG_IP_VS_WRR=m CONFIG_IP_VS_LC=m CONFIG_IP_VS_WLC=m CONFIG_IP_VS_LBLC=m CONFIG_IP_VS_LBLCR=m CONFIG_IP_VS_DH=m CONFIG_IP_VS_SH=m CONFIG_IP_VS_SED=m
6、ipvsadm的使用
管理集羣服務
ipvsadm -A|E -t|u|f service-address [-s scheduler]
-A: 添加一個集羣服務
-t:tcp
-u:udp
-f: firewall make。防火牆標記,讓ipvs跟iptable的mangle表一塊工做,基於防火牆標記來實現集羣服務,一般應用於將兩個或以上的服務綁定爲一個服務進行處理時使用
service-address:-t IP:port。-u ip:port。-f firewall_mark
-s 調度算法,默認爲wlc(最理想的調度方法)
-p: timeout persistent connection 持久鏈接
-E:修改定義過的集羣服務
ipvsadm -D -t|u|f service-address
-D: 刪除指定的集羣服務
管理集羣服務中的Real Server1
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-a:向指定的CS中添加RS
-t|-u|-f service-address:指明將RS添加至那個Cluster Service 中
-r:指定RS,能夠包含{IP[:port]},只有支持端口映射的LVS類型才容許此處使用跟集羣服務中不一樣的端口
-g:Gateway(指定lvs類型爲DR,默認值)
-i:ipip(指定lvs類型爲TUN)
-m:masquerade(指定lvs類型爲NAT)
-w:指定RS權重(省略權重爲1)
-e:修改指定的RS屬性
ipvsadm -d -t|u|f service-address -r server-address
-d:在指定的集羣服務中刪除一個指定的RS
清空和查看:
ipvsadm -C
清空全部的集羣服務
ipvsadm -L|l [options]
-n: numeric,基於數字格式顯示地址和端口;
-c: connection,顯示ipvs鏈接;
--stats:統計數據
--rate: 速率
--exact: 精確值
--timeout:顯示tcp、udp、tcpfind會話的超時時長
--daemon:守護進程的信息
--sort:對虛擬服務進行排序,默認爲升序
保存和重載:
ipvsadm -R
ipvsadm -S [-n]
置零計數器:
ipvsadm -Z [-t|u|f service-address]
7、LVS/NAT類型實驗步驟
①、拓撲圖
②、實驗步驟
[root@localhost ~]# yum install ipvsadm #安裝ipvsamd管理工具實現對ipvs規則的添加 [root@localhost ~]# echo 1 >/proc/sys/net/ipv4/ip_forward [root@localhost ~]# ipvsadm -A -t 192.168.0.88:80 -s rr [root@localhost ~]# ipvsadm -a -t 192.168.0.88:80 -r 172.16.0.8:80 -m [root@localhost ~]# ipvsadm -a -t 192.168.0.88:80 -r 172.16.0.9:80 -m [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 TCP 192.168.0.88:80 rr -> 172.16.0.8:80 Masq 1 0 0 -> 172.16.0.9:80 Masq 1 0 0 #這樣就定義好了以rr調度算法的nat類型LVS
③、測試實驗結果(這裏爲了看出實驗結果,172.16.0.8首頁內容爲MY WEB2,172.16.0.9首頁內容爲MY WEB1):
[root@localhost ~]# curl http://192.168.0.88 MY WEB2 [root@localhost ~]# curl http://192.168.0.88 MY WEB1 [root@localhost ~]# curl http://192.168.0.88 MY WEB2 [root@localhost ~]# curl http://192.168.0.88 MY WEB1 [root@localhost ~]# curl http://192.168.0.88 MY WEB2 [root@localhost ~]# curl http://192.168.0.88 MY WEB1 [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 TCP 192.168.0.88:80 rr -> 172.16.0.8:80 Masq 1 0 3 -> 172.16.0.9:80 Masq 1 0 3 #由於咱們使用了rr調度算法,因此每次訪問都會進行輪詢
ipvs的機制和netfilter的機制同樣,都是運行在內核內存中,因此咱們定義的規則重啓服務器後將會消失,因此建議配置、測試沒問題後對規則進行導出保存
[root@localhost ~]# ipvsadm -S > /etc/sysconfig/ipvsadm [root@localhost ~]# cat /etc/sysconfig/ipvsadm -A -t 192.168.0.88:http -s rr -a -t 192.168.0.88:http -r 172.16.0.8:http -m -w 1 -a -t 192.168.0.88:http -r 172.16.0.9:http -m -w 1 [root@localhost ~]# ipvsadm -R < /etc/sysconfig/ipvsadm #把規則導入到ipvs中
8、LVS/DR類型實驗步驟
①、拓撲圖
②、實驗步驟
Director服務器上配置
[root@localhost network-scripts]# ifconfig eno16777736:0 192.168.0.8/32 broadcast 192.168.0.8 up [root@localhost network-scripts]# route add -host 192.168.0.8 dev eno16777736:0 #配置Director的VIP地址,並指定掩碼位32爲,僅廣播給本身 [root@localhost ~]# ipvsadm -A -t 192.168.0.8:80 -s rr [root@localhost ~]# ipvsadm -a -t 192.168.0.8:80 -r 192.168.0.21 -g [root@localhost ~]# ipvsadm -a -t 192.168.0.8:80 -r 192.168.0.22 -g [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 TCP 192.168.0.8:80 rr -> 192.168.0.21:80 Route 1 0 0 -> 192.168.0.22:80 Route 1 0 0
Real server服務器上配置
[root@wlw ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@wlw ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore [root@wlw ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce [root@wlw ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce #讓其不接受arp廣播和不通告arp廣播 [root@wlw ~]# ifconfig lo:0 192.168.0.8/32 broadcast 192.168.0.8/32 up [root@wlw ~]# route add -host 192.168.0.8 dev lo:0
③、測試實驗結果(這裏爲了看出實驗結果,192.168.0.21首頁內容爲MY WEB2,192.168.0.22首頁內容爲MY WEB1):
[root@localhost ~]# curl http://192.168.0.8 MY WEB2 [root@localhost ~]# curl http://192.168.0.8 MY WEB1 [root@localhost ~]# curl http://192.168.0.8 MY WEB2 [root@localhost ~]# curl http://192.168.0.8 MY WEB1 [root@localhost ~]# curl http://192.168.0.8 MY WEB2 [root@localhost ~]# curl http://192.168.0.8 MY WEB1 [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 TCP 192.168.0.88:80 rr -> 172.16.0.8:80 Route 1 0 3 -> 172.16.0.9:80 Route 1 0 3