LVS之DR模型以及持久連接


LVS之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這個選項

 

 

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 地址,作爲散列鍵(Hash

Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將

請求發送到該服務器,否則返回空。

 

(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@test2 ~]# yuminstall -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

 

配置DR模式

(這裏我們的ipvs爲單點,沒有做keepalived或其他健康檢查機制)

IP地址服務器角色
10.0.10.61directory
10.0.10.84realserver
10.0.10.83realserver
10.0.10.100VIP

確保三方可以通信,服務可以啓動

 

配置vip步驟:

1.將log環回接口配置其vip

2. 確保都在同一網段並設置本地路由(不是網絡路由)

3.在realserv配置2個內核參數

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

#特定配置lo環回接口

每個realserver都需要配置內核參數再去配置vip

指定廣播地址爲自己本機,不對外做任何廣播,說明不需要與任何主機通信,只將在響應客戶端的請求的時候將自己做爲源地址

[root@mode ~]#ifconfig lo:0 10.0.10.100 broadcast 10.0.10.100 netmask 255.255.255.255 up

[root@mode ~]#ifconfig lo:0

lo:0      Link encap:Local Loopback  

         inet addr:10.0.10.100  Mask:255.255.255.255

         UP LOOPBACK RUNNING  MTU:16436 Metric:1

#爲了使得源地址是VIP還必須加一條路由,如果主機目標地址是vip的,那麼一定要通過lo接口出去

[root@mode ~]#/sbin/route add -host 10.0.10.100 dev lo:0

這樣以來源地址響應的ip一定是lo:0環回接口

 

配置directory

要添加路由只不過將vip配置在外網接口的別名上

[root@test2 ~]# /sbin/ifconfig eth0:110.0.10.100  broadcast 10.0.10.100netmask 255.255.255.255 up

[root@test2 ~]#route add -host 10.0.10.100 dev eth0:1

查看路由

[root@test2 ~]#route -n

Kernel IP routingtable

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

10.0.10.100     0.0.0.0         255.255.255.255 UH    0     0        0 eth0

切換至我們的客戶端去ping vip

C:\Users\Administrator>ping10.0.10.100

 

正在 Ping10.0.10.100 具有 32 字節的數據:

來自 10.0.10.100 的回覆: 字節=32 時間<1msTTL=64

來自 10.0.10.100 的回覆: 字節=32 時間<1msTTL=64

查看arp列表,如下所示vip與其eth0的ip地址是一致的

接口: 10.0.0.1 ---0xd

 Internet 地址物理地址類型

 10.0.0.255            ff-ff-ff-ff-ff-ff     靜態

 10.0.10.61            00-0c-29-d6-6b-a3     動態

 10.0.10.83            00-0c-29-46-4b-40     動態

 10.0.10.84            00-0c-29-47-55-a4     動態

 10.0.10.100           00-0c-29-d6-6b-a3     動態

添加ipvs分發

[root@test2~]#  ipvsadm -A -t 10.0.10.100:80 -s rr

[root@test2~]#  ipvsadm -a -t 10.0.10.100:80 -r10.0.10.83 -g -w 2

[root@test2~]#  ipvsadm -a -t 10.0.10.100:80 -r10.0.10.84 -g -w 2

[root@test2~]#  ipvsadm -l -n

IP Virtual Serverversion 1.2.1 (size=4096)

ProtLocalAddress:Port Scheduler Flags

 -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  10.0.10.100:80 rr

 -> 10.0.10.83:80                Route   2     0          0        

 -> 10.0.10.84:80                Route   2     0          0  

 

訪問時,發現已經到達輪詢的結果了(沒刷新一次則變化一次頁面)

因爲這裏是rr算法所以看不出效果,所以需要更改動態算法,並對其進行壓力測試

[root@test2 ~]#ipvsadm -E -t 10.0.10.100:80 -s wlc

[root@mode ~]# ab-n 1000 -c 30 http://10.0.10.100/index.html

 

使其RIP與VIP不在同一網段

但如果rip、dip不跟vip在同一網絡內,無論如何各realserver的網關一定不能指向directory,必須要準備另一個路由設備,比如將網關指向與RIP在同一網段內

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

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

地址劃分

由於我這裏沒有多餘的虛機,所以只能犧牲一下其中以臺的realserver了

劃分如下:

IP地址服務器角色
10.0.10.61Directory
10.0.10.84/10.0.0.84Router
10.0.0.83Realserver
10.0.10.100VIP

配置路由

[root@mode conf]#ifconfig | grep 'inet addr'

         inet addr:10.0.10.84  Bcast:10.0.10.255  Mask:255.255.255.0

         inet addr:10.0.0.84  Bcast:10.0.0.255  Mask:255.255.255.0

         inet addr:127.0.0.1  Mask:255.0.0.0

開啓轉發

[root@mode conf]#echo 1 > /proc/sys/net/ipv4/ip_forward

 

配置realserver

更改ip地址並測試鏈路是否暢通

[root@modephp_test]# ifconfig eth1 10.0.0.83

[root@mode ~]#ping  -c 1 10.0.0.84

PING 10.0.0.84(10.0.0.84) 56(84) bytes of data.

64 bytes from10.0.0.84: icmp_seq=1 ttl=64 time=0.335 ms

配置靜態路由

[root@mode ~]#route add default gw 10.0.0.84

[root@mode ~]#route -n

Kernel IP routingtable

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

10.0.10.100     0.0.0.0         255.255.255.255 UH    0     0        0 lo

192.168.1.0     0.0.0.0         255.255.255.0   U    0      0        0 eth0

10.0.0.0        0.0.0.0         255.0.0.0       U    0      0        0 eth1

0.0.0.0         10.0.0.84       0.0.0.0         UG   0      0        0 eth1

測試跨網段ip是否暢通

[root@mode ~]# ping10.0.10.84

PING 10.0.10.84(10.0.10.84) 56(84) bytes of data.

64 bytes from10.0.10.84: icmp_seq=1 ttl=64 time=2.42 ms

[root@mode ~]# ping10.0.10.100

PING 10.0.10.100 (10.0.10.100)56(84) bytes of data.

64 bytes from10.0.10.100: icmp_seq=1 ttl=64 time=0.015 ms

更改DIP

[root@test2 ~]#route add default gw 10.0.10.84

清理規則

[root@test2~]#  ipvsadm -C

重新添加集羣服務

[root@test2 ~]# ipvsadm -A -t10.0.10.100:80  -s wrr

[root@test2~]#  ipvsadm -a -t 10.0.10.100:80 -r10.0.0.83 -g -w 2

[root@test2 ~]#ipvsadm -ln

IP Virtual Serverversion 1.2.1 (size=4096)

ProtLocalAddress:Port Scheduler Flags

 -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  10.0.10.100:80 wrr

 -> 10.0.0.83:80                 Route   2     0          0  

確保雙方都能暢通並訪問

lvs持久鏈接

持久連接主要是將同一用戶的不同請求分發至一臺服務器

connectionaffinity連接關聯性

使用其關聯性無論使用什麼方法都可以在外圍捆綁機制上實現持久功能

如何去實現lvs持久鏈接

持久連接必須對其進行連接追蹤,所以要實現端口關聯性的持久性,lvs在內部引進了機制叫做lvs持久鏈接模板(lvs persistent template)

簡單來講就是一內存存儲空間,是一段保存在內存中的哈希表,保存內容無非就是鍵值對(鍵:CIP;值:realserver)

 

啓動這種功能的時候lvs調度的過程爲:

1.用戶請求80服務於是根據算法選擇了realserver1並且將這對應關係保存在哈希表裏

2.於是第二次同一個請求不管是否是同一客戶端的請求到達後,不是將通過算法調度,而是先去查找內存哈希表,查看是否曾經被分配至某個realserver 不管使用的哪個服務都需要查找內存空間的哈希表

2.如果此前曾經被分配過某個realserver那麼哪怕其訪問的其他服務,都統統被分發到此realserver

所以在實現lvs持久鏈接的時候,先去查內存空間哈希表,只要表中匹配則進行分配

 

那麼對於非常繁忙的lvs來說 持久鏈接就存在瓶頸,如果有N個客戶端那麼就意味着要建立N個條目

也就意味着內存空間需要充足能容納我們的記錄的條目纔可以,所以在必要的時候要去調整模板的空間大小

 

定義持久連接機制

持久多長時間超時需要自己按需定義

如果想讓lvs工作在持久連接的模型下,方法也很簡單:

在添加ipvs規則的時候加入參數-p:

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

如下所示:

如果不去設置其值那麼其默認值爲360秒

ipvsadm -ptimeout_number

持久性跟算法沒有關係,就是說無論使用哪種算法都可以實現持久連接

那麼疑問來了:使用持久鏈接是否就沒有意義了?

在客戶端發送第一次連接時進行調度)在實現持久功能之前的選擇,算法依舊有用的,因此需要挑選一個最合理的算法

 

持久鏈接的功能主要目的是實現將多個端口綁定的,在定義一個服務的時候加-p 只對當前服務有效,那如果對其定義2個不同的服務,那麼他們2個各自持久鏈接是有效果的,但是彼此之間仍然沒關係,那麼我們的目的是將2個服務綁定在一起

因此我們需要人爲的將2個集羣定製爲一個集羣服務:

1.PCC :持久客戶端連接

2.PPC :持久端口連接

3. PFMC : 只需要將某幾個服務的請求剛到達directory服務器的時候,在perouting鏈上做防火牆標記,並用ipvs調用其標記

配置持久連接

首先將配置還原如初,這裏就不演示了

配置PCC持久端口連接

無論哪個客戶端統統定義分發至某個realserver中

我們將22端口定製爲集羣服務

[root@test2 ~]#ipvsadm -ln  

#查看連接

[root@test2 ~]#ipvsadm -lc

添加集羣服務

[root@test2 ~]#ipvsadm -A -t 10.0.0.100:22 -s rr -p

#默認不加數字表示默認超時時間爲360秒

[root@test2 ~]#ipvsadm -a -t 10.0.10.100:22 -r 10.0.10.84

[root@test2 ~]#ipvsadm -a -t 10.0.10.100:22 -r 10.0.10.83

再爲80端口服務添加持久鏈接

[root@test2 ~]#ipvsadm -E -t 10.0.10.100:80 -s rr -p        #-p爲持久連接參數,如果不設定其事件默認爲360秒

[root@test2 ~]# ipvsadm-ln

IP Virtual Serverversion 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags  ->RemoteAddress:Port          Forward Weight ActiveConn InActConn TCP  10.0.10.100:22 rr persistent 360  ->10.0.10.83:22               Route   1      1         0          ->10.0.10.84:22               Route   1     0         0         TCP  10.0.10.100:80 rr persistent 360  ->10.0.10.83:80               Route   1     0         0          ->10.0.10.84:80               Route   1     0          0

首先連接其web服務

http://10.0.10.100/

可以發現,無論如何刷新其都是一個頁面,這就是所謂的持久鏈接

再次連接其22端口發現看到已經跳轉至另外一個realserv

ssh 10.0.10.100 ifconfigeth1 | grep inet\ addr          inetaddr:10.0.10.83  Bcast:10.0.10.255  Mask:255.255.255.0

這種持久性只能對一個服務(端口)持久,如果想實現多個只能定義多個集羣

 

配置PPC持久端口連接

[root@test2 ~]#ipvsadm -C

[root@test2 ~]#ipvsadm -A -t 10.0.10.100:0 -s rr -p

#0表示所有端口,這樣一來不當緊,無論什麼端口都會進行分發操作,我們只要請求的是這個地址,都會統統轉發至realserver中

[root@test2 ~]#ipvsadm -a -t 10.0.10.100:0 -r 10.0.10.83 -g [root@test2 ~]# ipvsadm -a -t 10.0.10.100:0 -r 10.0.10.84 -g [root@test2 ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags  ->RemoteAddress:Port          Forward Weight ActiveConn InActConn TCP  10.0.10.100:0 rr persistent 360  ->10.0.10.83:0                Route   1     0         0          ->10.0.10.84:0                Route   1     0          0  

很顯然這不符合我們的目的,我們的主要目的是將某些特定的服務綁在一起

所以這個時候,我們需要只綁定某幾個服務,這就需要持久防火牆標記PFMC

 

實現PFMC持久連接

只需要將某幾個服務,對其的請求剛到達directory服務器的時候,在perouting鏈上做防火牆標記

比如對目標是vip80端口的請求標記爲1 對443端口請求的服務也標記爲1 然後對標記1的角色做長久連接服務

mangle表的意義:

將報文拆開做標記再次封裝,必須將在到達iptables所在鏈之前對其做標籤,而後將集羣服務定義的時候以防火牆標記當做服務來標記

 

將規則清空

[root@test2 ~]#ipvsadm -C

啓動web服務並新開一8080端口

定義標籤

[root@test2CA]# iptables -t mangle -A PREROUTING -d 10.0.10.100 -p tcp --dport 80 -j MARK--set-mark 10

[root@test2CA]# iptables -t mangle -A PREROUTING -d 10.0.10.100 -p tcp --dport 8080 -jMARK --set-mark 10

[root@test2CA]# iptables -t mangle -A PREROUTING -d 10.0.10.100 -p tcp --dport 22 -j MARK--set-mark 10

查看規則

[root@test2 CA]#iptables -t mangle -L -n Chain PREROUTING (policy ACCEPT) target     prot optsource              destination         MARK       tcp  -- 0.0.0.0/0           10.0.10.100         tcp dpt:80 MARK set0xa MARK       tcp  -- 0.0.0.0/0           10.0.10.100         tcp dpt:8080 MARKset 0xa

MARK      tcp  -- 0.0.0.0/0           10.0.10.100         tcp dpt:22 MARK set0xa

定製集羣

使用ipvs命令同時,加入參數--f 明確指定mark標籤

[root@test2 CA]#ipvsadm -A -f 10 -s rr -p

[root@test2 CA]#ipvsadm -a -f 10 -r 10.0.10.83 -g [root@test2 CA]# ipvsadm -a -f 10 -r 10.0.10.84 -g

[root@test2 CA]#ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags  ->RemoteAddress:Port          Forward Weight ActiveConn InActConn FWM  10 rr persistent 360  ->10.0.10.83:0                Route   1     0         0          ->10.0.10.84:0                Route   1     0          0  

訪問測試:

分別訪問以下連接

http://10.0.10.100:8080

http://10.0.10.100

一旦建立連接,無論其如何刷新、如何訪問其指定端口的服務,請求都會分發到指定的其一臺realserver

 

如果再想對其加入其它端口成員,則需要在iptables mangle表中加入規則即可

比如我們想將443加入集羣服務中,明確指定mark標籤

[root@test2CA]# iptables -t mangle -A PREROUTING -d 10.0.10.100 -p tcp --dport 443 -j MARK--set-mark 10


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章