lvs


一、負載均衡LVS基本介紹

LVS是 Linux Virtual Server 的簡稱,也就是Linux虛擬服務器。這是一個由章文嵩博士發起的一個開源項目,它的官方網站是 http://www.linuxvirtualserver.org 現在 LVS 已經是 Linux 內核標准的一部分。使用 LVS 可以達到的技術目標是:通過 LVS 達到的負載均衡技術和 Linux 操作系統實現一個高性能高可用的 Linux 服務器集群,它具有良好的可靠性、可擴展性和可操作性。從而以低廉的成本實現最優的性能。LVS 是一個實現負載均衡集群的開源軟件項目,LVS架構從邏輯上可分為調度層、Server集群層和共享存儲。

 

LVS:
1、抗負載能力強。抗負載能力強、性能高,能達到F5硬件的60%;對內存和cpu資源消耗比較低
2、工作在網絡4層,通過vrrp協議轉發(僅作分發之用),具體的流量由linux內核處理,因此沒有流量的產生。
2、穩定性、可靠性好,自身有完美的熱備方案;(如:LVS+Keepalived)
3、應用范圍比較廣,可以對所有應用做負載均衡;
4、不支持正則處理,不能做動靜分離。
5、支持負載均衡算法:rr(輪循)、wrr(帶權輪循)、lc(最小連接)、wlc(權重最小連接)
6、配置 復雜,對網絡依賴比較大,穩定性很高。

 

Ngnix:
1、工作在網絡的7層之上,可以針對http應用做一些分流的策略,比如針對域名、目錄結構;
2、Nginx對網絡的依賴比較小,理論上能ping通就就能進行負載功能;
3、Nginx安裝和配置比較簡單,測試起來比較方便;
4、也可以承擔高的負載壓力且穩定,一般能支撐超過1萬次的並發;
5、對后端服務器的健康檢查,只支持通過端口來檢測,不支持通過url來檢測。
6、Nginx對請求的異步處理可以幫助節點服務器減輕負載;
7、Nginx僅能支持http、https和Email協議,這樣就在適用范圍較小。
8、不支持Session的直接保持,但能通過ip_hash來解決。、對Big request header的支持不是很好,
9、支持負載均衡算法:Round-robin(輪循)、Weight-round-robin(帶權輪循)、Ip-hash(Ip哈希)
10、Nginx還能做Web服務器即Cache功能。

 

HAProxy的特點是:
1、支持兩種代理模式:TCP(四層)和HTTP(七層),支持虛擬主機;
2、能夠補充Nginx的一些缺點比如Session的保持,Cookie的引導等工作
3、支持url檢測后端的服務器出問題的檢測會有很好的幫助。
4、更多的負載均衡策略比如:動態加權輪循(Dynamic Round Robin),加權源地址哈希(Weighted Source Hash),加權URL哈希和加權參數哈希(Weighted Parameter Hash)已經實現
5、單純從效率上來講HAProxy更會比Nginx有更出色的負載均衡速度。
6、HAProxy可以對Mysql進行負載均衡,對后端的DB節點進行檢測和負載均衡。
9、支持負載均衡算法:Round-robin(輪循)、Weight-round-robin(帶權輪循)、source(原地址保持)、RI(請求URL)、rdp-cookie(根據cookie)
10、不能做Web服務器即Cache。

 

二、LVS的組成

LVS 由2部分程序組成,包括 ipvs 和 ipvsadm。

1. ipvs(ip virtual server):一段代碼工作在內核空間,叫ipvs,是真正生效實現調度的代碼。
2. ipvsadm:另外一段是工作在用戶空間,叫ipvsadm,負責為ipvs內核框架編寫規則,定義誰是集群服務,而誰是后端真實的服務器(Real Server)

三、lvs的三種模式

 

VS/DR模式

 

 

 

①.客戶端將請求發往前端的負載均衡器,請求報文源地址是CIP,目標地址為VIP。

 

②.負載均衡器收到報文后,發現請求的是在規則里面存在的地址,那么它將目標MAC改為了RIP的MAC地址,並將此包發送給RS。

 

③.RS發現請求報文中的目的MAC是自己,就會將次報文接收下來,處理完請求報文后,將響應報文通過lo接口送給eth0網卡直接發送給客戶端。

 

注意:

 

需要設置lo接口的VIP不能響應本地網絡內的arp請求。

 

 

優點

 

和TUN(隧道模式)一樣,負載均衡器也只是分發請求,應答包通過單獨的路由方法返回給客戶端。與VS-TUN相比,VS-DR這種實現方式不需要隧道結構,因此可以使用大多數操作系統做為物理服務器。

 

DR模式的效率很高,但是配置稍微復雜一點,因此對於訪問量不是特別大的公司可以用haproxy/nginx取代。日1000-2000W PV或者並發請求1萬一下都可以考慮用haproxy/nginx。

 

缺點

 

所有 RS 節點和調度器 LB 只能在一個局域網里面。

 

VS/TUN模式

 

 

 

①.客戶端將請求發往前端的負載均衡器,請求報文源地址是CIP,目標地址為VIP。

 

②.負載均衡器收到報文后,發現請求的是在規則里面存在的地址,那么它將在客戶端請求報文的首部再封裝一層IP報文,將源地址改為DIP,目標地址改為RIP,並將此包發送給RS。

 

③.RS收到請求報文后,會首先拆開第一層封裝,然后發現里面還有一層IP首部的目標地址是自己lo接口上的VIP,所以會處理次請求報文,並將響應報文通過lo接口送給eth0網卡直接發送給客戶端。

 

注意:

 

需要設置lo接口的VIP不能在公網上出現。

 

優點

 

負載均衡器只負責將請求包分發給后端節點服務器,而RS將應答包直接發給用戶。所以,減少了負載均衡器的大量數據流動,負載均衡器不再是系統的瓶頸,就能處理很巨大的請求量,這種方式,一台負載均衡器能夠為很多RS進行分發。而且跑在公網上就能進行不同地域的分發。

 

缺點:

 

隧道模式的RS節點需要合法IP,這種方式需要所有的服務器支持”IP Tunneling”(IP Encapsulation)協議,服務器可能只局限在部分Linux系統上。

 

VS/NAT模式

 

 

 

①.客戶端將請求發往前端的負載均衡器,請求報文源地址是CIP(客戶端IP),后面統稱為CIP),目標地址為VIP(負載均衡器前端地址,后面統稱為VIP)。

 

②.負載均衡器收到報文后,發現請求的是在規則里面存在的地址,那么它將客戶端請求報文的目標地址改為了后端服務器的RIP地址並將報文根據算法發送出去。

 

③.報文送到Real Server后,由於報文的目標地址是自己,所以會響應該請求,並將響應報文返還給LVS。

 

④.然后lvs將此報文的源地址修改為本機並發送給客戶端。

 

注意:

 

在NAT模式中,Real Server的網關必須指向LVS,否則報文無法送達客戶端

 

 

優點:

 

集群中的物理服務器可以使用任何支持TCP/IP操作系統,只有負載均衡器需要一個合法的IP地址。

 

缺點

 

擴展性有限。當服務器節點(普通PC服務器)增長過多時,負載均衡器將成為整個系統的瓶頸,因為所有的請求包和應答包的流向都經過負載均衡器。當服務器節點過多時,大量的數據包都交匯在負載均衡器那,速度就會變慢!

 

七、LVS的八種調度算法

1. 輪叫調度 rr
這種算法是最簡單的,就是按依次循環的方式將請求調度到不同的服務器上,該算法最大的特點就是簡單。輪詢算法假設所有的服務器處理請求的能力都是一樣的,調度器會將所有的請求平均分配給每個真實服務器,不管后端 RS 配置和處理能力,非常均衡地分發下去。

2. 加權輪叫 wrr
這種算法比 rr 的算法多了一個權重的概念,可以給 RS 設置權重,權重越高,那么分發的請求數越多,權重的取值范圍 0 – 100。主要是對rr算法的一種優化和補充, LVS 會考慮每台服務器的性能,並給每台服務器添加要給權值,如果服務器A的權值為1,服務器B的權值為2,則調度到服務器B的請求會是服務器A的2倍。權值越高的服務器,處理的請求越多。

3. 最少鏈接 lc
這個算法會根據后端 RS 的連接數來決定把請求分發給誰,比如 RS1 連接數比 RS2 連接數少,那么請求就優先發給 RS1 

4. 加權最少鏈接 wlc
這個算法比 lc 多了一個權重的概念。

5. 基於局部性的最少連接調度算法 lblc
這個算法是請求數據包的目標 IP 地址的一種調度算法,該算法先根據請求的目標 IP 地址尋找最近的該目標 IP 地址所有使用的服務器,如果這台服務器依然可用,並且有能力處理該請求,調度器會盡量選擇相同的服務器,否則會繼續選擇其它可行的服務器

6. 復雜的基於局部性最少的連接算法 lblcr
記錄的不是要給目標 IP 與一台服務器之間的連接記錄,它會維護一個目標 IP 到一組服務器之間的映射關系,防止單點服務器負載過高。

7. 目標地址散列調度算法 dh
該算法是根據目標 IP 地址通過散列函數將目標 IP 與服務器建立映射關系,出現服務器不可用或負載過高的情況下,發往該目標 IP 的請求會固定發給該服務器。

 

8. 源地址散列調度算法 sh
與目標地址散列調度算法類似,但它是根據源地址散列算法進行靜態分配固定的服務器資源。

DR模式
    
    direct_server:192.168.254.17
    
    real_server:192.168.254.18
    real_server:192.168.254.19
    
    #vip為虛擬服務ip
    vip:192.168.254.250    
    
    
direct_server:
    yum install ipvsadm

老板
direct_server:
    ipvsadm -C    #清除配置信息
    
    
    #添加對外提供的服務ip
    ipvsadm -A -t 192.168.254.250:80 -s rr    #-A為ADD   -t為tcp   -s rr為設置算法為輪叫算法
    
    #添加2台real_server主機
    ipvsadm -a -t 192.168.254.250:80 -r 192.168.254.18:80 -g #-a為add   -t為tcp   -r為realserver   -g為DR路由模式
    ipvsadm -a -t 192.168.254.250:80 -r 192.168.254.19:80 -g #-a為add   -t為tcp   -r為realserver   -g為DR路由模式
    
    #配置網卡的子網口為vip,ip地址為192.168.254.250
    ifconfig ens33:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255 up
    
    #添加路由(訪問192.168.254.250都走ens33:0這個網卡)
    route add -host 192.168.254.250 dev ens33:0

員工1 | 員工2
real_server:
    #在回環地址的子網口上配置服務ip(vip)
    ifconfig lo:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255 up 
    
    #添加路由
    route add -host 192.168.254.250 dev lo:0

    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 "0">/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "0">/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "0">/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "0">/proc/sys/net/ipv4/conf/all/arp_announce
    
    
    arp_ignore:定義接收到ARP請求時的響應級別      
        0:默認,只用本地配置的有響應地址都給予響應       
        1:僅僅在目標IP是本地地址,並且是配置在請求進來的接口上的時候才給予響應
            (僅在請求的目標地址配置請求到達的接口上的時候,才給予響應)

    arp_announce:定義將自己的地址向外通告時的級別       
        0:默認,表示使用配置在任何接口的任何地址向外通告       
        1:盡量僅向目標網絡通告與其網絡匹配的地址       
        2:僅向與本地接口上地址匹配的網絡進行通告       

 nat配置

DS:橋接:192.168.31.100
        255.255.255.0
        192.168.31.1
   vmnet2:192.168.250.1
          255.255.255.0
RS1:192.168.250.2
    255.255.255.0
    192.168.250.1
RS2:192.168.250.3
    255.255.255.0
    192.168.250.1

#掛在本地鏡像
mount /dev/cdrom /mnt/
cd /mnt/Packages/

#安裝ipvsadm包
rpm -ivh ipvsadm-1.27-7.el7.x86_64.rpm

#開啟轉發模式
[root@db1 ~]# cat /proc/sys/net/ipv4/ip_forward 
0
[root@db1 ~]#echo 1 > /proc/sys/net/ipv4/ip_forward 
或者
vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1


#配置nat模式
ipvsadm
-A -t 192.168.31.100:80 -s rr
ipvsadm
-a -t 192.168.31.100:80 -r 192.168.250.2 -m
ipvsadm
-a -t 192.168.31.100:80 -r 192.168.250.3 -m
#如果想讓配置保存下來需要 #查看ipvsadm包的文件位置
[root@db1
~]# rpm -ql ipvsadm-1.27-7.el7.x86_64
/etc/sysconfig/ipvsadm-config
/usr/lib/systemd/system/ipvsadm.service
/usr/sbin/ipvsadm /usr/sbin/ipvsadm-restore
/usr/sbin/ipvsadm-save /usr/share/doc/ipvsadm-1.27
/usr/share/doc/ipvsadm-1.27/README /usr/share/man/man8/ipvsadm-restore.8.gz
/usr/share/man/man8/ipvsadm-save.8.gz /usr/share/man/man8/ipvsadm.8.gz
#查看ipvsadm.service服務的結構可以看到配置未見在
/etc/sysconfig/ipvsadm


[root@db1
~]# cat /usr/lib/systemd/system/ipvsadm.service
那么我們只需要ipvsadm -S > /etc/sysconfig/ipvsadm就可以把配置文件保存在配置文件中
ipvsadm
-R < /etc/sysconfig/ipvsadm就可以從配置文件中恢復到當前配置

tun配置

tun隧道模式
    lvs-server
    ifconfig tunl0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.0 up
    route add -host 192.168.254.250 dev tunl0
    ipvsadm -A -t 192.168.254.250:80 -s rr
    ipvsadm -a -t 192.168.254.250:80 -r 192.168.254.18 -i
    ipvsadm -a -t 192.168.254.250:80 -r 192.168.254.19 -i


    real server
    ifconfig tunl0 192.168.254.250 netmask 255.255.255.255 broadcast 192.168.254.250 up
    route add -host 192.168.254.250 dev tunl0
    echo "1" >/proc/sys/net/ipv4/conf/tunl0/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/tunl0/arp_announce
    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
    echo "0" >/proc/sys/net/ipv4/conf/tunl0/rp_filter
    echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter

    0:不開啟源地址校驗。
    1:開啟嚴格的反向路徑校驗。對每個進來的數據包,校驗其反向路徑是否是最佳路徑。
        如果反向路徑不是最佳路徑,則直接丟棄該數據包。
    2:開啟松散的反向路徑校驗。對每個進來的數據包,校驗其源地址是否可達,即反向路徑是否能通(通過任意網口),
        如果反向路徑不同,則直接丟棄該數據包。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM