1. 程式人生 > >linux筆記web群集之LVS-DR實戰

linux筆記web群集之LVS-DR實戰

linux web負載均衡 LVS-DR 高可用

一. 負載均衡簡介。
負載均衡(Load Balance),意思是將負載(工作任務,訪問請求)進行平衡、分攤到多個操作單元(服務器,組件)上進行執行。是解決高性能,單點故障(高可用),擴展性(水平伸縮)的終極解決方案
二.負載均衡的需求
負載均衡集群提供一種廉價、有效、透明的方法,來擴展網絡設備和服務器的寬帶、增加吞吐量、加強網絡數據處理能力、提高網絡的靈活性和可用性。
1) 把單臺計算機無法承受的大規模的並發或者數據流量分擔到多臺節點設備上處理,減少用戶等待的時間,提升用戶的體驗。
2) 單個重負載的運算分擔到多臺節點設備上做並行處理。每個節點設備處理結束後,將結果匯總,返回給用戶,系統處理能力得到大幅度的提高。
3) 保證7*24的服務,任意一個或者多個有限後面的節點設備宕機都不會影響業務

三. LVS簡介

LVS: Linux Virtual Server的縮寫,意思是Linux虛擬服務器,是一個虛擬的服務器集群系統,同時也是一個開源的軟件,由畢業於國防科技大學的章文嵩博士於1998年5月創立,是中國國內最早出現的自由軟件項目之一,可以實現LINUX平臺下的簡單負載均衡,具有低成本、高性能、高可靠性、高可用性的特點

四. LVS的相關術語的命名約定。
技術分享圖片

五. LVS負載均衡群集三種工作模式的介紹

LVS的三種工作模式:

1)VS/NAT模式(Network address translation)

2)VS/TUN模式(tunneling)
3)VS/DR模式(Direct routing)

1、NAT模式-網絡地址轉換
Virtualserver via Network address translation(VS/NAT)
這個是通過網絡地址轉換的方法來實現調度的。首先調度器(LB)接收到客戶的請求數據包時(請求的目的IP為VIP),根據調度算法決定將請求發送給哪個後端的真實服務器(RS)。然後調度就把客戶端發送的請求數據包的目標IP地址及端口改成後端真實服務器的IP地址(RIP),這樣真實服務器(RS)就能夠接收到客戶的請求數據包了。真實服務器響應完請求後,查看默認路由(NAT模式下我們需要把RS的默認路由設置為LB服務器。)把響應後的數據包發送給LB,LB再接收到響應包後,把包的源地址改成虛擬地址(VIP)然後發送回給客戶端。

調度過程IP包詳細圖:
技術分享圖片
原理圖簡述:
1)客戶端請求數據,目標IP為VIP
2)請求數據到達LB服務器,LB根據調度算法將目的地址修改為RIP地址及對應端口(此RIP地址是根據調度算法得出的。)並在連接HASH表中記錄下這個連接。
3)數據包從LB服務器到達RS服務器webserver,然後webserver進行響應。Webserver的網關必須是LB,然後將數據返回給LB服務器。
4)收到RS的返回後的數據,根據連接HASH表修改源地址VIP&目標地址CIP,及對應端口80.然後數據就從LB出發到達客戶端。
5)客戶端收到的就只能看到VIP\DIP信息。

NAT模式優缺點:
1、NAT技術將請求的報文和響應的報文都需要通過LB進行地址改寫,因此網站訪問量比較大的時候LB負載均衡調度器有比較大的瓶頸,一般要求最多只能10-20臺節點
2、只需要在LB上配置一個公網IP地址就可以了。
3、每臺內部的節點服務器的網關地址必須是調度器LB的內網地址。
4、NAT模式支持對IP地址和端口進行轉換。即用戶請求的端口和真實服務器的端口可以不一致。

2、TUN模式
virtual server via ip tunneling模式:采用NAT模式時,由於請求和響應的報文必須通過調度器地址重寫,當客戶請求越來越多時,調度器處理能力將成為瓶頸。為了解決這個問題,調度器把請求的報文通過IP隧道轉發到真實的服務器。真實的服務器將響應處理後的數據直接返回給客戶端。這樣調度器就只處理請求入站報文,由於一般網絡服務應答數據比請求報文大很多,采用VS/TUN模式後,集群系統的最大吞吐量可以提高10倍。
VS/TUN的工作流程圖如下所示,它和NAT模式不同的是,它在LB和RS之間的傳輸不用改寫IP地址。而是把客戶請求包封裝在一個IP tunnel裏面,然後發送給RS節點服務器,節點服務器接收到之後解開IP tunnel後,進行響應處理。並且直接把包通過自己的外網地址發送給客戶不用經過LB服務器。

Tunnel原理流程圖:

技術分享圖片

原理圖過程簡述:
1)客戶請求數據包,目標地址VIP發送到LB上。
2)LB接收到客戶請求包,進行IP Tunnel封裝。即在原有的包頭加上IP Tunnel的包頭。然後發送出去。
3)RS節點服務器根據IP Tunnel包頭信息(此時就又一種邏輯上的隱形隧道,只有LB和RS之間懂)收到請求包,然後解開IP Tunnel包頭信息,得到客戶的請求包並進行響應處理。
4)響應處理完畢之後,RS服務器使用自己的出公網的線路,將這個響應數據包發送給客戶端。源IP地址還是VIP地址。(RS節點服務器需要在本地回環接口配置VIP)

3、DR模式(直接路由模式)
Virtual server via direct routing (vs/dr)
DR模式是通過改寫請求報文的目標MAC地址,將請求發給真實服務器的,而真實服務器響應後的處理結果直接返回給客戶端用戶。同TUN模式一樣,DR模式可以極大的提高集群系統的伸縮性。而且DR模式沒有IP隧道的開銷,對集群中的真實服務器也沒有必要必須支持IP隧道協議的要求。但是要求調度器LB與真實服務器RS都有一塊網卡連接到同一物理網段上,必須在同一個局域網環境。DR模式是互聯網使用比較多的一種模式。

DR模式原理圖:
技術分享圖片
DR模式原理過程簡述:

VS/DR模式的工作流程圖如上圖所示,它的連接調度和管理與NAT和TUN中的一樣,它的報文轉發方法和前兩種不同。DR模式將報文直接路由給目標真實服務器。在DR模式中,調度器根據各個真實服務器的負載情況,連接數多少等,動態地選擇一臺服務器,不修改目標IP地址和目標端口,也不封裝IP報文,而是將請求報文的數據幀的目標MAC地址改為真實服務器的MAC地址。然後再將修改的數據幀在服務器組的局域網上發送。因為數據幀的MAC地址是真實服務器的MAC地址,並且又在同一個局域網。那麽根據局域網的通訊原理,真實復位是一定能夠收到由LB發出的數據包。真實服務器接收到請求數據包的時候,解開IP包頭查看到的目標IP是VIP。(此時只有自己的IP符合目標IP才會接收進來,所以我們需要在本地的回環借口上面配置VIP。另:由於網絡接口都會進行ARP廣播響應,但集群的其他機器都有這個VIP的lo接口,都響應就會沖突。所以我們需要把真實服務器的lo接口的ARP響應關閉掉。)然後真實服務器做成請求響應,之後根據自己的路由信息將這個響應數據包發送回給客戶,並且源IP地址還是VIP。

DR模式小結:
1、通過在調度器LB上修改數據包的目的MAC地址實現轉發。註意源地址仍然是CIP,目的地址仍然是VIP地址。
2、請求的報文經過調度器,而RS響應處理後的報文無需經過調度器LB,因此並發訪問量大時使用效率很高(和NAT模式比)
3、因為DR模式是通過MAC地址改寫機制實現轉發,因此所有RS節點和調度器LB只能在一個局域網裏面
4、RS主機需要綁定VIP地址在LO接口上,並且需要配置ARP抑制。
5、RS節點的默認網關不需要配置成LB,而是直接配置為上級路由的網關,能讓RS直接出網就可以。
6、由於DR模式的調度器僅做MAC地址的改寫,所以調度器LB就不能改寫目標端口,那麽RS服務器就得使用和VIP相同的端口提供服務。

官方三種負載均衡技術比較總結表:

技術分享圖片

六. 關於lvs的調度算法
LVS的調度算法決定了如何在這些節點之間分布工作負荷
當director收到來自客戶端計算機訪問它vip上的群集服務入站請求時,director必須決定由哪個群集節點來獲得請求。
在內核中的連接調度算法上,IPVS已實現了以下八種調度算法:
? 輪叫調度(Round-Robin Scheduling)
? 加權輪叫調度(Weighted Round-Robin Scheduling)
? 最小連接調度(Least-Connection Scheduling)
? 加權最小連接調度(Weighted Least-Connection Scheduling)
? 基於局部性的最少鏈接(Locality-Based Least Connections Scheduling)
? 帶復制的基於局部性最少鏈接(Locality-Based Least Connections with Replication Scheduling)
? 目標地址散列調度(Destination Hashing Scheduling)
? 源地址散列調度(Source Hashing Scheduling)
具體介紹請參考http://www.linuxvirtualserver.org/zh/lvs4.html#2

七. 手動搭建一個簡單的LVS實驗

實驗環境拓撲圖

技術分享圖片
一. 負載均衡器LVS-36端配置
1.安裝lvs軟件
我這裏選擇yum安裝,也可以自行在官方下載軟件編譯安裝
[root@RS-36 ~]# yum install lvs –y

安裝後把lvs加載到內核模塊中
[root@RS-36 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
檢查是否成功
出現以下信息說明加載成功
[root@RS-36 ~]# lsmod | grep ip_vs
ip_vs_wrr 12697 1
ip_vs 140944 3 ip_vs_wrr
nf_conntrack 105745 1 ip_vs
libcrc32c 12644 2 xfs,ip_vs

2.配置vip地址
查看本機ip
[root@RS-36 ~]# ifconfig
在你的網卡配置一個虛擬ip作為vip,我這裏的網卡是ens34,我把ens34也就是與物理機橋接的網卡地址作為vip地址,請根據你的環境按實際情況配置

[root@RS-36 ~]# ifconfig

ens34: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.4.102.36 netmask 255.255.255.0 broadcast 10.4.102.255
inet6 fe80::20c:29ff:fe94:8327 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:94:83:27 txqueuelen 1000 (Ethernet)
RX packets 20634 bytes 2075900 (1.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2013 bytes 283161 (276.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 0 (Local Loopback)
RX packets 98 bytes 6876 (6.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 98 bytes 6876 (6.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

3.手動添加LVS服務並添加兩臺RS服務器(RS-35和RS-37)
[root@RS-36 ~]# ipvsadm –C 清除內核虛擬服務器的所有記錄
[root@RS-36 ~]# ipvsadm -L 查看虛擬服務器的記錄
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn

可以看到沒有任何記錄,我們還沒有配置

[root@RS-36 ~]# ipvsadm -A -t 10.4.102.36:80 -s rr
[root@RS-36 ~]# ipvsadm -a -t 10.4.102.36:80 -r 10.4.102.35:80 -g -w 1
[root@RS-36 ~]# ipvsadm -a -t 10.4.102.36:80 -r 10.4.102.37:80 -g -w 1

檢查配置結果
[root@RS-36 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.4.102.140:80 rr
-> 10.4.140.35:80 Route 1 0 0
-> 10.4.140.37:80 Route 1 0 0

這樣LVS負載均衡端就配置完成了
關於ipvsadm的用法參考如下:

ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p [timeout]] [-M netmask]
ipvsadm -D -t|u|f virtual-service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f virtual-service-address:port -r real-server-address:port
[-g|i|m] [-w weight]
ipvsadm -d -t|u|f virtual-service-address -r real-server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f virtual-service-address]
ipvsadm --set tcp tcpfin udp
ipvsadm –h
-A --add-service 在內核的虛擬服務器列表中添加一條新的虛擬IP記錄。也就是增加一臺新的虛擬服務器
-E --edit-service 編輯內核虛擬服務器列表中的一條虛擬服務器記錄
-D --delete-service 刪除內核虛擬服務器列表中的一條虛擬服務器記錄
-C --clear 清除內核虛擬服務器列表中的所有記錄
-R --restore 恢復虛擬服務器規則
-S --save 保存虛擬服務器規則,輸出為-R 選項可讀的格式
-a --add-server 在內核虛擬服務器列表的一條記錄裏添加一天新的Real Services記錄。也就是在一個虛擬服務器中添加一臺新的RealServer
-e --edit-server 編輯一條虛擬服務器記錄中的某條Real Server記錄
-d --delete-server 刪除一條虛擬服務器記錄中的某條Real Server記錄
-L --list 顯示內核中虛擬服務器列表
-L --timeout 顯示“tcp tcpfin udp”的timeout值,如:ipvsadm -L --timeout
-L --daemon 顯示同步守護進程狀態,例如:ipvsadm -L –daemon
-L --stats 顯示統計信息,例如:ipvsadm -L –stats
-L --rate 顯示速率信息,例如:ipvsadm -L --rate
-L --sort 對虛擬服務器和真實服務器排序輸出,例如:ipvsadm -L --sort
-Z --zero 虛擬服務器列表計數器清零 清空當前的連接數量
--set tcp tcpfin udp 設置連接超時值
-t 說明虛擬服務器提供的是tcp 服務,此選項後面跟如下格式:
[virtual-service-address:port] or [real-server-ip:port]
-u 說明虛擬服務器提供的是udp 服務,此選項後面跟如下格式:
[virtual-service-address:port] or [real-server-ip:port]
-f fwmark 說明是經過iptables標記過的服務類型
-s 此選項後面跟LVS使用的調度算法
有這樣幾個選項: rr|wrr|lc|wlc|lblc|lblcr|dh|sh,默認算法是wlc
-p timeout 在某個Real Server上持續的服務時間。也就是說來自同一個用戶的多次請求,將被同一個Real Server處理。此參數一般用於有動態請求的操作中,timeout 的默認值為300 秒。例如:-p 600,表示持續服務時間為600秒。
-r 指定Real Server的IP地址,此選項後面跟如下格式:
[real-server-ip:port]
-g --gatewaying 指定LVS的工作模式為直接路由模式DR(此模式是LVS 默認工作模式)
-i -ipip 指定LVS 的工作模式為隧道模式TUN
-m --masquerading 指定LVS 的工作模式為NAT模式
-w --weight weight 指定Real Server的權值
-c --connection 顯示LVS目前的連接信息 如:ipvsadm -Lnc

二.Realserver RS-35和RS-37端配置
1.在RS-35和RS-37端安裝簡單的http服務
[root@RS-35 ~]# yum install httpd –y
[root@RS-37 ~]# yum install httpd –y

安裝成功後為了測試方便,更改httpd默認的index文件
[root@RS-35 ~]# echo "35" > /var/www/html/index.html
[root@RS-37 ~]# echo "37" > /var/www/html/index.html

2.在物理機端測試安裝httpd是否成功。
出現以下畫面說明安裝成功
技術分享圖片
技術分享圖片

3.手工綁定vip
[root@RS-35 ~]# ifconfig lo 10.4.102.36 netmask 255.255.255.255 up
[root@RS-37 ~]# ifconfig lo 10.4.102.36 netmask 255.255.255.255 up

檢查執行結果
[root@RS-35 ~]# ifconfig

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.4.102.35 netmask 255.255.255.0 broadcast 10.4.102.255
inet6 fe80::20c:29ff:fe11:7528 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:11:75:28 txqueuelen 1000 (Ethernet)
RX packets 25603 bytes 2678861 (2.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1938 bytes 204986 (200.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 10.4.102.36 netmask 255.255.255.255
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 0 (Local Loopback)
RX packets 7155 bytes 493322 (481.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 7155 bytes 493322 (481.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

[root@RS-37 ~]# ifconfig

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.4.102.37 netmask 255.255.255.0 broadcast 10.4.102.255
inet6 fe80::20c:29ff:fe3a:345a prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:3a:34:5a txqueuelen 1000 (Ethernet)
RX packets 20218 bytes 1958240 (1.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 605 bytes 63965 (62.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 10.4.102.36 netmask 255.255.255.255
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 0 (Local Loopback)
RX packets 2220 bytes 152714 (149.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2220 bytes 152714 (149.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

4. 抑制lo 環回接口的ARP響應

[root@RS-37 ~]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS-37 ~]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
[root@RS-37 ~]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS-37 ~]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

[root@RS-35 ~]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS-35 ~]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
[root@RS-35 ~]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS-35 ~]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

5.在物理機打開瀏覽器測試是否成功

技術分享圖片
技術分享圖片

為了驗證實驗的準確性,我們檢查一下10.4.102.36這臺機器是否打開了80端口
[root@centos6 ~]# netstat -lnt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:139 0.0.0.0: LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:
LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0: LISTEN
tcp 0 0 0.0.0.0:445 0.0.0.0:
LISTEN
tcp6 0 0 :::139 ::: LISTEN
tcp6 0 0 :::22 :::
LISTEN
tcp6 0 0 ::1:25 ::: LISTEN
tcp6 0 0 :::445 :::
LISTEN

可以看到LVS並沒有打開80端口,說明是通過負載均衡分別實現了對兩臺RS服務器的訪問

linux筆記web群集之LVS-DR實戰