LVS的英文全稱是Linux Virtual Server,即Linux虛擬服務器,也是少許開源軟件中國人開發的軟件。如今已經集成到linux內核中,lvs是一個高效率的負載均衡器,能經過自身的算法將互聯網中大量的請求按照分配到不通的機器上進行訪問。從而達到服務器的高效利用。再好的軟件也有短板,lvs雖然高效,可是功能單一,爲了知足lvs的功能,能夠經過ldirectord彌補lvs的短板。html
當一家公司隨着業務擴展,訪問量增長,傳統的架構已經不能知足當前的業務,須要對提供服務的服務器進行擴展,這個時候就須要n臺服務器組成一個服務器組,由組裏面的服務器來進行服務的提供,這個組就叫作集羣,集羣是有了,那麼問題也就來了,這集羣裏面的機器服務部署的同樣的,用戶訪問的時候我應該由那臺機器去提供服務了,若是服務提供的方式是組裏面的第一臺先提供10萬的訪問量,到11的時候由組裏面的第二臺機器來提供服務,那麼必然會出現部分機器始終處於高運做中,部分機器又沒有提供服務,屬於閒置狀態。爲了解決這個問題,lvs就出現了,lvs就能夠均勻的或者按照必定比例的形式自由調度用戶的訪問量,再也不出現部分忙部分閒置的狀態。 分佈式系統:fastdfs,ceph,lustre,hadoop,giusterfs,spark等。linux
在集羣的負載均衡功能上延伸了一些硬件和軟件的工具,例如,硬件的F5,citrix netscaler,A10,軟件的:lvs,nginx,haproxy,ats,peribal,pound等。nginx
負載均衡的會話保持:算法
session sticky綁定後端
若是是用戶登陸訪問了一個網頁,在從頁面1點擊到頁面2的時候,頁面會從新加載,若是沒有會話保持,頁面2用戶的訪問可能會被調度到第二臺機器上,然而用戶是沒有在第二臺機器上登陸過的,這個時候用戶要訪問頁面2就須要從新登陸,會話保持至關於建議了一張表,專門記錄訪問的ip,當頁面請求始終來自一個ip的話,就始終幫你往第一次登陸的機器上調度,會話保持有一個致命傷就是若是不少機器出去訪問的時候都是一個ip的話,這個負載均衡就會變得不夠靈活。服務器
cookiecookie
既然session sticky存在缺陷,那咱們就點對點的記錄訪問信息,當用戶訪問服務器會隨之生成cookie的信息併發送到訪問者的機器上,當這個機器下次在訪問的時候會帶上這個cookie的信息,訪問機和被訪問機拿到至關於一式兩份的合同同樣,下次訪問直接就給調度到cookie生成的機器上。網絡
session replicationsession
每臺機器擁有所有的session,當用戶訪問機器1的時候,產生的session會被服務器複製發送到組內的所有機器,這樣即便你訪問到了2機器,也不會須要用戶從新登陸,這種類型的方式不適合用戶量訪問過大的場景,比較佔用內存。架構
session server
專門的session服務器,在服務器的後端專門搭建一個存session的服務器,用戶訪問的session都存在專門的服務器上便可,前面服務器須要取session的時候就去找session服務器就好了。
服務能負載均衡了,可是節點故障如何解決了,這個時候就須要keepalived等高可用的服務來解決。
VS:virtual server(負責調度)
RS:real server(負責提供真正的服務)
L4:四層路由器或交換機
VS根據請求報文的目標ip和目標協議及端口將其調度轉發至某RS,這個調度的過程是經過算法來實現的。
lvs相關的命令:
ipvsadm:用戶空間的命令行工具,規則管理器,須要單獨安裝
ipvs:直接工做在內核的框架
lvs集羣的類型:
lvs-nat:經過請求報文中的客戶端目標ip和端口修改成某跳出的rs的ip和端口實現轉發,這種類型下rs的ip和端口應該在同一ip網絡,請求的報文必須由vs轉發,vs容易出現性能瓶頸,支持端口映射,最後lvs必須是linux服務器,rs能夠是任意操做系統。
lvs-dr:直接路由模式,也是lvs的默認模式,經過請求報文從新封裝一個mac首部進行轉發。
lvs-tun:在原請求ip報文以外新加一個ip首部
lvs-fullnat:修改請求報文的源和目標ip
lvs的調度算法:
靜態調度算法:(根據算法自己進行調度,不考慮服務器的壓力)
RR:輪詢算法
WRR:加權輪詢(根據設置的權重來進行分派)
SH:源哈希算法,(session綁定)
DH:目標地址哈希算法,(查看上次源地址被調度在那臺機器上,下次過來仍是往這臺機器上調度)
動態調度算法:(根據每一個rs當前的負載均衡狀態及調度算法進行調度)
LC:適用於長鏈接應用(最少鏈接,檢測後臺服務器的連接數,連接數越少就往越少的機器調度,計算公式:activeconns(活動連接)*256+inactiveconns(不活動連接),根據這個公式計算出相應的指,指越小,就表明鏈接越少,這種算法是不會考慮到後臺機器的配置的,會形成原本性能很好的機器的連接數反而越少的狀況。
WLC:默認調度方法,在LC的基礎上加上了一個權重,計算公式:activeconns(活動連接)*256+inactiveconns(不活動連接)/權重,解決上面因機器配置致使的分配不合理的狀況。
wlc也存在不餓合理的狀況,例如全部機器都是新搭建的,沒有用戶訪問的狀況下,上面的計算公式計算出來的指都是0,這種狀況下會分配給第一臺,剛好第一臺機器性能很差,又將面臨上面的機器配置的問題。
SED:初始鏈接高權重優先,既然wlc會面臨第一次或者計算公式計算出來的指沒法評判出那個優先級高的時候,那麼就在原有基礎上加一個初始權重高的提供服務,(activeconns+1(活動連接))*256/權重。
sed也存在一個問題,就是按照公式計算,例如權重高的機器設置權重10,低性能的機器爲1,權重10第一次訪問的數據是25.6,第二次是51.2,權重1機器第二次計算就是512了,那這樣算下去,權重高的機器會一直在提供服務,權重低的機器就一直在等待。
NQ:第一輪均勻分配,後續SED,上面的計算公式
LBLC:根據負載狀況進程正向代理。
LBLCR:帶複製功能的LBLC,解決LBLC的負載不均問題。DH,LBLC和LBLCR運營商用的比較多。
[root@ansible ~]# grep -i -C 10 'ipvs' /boot/config-2.6.32-573.el6.x86_64 # 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 CONFIG_IP_VS_NQ=m
要配置ipvs須要安裝ipvsadm的包
[root@ansible ~]# rpm -ql ipvsadm /etc/rc.d/init.d/ipvsadm /etc/sysconfig/ipvsadm-config 配置文件 /sbin/ipvsadm 主程序 /sbin/ipvsadm-restore 規則重置工具 /sbin/ipvsadm-save 規則保存工具 /usr/share/doc/ipvsadm-1.26 /usr/share/doc/ipvsadm-1.26/README /usr/share/man/man8/ipvsadm-restore.8.gz /usr/share/man/man8/ipvsadm-save.8.gz /usr/share/man/man8/ipvsadm.8.gz [root@ansible ~]#
ipvsadm的核心功能就是對集羣服務的增,刪,改,
增刪改:ipvsadm -A(增長)|E (修改)|D(刪除) -t|u|f service-address(具體服務器的ip) -s (調度算法,默認是WLC算法) -p
-t:tcp協議 ,VIP:TCP_PORT(tcp的端口) u:udp協議 ,VIP:UDP_PORT -f:firewall mark
對集羣的rs的增,刪,改
增刪改:ipvsadm -a(增長)|e(修改)|d(刪除) -t|u|f service-address -r server-address(集羣服務器地址) -g|i|m -w(權重)
-g:getway,dr模型,默認 -i:tun模型 -m:nat模型
網絡環境:
client:182.82.0.200(橋接,CIP)
lvs:192.168.219.200(DIP),182.82.0.200(VIP)
real service:192.168.219.137和192.168.219.138(RIP),配置網關指向lvs機器
修改ip_forward配置
[root@lvs network-scripts]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf [root@lvs network-scripts]# sysctl -p 讓其生效 net.ipv4.ip_forward = 0 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 net.ipv4.tcp_syncookies = 1 kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 68719476736 kernel.shmall = 4294967296 net.ipv4.ip_forward = 1 [root@lvs network-scripts]# sysctl -a | grep ip_f net.ipv4.ip_forward = 1 net.ipv4.ip_forward_use_pmtu = 0 [root@lvs network-scripts]#
關閉防火牆和selinux,在lvs服務器上安裝ipvsadm的包,在real上搭建httpd服務,提供網頁,在lvs機器上訪問測試
[root@lvs network-scripts]# curl 192.168.219.137 <h1 hello woord! </h1 [root@lvs network-scripts]# curl 192.168.219.138 <h1 hello lvs </h1 [root@lvs network-scripts]#
[root@localhost yum.repos.d]# ipvsadm -A -t 182.82.0.200:80 -s rr 採用rr模式 [root@localhost yum.repos.d]# ipvsadm -a -t 182.82.0.200:80 -r 192.168.219.138 -m [root@localhost yum.repos.d]# ipvsadm -a -t 182.82.0.200:80 -r 192.168.219.137 -m 由於咱們採用的是rr模式,-m就不須要指定權重,輪詢調度 [root@localhost yum.repos.d]# ipvsadm -Ln 查看咱們剛纔配置的信息 IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 182.82.0.200:80 rr -> 192.168.219.137:80 Masq 1 0 0 -> 192.168.219.138:80 Masq 1 0 0 [root@clent Desktop]# curl 182.82.0.200 <h1 hello lvs </h1 [root@clent Desktop]# curl 182.82.0.200 <h1 hello woord! </h1 [root@clent Desktop]# curl 182.82.0.200 <h1 hello lvs </h1 [root@clent Desktop]# curl 182.82.0.200 <h1 hello woord! </h1 [root@clent Desktop]# 能夠看到提供服務的機器是輪換來進行的
[root@localhost Desktop]# netstat -anptu | grep 8080 tcp 0 0 :::8080 :::* LISTEN 3541/httpd tcp 0 0 ::ffff:192.168.219.138:8080 ::ffff:182.82.0.100:48889 TIME_WAIT - tcp 0 0 ::ffff:192.168.219.138:8080 ::ffff:182.82.0.100:48894 TIME_WAIT - tcp 0 0 ::ffff:192.168.219.138:8080 ::ffff:182.82.0.100:48891 TIME_WAIT - tcp 0 0 ::ffff:192.168.219.138:8080 ::ffff:182.82.0.100:48886 TIME_WAIT - tcp 0 0 ::ffff:192.168.219.138:8080 ::ffff:182.82.0.100:48896 TIME_WAIT - 修改real服務器端口爲8080 [root@localhost Desktop]# ipvsadm -a -t 182.82.0.200:80 -r 192.168.219.138:8080 -m [root@localhost Desktop]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 182.82.0.200:80 rr -> 192.168.219.137:80 Masq 1 0 0 -> 192.168.219.138:8080 Masq 1 0 0 [root@localhost Desktop]# 修改lvs服務器的端口映射成8080, [root@www8080 Desktop]# curl 182.82.0.200 <h1 hello woord! </h1 [root@www8080 Desktop]# curl 182.82.0.200 <h1 hello lvs </h1 [root@www8080 Desktop]# curl 182.82.0.200 <h1 hello woord! </h1 [root@www8080 Desktop]# curl 182.82.0.200 <h1 hello lvs </h1 [root@www8080 Desktop]# curl 182.82.0.200 <h1 hello woord! </h1 [root@www8080 Desktop]# curl 182.82.0.200 <h1 hello lvs </h1 [root@www8080 Desktop]#client進行訪問
[root@localhost Desktop]# ipvsadm -E -t 182.82.0.200:80 -s wrr 修改以前的rr格式爲wrr格式 [root@localhost Desktop]# ipvsadm -d -t 182.82.0.200:80 -r 192.168.219.138:8080 [root@localhost Desktop]# ipvsadm -a -t 182.82.0.200:80 -r 192.168.219.138:8080 -m -w 3 [root@localhost Desktop]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 182.82.0.200:80 wrr -> 192.168.219.137:80 Masq 1 0 4 -> 192.168.219.138:8080 Masq 3 0 5 [root@localhost Desktop]# 修改138的real服務器的信息,增長權重爲3.默認是1 [root@www8080 Desktop]# curl 182.82.0.200 <h1 hello lvs </h1 You have new mail in /var/spool/mail/root [root@www8080 Desktop]# curl 182.82.0.200 <h1 hello lvs </h1 [root@www8080 Desktop]# curl 182.82.0.200 <h1 hello lvs </h1 [root@www8080 Desktop]# curl 182.82.0.200 <h1 hello woord! </h1 [root@www8080 Desktop]# curl 182.82.0.200 <h1 hello lvs </h1 [root@www8080 Desktop]# curl 182.82.0.200 <h1 hello lvs </h1 [root@www8080 Desktop]# curl 182.82.0.200 <h1 hello lvs </h1 [root@www8080 Desktop]# curl 182.82.0.200 <h1 hello woord! </h1 [root@www8080 Desktop]# 能夠看到訪問138三次,訪問1次137real機器
[root@localhost Desktop]# ipvsadm -E -t 182.82.0.200:80 -s sh [root@localhost Desktop]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 182.82.0.200:80 sh -> 192.168.219.137:80 Masq 1 0 0 -> 192.168.219.138:8080 Masq 3 0 0 [root@localhost Desktop]# 修改wrr模式爲sh模式 [root@www8080 Desktop]# curl 182.82.0.200 <h1 hello lvs </h1 [root@www8080 Desktop]# curl 182.82.0.200 <h1 hello lvs </h1 [root@www8080 Desktop]# curl 182.82.0.200 <h1 hello lvs </h1 [root@www8080 Desktop]# curl 182.82.0.200 <h1 hello lvs </h1 [root@www8080 Desktop]#能夠看到只要是同一個地址進來的,就一直調度到同一臺real服務器。
[root@localhost Desktop]# ipvsadm -E -t 182.82.0.200:80 -s dh [root@localhost Desktop]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 182.82.0.200:80 dh -> 192.168.219.137:80 Masq 1 0 0 -> 192.168.219.138:8080 Masq 3 0 0 [root@localhost Desktop]# [root@www8080 Desktop]# curl 182.82.0.200/index.html <h1 hello lvs </h1 [root@www8080 Desktop]# curl 182.82.0.200/index.html <h1 hello lvs </h1 [root@www8080 Desktop]# curl 182.82.0.200/index.html <h1 hello lvs </h1 [root@www8080 Desktop]# curl 182.82.0.200/index.html <h1 hello lvs </h1 [root@www8080 Desktop]# 目標地址哈希和源地址哈希能夠是相反的,目標地址內容不一致調度可能就給調度帶另外的機器上去了
lvs的擴展命令
清空全部定義的內容:ipvsadm -C
清空計數器:ipvsadm -Z -t|uf 調度器地址
查看:ipvsadm -exact:擴展信息,精準值 -c:當前ipvs的鏈接輸出 -stats:統計信息 -rate:輸出速率信息
root@lvs Desktop]# ipvsadm -Ln -c IPVS connection entries pro expire state source virtual destination TCP 01:48 TIME_WAIT 182.82.0.100:43728 182.82.0.200:80 192.168.219.137:80 TCP 01:48 TIME_WAIT 182.82.0.100:43730 182.82.0.200:80 192.168.219.137:80 TCP 01:49 TIME_WAIT 182.82.0.100:43733 182.82.0.200:80 192.168.219.138:8080 TCP 01:49 TIME_WAIT 182.82.0.100:43734 182.82.0.200:80 192.168.219.137:80 TCP 01:49 TIME_WAIT 182.82.0.100:43735 182.82.0.200:80 192.168.219.138:8080 TCP 01:49 TIME_WAIT 182.82.0.100:43732 182.82.0.200:80 192.168.219.137:80 TCP 01:48 TIME_WAIT 182.82.0.100:43729 182.82.0.200:80 192.168.219.138:8080 TCP 01:47 TIME_WAIT 182.82.0.100:43727 182.82.0.200:80 192.168.219.138:8080 TCP 01:49 TIME_WAIT 182.82.0.100:43731 182.82.0.200:80 192.168.219.138:8080 能夠看到訪問的ip流向信息
ipvs規則信息存放的文件
ipvs鏈接信息存放的文件
[root@lvs Desktop]# cat /proc/net/ip_vs_conn Pro FromIP FPrt ToIP TPrt DestIP DPrt State Expires PEName PEData TCP B6520064 AB55 B65200C8 0050 C0A8DB8A 1F90 TIME_WAIT 115 TCP B6520064 AB57 B65200C8 0050 C0A8DB8A 1F90 TIME_WAIT 116 TCP B6520064 AB56 B65200C8 0050 C0A8DB89 0050 TIME_WAIT 116 TCP B6520064 AB54 B65200C8 0050 C0A8DB89 0050 TIME_WAIT 114 [root@lvs Desktop]# cat /proc/net/ip_vs IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP B65200C8:0050 rr -> C0A8DB8A:1F90 Masq 1 0 2 -> C0A8DB89:0050 Masq 1 0 2 [root@lvs Desktop]# 能夠看到鏈接的信息和規則信息