LVS的工作模式介紹和NAT模式&DR模式實驗步驟


一:LVS介紹

二、LVS的NAT和DR模式的實驗及配置步驟

 

一、LVS的簡單介紹

linux virtual server

簡單來講lvs是一段內核代碼 類似於netfilter本身是一框架但不提供任何功能,但是在這框架上提供了能夠根據用戶定義的轉發規則將用戶對於服務應用的請求轉發至后端主機的機制,類似於DNAT

但DNAT只是其提供的一種工作模式

LVS的工作模式

lvs是工作在內核中的第四層(TCP/UDP)層

能夠處理用戶請求的套接字,而后只判定用戶是否訪問了定義為集群服務的應用

在lvs中就好比DNAT,並非將每個請求都轉換至后端只是某個特定的條件

在內核2.4.22之后ipvs直接被收錄進內核源碼樹了,只要啟用了相關功能就可以直接拿來使用了

 

ipvs相當於工作在netfilter中的input鏈

當用戶的請求到達主機內部,如果沒有做DNAT經過路由之后就到達input了,再經過input就到達用戶空間中,而ipvs就工作在input鏈上,隨時監控着通過input隨時發往本機的應用請求,而后可以接受用戶所定義的集群服務規則,所以一旦請求到達input鏈上的服務是請求的集群服務的話,那么本來應該送到本機內部(用戶空間)的報文,但是強行扭轉到postrouting直接到達后端realserver上

所以ipvs和iptables的機制不能同時使用,否則會出現問題。

 

LVS術語

調度器:   Director、Load Balancer

后端主機:  RealServer

RealServer 的IP:   RIP

Director  的IP:   DIP

客戶端:CIP

其工作流程的走向:CIP<-->CIP<-->DIP<-->RIP

 

LVS的工作模式

NAT模式

類似於DNAT,只不過比DNAT多了幾個后端節點

用戶的請求到達的前端的調度器,調度器本身不提供服務,只是提供某種方法從后端realserver中挑選出一個服務角色來響應用戶請求,這些服務器是隱藏在調度器背后的,因此他們是通過地址轉換,將用戶請求逐個分發到后端realserver,當用戶的請求被realserver處理了之后,這個請求需要將請求再次發給調度器,再由調度器封裝報文(源VIP 目標CIP)發送給client

無論是客戶的請求還是服務端的響應都必須經過調度器(director)

如果調度器的並發量非常大的話,(請求非常小,響應比較大)如果后端的relaserver非常的多,調度器可能會成為性能瓶頸的,因為調度器本身也需要大量的系統資源來響應用戶的請求(CPU+網絡吞吐)

其好處:只需要一個公網地址即可響應用戶的請求

NAT模式特性總結:

·.realserver應該使用私有ip地址

·一般realsever的網關應該指向DIP,不然的話無法保證響應報文經過director

·RIP要和DIP應該在同一網段內

·進出的報文,無論請求還是響應都要經過Directory

·支持端口映射

·realserver可以使用任意系統,只要端口對應即可

在高負載下,directory可能會成為性能瓶頸,所以不使用於並發很高的應用場景

 

在nat模式下在集群節點下經過哪些鏈:

當一個請求到達的時候,請求剛進入本地會到prerouting,而后目標地址就是本機vip地址,於是送往input鏈,但是在input鏈上工作的有ipvs,而且ipvs會有規則結果會分發到postrouting

NAT模型回復的報文會經過prerouting ,目標地址是CIP所以通過preting到達fowward到postrouting並返回給用戶

其報文走向流程:

入站報文:prerouting--> input(強行改變流程) --> postrouting

出站報文:響應時候先進行prerouting--> forward --> postrouting

 

 

TUN(隧道)模式

隧道模式則類似於×××的方式,使用網絡分層的原理

TUN的工作流程:

用戶發來的數據包的基礎上,封裝一個新的IP頭標記(此IP頭只有目的IP部) 發給REALSERVER

REALSERVER收到后,先把Director發過來的數據包的頭給解開,還原其數據包原樣,處理后,直接返回給客戶端,而不需要再經過Director

 

需要注意的是:由於REALSERVER需要對DR發過來的數據包進行還原,也就是說必須支持IPTUNNEL協議所以,在 REALSERVER的內核中,必須編譯支持IPTUNNEL這個選項

 

 

wKiom1NSXV3gXNxWAAIGEhCjSZg389.jpg

DR模式工作流程:

·用戶通過訪問其域名解析到其IP地址(VIP)

·用戶向目標VIP發送請求,這是Director接收到請求,此時源IP是用戶的IP地址,其目標MAC是Director的MAC地址

·LVS會根據其相關算法選擇一台active的服務器,將此RIP所在網卡的MAC地址作為目標的MAC地址,此時源MAC地址是Director的MAC地址,目標MAC地址是realserver的MAC地址

·realserver收到了數據包,並且分析數據包,如果發現目標IP地址(VIP)與本地的lo(環回接口)匹配,於是就會處理這個報文,廣播到LAN中,此時源MAC地址是realserver的MAC地址,目標IP地址是用戶的IP

 

其特性:

·realserver可以使用私有地址,但建議使用公網地址,

·realserver的網關一定不能指向DIP,否則沒有意義了

·RIP和DIP要在同一物理網絡內,一定不能跨越路由設備的

·入站報文經過directory,出站則由realserver直接響應

·不能做端口映射

·realserver必須綁定lo地址,跨越支持大多數常見OS

DR模型限定了主機必須在同一物理網絡內

 

LVS的八種算法:(參考科卡在線教材)

 

(1)輪叫(Round Robin)

簡寫:RR。調度器通過“輪叫”調度算法將外部請求按順序輪流分配到集群中的真實服務器上,它均等地對待每一台服務器,而不管服務器上實際的連接數和系統負載。

 

(2)加權輪叫(Weighted Round Robin)

簡寫:WRR。調度器通過“加權輪叫”調度算法根據真實服務器的不同處理能力來調度訪問請求。這樣可以保證處理能力強的服務器處理更多的訪問流量。調度器可以自動問詢真實服務器的負載情況,並動態地調整其權值。

 

(3)最少鏈接(Least Connections)

簡寫:LC。調度器通過“最少連接”調度算法動態地將網絡請求調度到已建立的鏈接數最少的服務器上。如果集群系統的真實服務器具有相近的系統性能,采用"最小連接"調度算法可以較好地均衡負載。

 

lc算法與rr相反,無論請求的發往哪個realserver,只考慮哪個realserver最空閑,將請求發往最空閑的realserver,所以對比起靜態算法不考慮realserver當前的連接數,但是動態需要計算realserver的連接數來判定選擇realserver

一般處於established狀態都為活動連接而其他狀態一律被視為非活動連接

如何評估連接數:

對於一個服務器來講,非活動連接數的資源的開銷比活動連接要小的多,比如nginx維持1W非活動連接數只需要3M足以,所以非活動鏈接數開銷非常小,由此做評估的時候不僅要考慮活動鏈接還要考慮非活動鏈接只不過活動鏈接占得比重要大的多

計算活動連接數:

活動鏈接數 X 256 + 非活動連接數

(Active*256+Inactive)誰的值小誰則選擇誰

 

(4)加權最少鏈接(Weighted Least Connections)

簡寫:WLC。在集群系統中的服務器性能差異較大的情況下,調度器采用“加權最少鏈接”調度算法優化負載均衡性能,具有較高權值的服務器將承受較大比例的活動連接負載。調度器可以自動問詢真實服務器的負載情況,並動態地調整其權值。

(活動鏈接數 X 256 + 非活動連接數)/權重

(Active*256+Inactive)/weiht

wlc是默認的調度算法,說明對於lvs集群來講,wlc是負載均衡最好的調度算法,但是wlc存在問題,所有有了sed算法

 

(5)基於局部性的最少鏈接(Locality-Based Least Connections)

簡寫:LBLC。“基於局部性的最少鏈接”調度算法是針對目標IP 地址的負載均衡,目前主要用於Cache 集群系統。該算法根據請求的目標IP 地址找出該目標IP地址最近使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處於一半的工作負載,則用“最少鏈接”的原則選出一個可用的服務器,將請求發送到該服務器。

 

(6)帶復制的基於局部性最少鏈接(Locality-Based Least Connections with Replication)

簡寫:LBLCR。“帶復制的基於局部性最少鏈接”調度算法也是針對目標IP 地址的負載均衡,目前主要用於Cache 集群系統。它與LBLC 算法的不同之處是它要維護從一個目標IP地址到一組服務器的映射,而LBLC 算法維護從一個目標IP 地址到一台服務器的映射。該算法根據請求的目標IP 地址找出該目標IP 地址對應的服務器組,按"最小連接"原則從服務器組中選出一台服務器,若服務器沒有超載,將請求發送到該服務器,若服務器超載;則按"最小連接"原則從這個集群中選出一台服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以降低復制的程度。

 

(7)目標地址散列(Destination Hashing)

簡寫:DH。“目標地址散列”調度算法根據請求的目標IP 地址,作為散列鍵(HashKey)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。

 

(8)源地址散列(Source Hashing)

簡寫:SH。“源地址散列”調度算法根據請求的源IP 地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。

 

lvs集群DR模型詳解

DR模式工作原理:

(1)當用戶請求到達交換機時,其報文源ip是cip 目標ip是vip

而Director將請求轉發至realserver的時候報文中的源ip是CIP,目標地址是VIP(因為修改目標MAC)

(2)當報文送到以后它只將目標MAC改為了RIP所對應的MAC地址(將報文的幀重新交給交換機的時候,交換機會根據目標MAC重新發往realserver,當realserver收到請求之后目標地址由於是VIP,因此為了讓realserver接收目標地址為vip的報文,在每個realserver必須配置vip的地址,不然不匹配報文無法接收,也就意味着每個realserver都必須配置vip)

(3)事實上路由器將報文轉發至directory之前要先進行arp廣播請求,arp廣播的意義是將vip轉換為mac地址,那么按理來講我們的realserver都配置了vip,也就意味着所有配置vip的主機都能響應其報文,很顯然這么就亂套了,所以我們就期望進來的請求只到達directory,不然負載均衡就沒有意義了

方案如下:

·前端路由不做解析,明確指定directory

·arp-tables限制響應

(4)當realserver處理完請求后將直接返回給CIP

那么我們來總結一下:

通告級別

默認情況下,linux發布通告相當毫無遮掩,將自己的ip及mac地址統統通告出去

響應級別

通告完之后通常對方知道我們的mac和ip,於是將mac和ip的地址緩存至本地,為了保證其地址的有效性通常緩存都是有一定的周期時間,一般來講是360(官方文檔說明是300秒,但ipvs顯示的是360秒)秒,當360秒之后如果雙方沒有進行任何通信,那么則將緩存清空,假設經過一定時間內要進行雙方通信,但在arp列表里沒有緩存,則再次進行發送廣播,對方收到之后則對其響應,並將mac地址響應給對方,並且響應方式也是廣播的

 

通告/響應級別是可以通過linux內核級別來調整的在kernel2.4.26之后所具備的兩個設備標志,我們被稱為設備網卡的識別標識用於調整arp協議棧的工作模式的

arp_ignore  用於定義通告限制級別

arp_annouce 用於定義響應級別

arp_announce

共有3個值:

0:默認值,表示默認情況下只要主機接入至網絡中,它會把每個接口以及接口IP和mac對應關系向本地網絡通告

1:盡可能避免不將地址通告本地網絡

2:只通告直連接口到本地網絡

一般模式選擇2

arp_ignore

共有8個值,重點是1

0:只要本地網絡有此ip則直接通告

1:僅接收在本地接口的ip地址

 

因此,我們所需要的值就是

arp_ignore=1

arp_announce=2

 

禁止RS上的vip直接跟前端路由通信的三種方案

1.修改路由,使用靜態arp

2.在RS上使用arptables 禁止響應對vip的廣播請求

3.在RS上修改其內核參數,並將vip配置在與RIP不同的接口的別名上比如lo:0

通常代價比較低,用的比較廣泛的是第三種方案,直接綁定lo環回地址

 

linux還有一種特性,盡管配置了vip也禁止了vip的響應請求,當請求報文到達以后,realserver要對其封裝響應,響應直接發送至客戶端,這時我們需要考慮兩個問題:

1:響應報文從哪個接口出去,則將哪個接口的地址當做源地址,報文響應出去的時候其源地址是RIP,但CIP一定是期望VIP響應的(過程中會通過一條特定的路由設定來實現) 

2.如果rip vip dip都在同一網段內,那么可以輕松實現,直接將網關指向路由即可但如果rip、dip不跟vip在同一網絡內,無論如何各realserver的網關一定不能指向directory,必須要准備另一個路由設備,比如將網關指向與RIP在同一網段

內最終外網接口有可能通過其他路由到達互聯網也有可能到達出口路由器,前提是必須能與RIP進行通信才可以

 

如果在生產環境內只有一個公網ip其余的使用私有ip,所以只能用公網ip當做vip,既然只有一個公網ip,那么rip和dip都是私有地址,與vip不在同一網段,所以這時候必須要配置一個本地網關,通過地址轉換(路由)到互聯網中去

安裝IPVS

查看linux編譯的時候是否支持ipvs

[root@test2 ~]#grep -i 'ipvs' /boot/config-3.2.0-4-amd64
CONFIG_NETFILTER_XT_MATCH_IPVS=m
# IPVS transport protocol load balancing support
# IPVS scheduler
# IPVS application helper

安裝ipvs

[root@centos7 ~]# yum install -y ipvsadm

ipvs常用命令參數

#man ipvsadm

     ipvsadm -A|E -t|u|f service-address [-s scheduler]
             [-p [timeout]] [-M netmask]

-A: 添加、新建

-E:編輯

-t: 指定tcp協議

-u:指定UDP協議

-f:firewal mark

-s: 指定調度算法

ipvsadm -D -t|u|fservice-address

-D:刪除

ipvsadm -a|e -t|u|fservice-address -r server-address
    [-g|i|m] [-w weight] [-x upper] [-y lower]

-a:添加realserver

-r:指定realserver地址,一般ip+端口,只在端口映射的時候才指端口

-g:指定lvs默認的模型,dr模型

-i:tun模型

-m:nat模型

-w:定義權重

添加集群

ipvsadm -a -t ip:80-r getwaryip -m

刪除ip

ipvsadm -d -t ip:80-r server-address

ipvsadm -d -t ip:80-r dip

保存規則

server ipvsadm save

默認路徑在/etc/sysconfig/ipvsadm

保存指定路徑

ipvsadm -S >/path/to/xxx.txt

ipvsadm -R >/path/to/xxx.txt

開啟轉發

sysctl -wnet.ipv4.ip_forward=1

統計數據

ipvsadm -L -n--stats

 

下面使用虛擬機centos7.6環境做一下lvs兩種模式的實驗

第一種模式:LVS——NAT模式(支持端口映射)

 實驗環境:

Client_ip:172.16.132.78 gw: 172.16.132.18

DIP:eth0:192.168.99.120

eth1:172.16.132.18

R1Web:eth0:192.168.99.130 gw:192.168.99.120

R2Web:eth0:192.1688.99.140 gw:192.168.99.120

 

實驗步驟:

1、先再后端兩個RS上部署web網站並添加一個測試頁面

[root@centos7 ~]# yum install -y httpd [root@centos7 ~]# echo www.test HTML.com > /var/www/html/index.html [root@centos7 ~]# systemctl start httpd

 2、在LVS機器上開啟路由轉發功能,並安裝lvs的管理軟件ipvsadm

# 啟用路由轉發功能 [root@centos7 ~]# echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf #加載 [root@centos7 ~]# sysctl -p net.ipv4.ip_forward = 1 [root@centos7 ~]# yum -y install ipvsadm

  3、配置LVS:添加集群和添加RS主機,ip為172.16.132.18:80 映射到后端web服務的888端口

# 添加集群
[root@centos7 ~]# ipvsadm -A -t 172.16.132.18:80 -s rr # 添加集群主機
[root@centos7
~]# ipvsadm -a -t 172.16.132.18:80 -r 192.168.99.130:888 -m [root@centos7 ~]# ipvsadm -a -t 172.16.132.18:80 -r 192.168.99.140:888 -m
# 查看 [root@centos7
~]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.132.18:80 rr -> 192.168.99.130:888 Masq 1 0 0 -> 192.168.99.140:888 Masq 1 0 0

  4、現在使用客戶端訪問lvs的公網地址測試看是否可以把請求轉發到后端的機器上

[root@centos7 ~]#  while true;do curl 172.16.132.18 ; sleep 0.5 ; done

 

客戶端 通過訪問lvs的公網地址的80端口,被LVS調度到了后端的RS主機888端口上,從而驗證了lvs的(輪詢)調度功能

 

LVS-DR模式

 

實驗步驟:(DR模式不支持端口映射所以只能用默認端口80

后端兩個RS140和150主機先搭建好web服務,並修改web的主頁面,方便測試

[root@centos7 ~]# yum -y install httpd # 創建測試頁面 [root@centos7 ~]# echo www.140.com > /var/www/html/indx.html [root@centos7 ~]# systemctl start httpd [root@centos7 ~]# ss -ntl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0      128              *:22                            *:* LISTEN 0      100      127.0.0.1:25                            *:* LISTEN 0      128             :::22                           :::* LISTEN 0      128             :::80   #端口啟動                :::* LISTEN 0      100            ::1:25                           :::* 

 充當路由器的主機上開啟轉發功能

[root@centos7 ~]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf [root@centos7 ~]# sysctl -p net.ipv4.ip_forward = 1

 

 LVS配置(DR模式 通訊不依靠網關,但是必須設置,即使不存在的地址也可以)

# 添加VIP的地址99.188 [root@centos7 ~]# ip a a 192.168.99.188 dev eth0 # 創建集群 端口設為80 輪詢模式 rr [root@centos7 ~]# ipvsadm -A -t 192.168.99.188:80 -s rr # 查看一下 [root@centos7 ~]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.99.188:80 rr # 添加后端兩個提供服務的主機140和150

 

 使用腳本配置兩個RS主機,添加臨時配置的vip和關閉自動應答等

[root@centos7 hx]# vim lvs_dr_rs.sh #!/bin/bash #Author:Peter Xu #Date:2019-08-05 vip=192.168.99.188 mask='255.255.255.255' dev=lo:1 #rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null #service httpd start &> /dev/null && echo "The httpd Server is Ready!" #echo "<h1>`hostname`</h1>" > /var/www/html/index.html case $1 in start) echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce ifconfig $dev $vip netmask $mask #broadcast $vip up #route add -host $vip dev $dev echo "The RS Server is Ready!" ;; stop) ifconfig $dev down echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce echo "The RS Server is Canceled!" ;; *) echo "Usage: $(basename $0) start|stop" exit 1 ;; esac

  執行腳本 腳本名 + start

 

然后使用客戶端測試即可

此時若要把lvs上的網關去掉就會提示無法到達,如果把網關指向一個同網段的不存在的地址,也一樣可以通信

 

 

 

 

 


免責聲明!

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



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