LVS NAT和DR模型

LVS :NATDR模型的詳解

1      集羣簡介

當單臺服務器沒法支撐龐大業務的時候,這個時候就要考慮擴展服務器的性能。html

擴展有兩種方式:前端

1)    scale on:向上擴展,立體式,如買更強大的服務器linux

a)    簡單的說,單純擴展服務器仍是不夠的,根據木桶效應,整套東西的性能只能根據最低的環節來衡量;web

b)    服務器隨着的性能的提高,價格愈來愈貴算法

2)    scale out:向外擴展,分佈式,使用更多的服務器,也就是集羣的方式了後端

 

事實上智能DNS也能夠實現負載:緩存

1)    A記錄:1個域名對應多個ip服務器

2)    dns是以這種輪詢的方式來響應請求(常規狀況),這是這種是不均勻的負載均衡,每一個人的請求是不一樣的,並且緩存服務器的存在,大部分時間是會請求同臺服務器網絡

3)    DNS事實上是爲了智能解析不一樣地區的用戶到最近的服務器併發

 

集羣的主要做用就是爲了提升併發處理能力,其所需的組件通常是前端的分發器,後端的服務器,也有可能單獨包含health check檢查設備。

 

LVS linux virtual server

1)    NAT:地址轉換

2)    DR:直接路由

3)    TUN:隧道

幾個名詞的解釋:

director:前端分發器

realserver:後端服務器,集羣節點

VIPIPVS的前端IP,接收客戶端服務請求的ip

DIP: director和服務器通訊的地址

RIP:服務器和director通訊的地址

CIP:客戶端發起請求的地址

 

LVS介紹

LVSlinux virtual server的簡寫linux虛擬服務器,是一個虛擬的服務器集羣系統,能夠再unix/linux平臺下實現負載均衡集羣功能。該項目在19985月由章文嵩博士組織成立。

如下是LVS官網提供的4篇文章:

http://www.linuxvirtualserver.org/zh/lvs1.html

http://www.linuxvirtualserver.org/zh/lvs2.html

http://www.linuxvirtualserver.org/zh/lvs3.html

http://www.linuxvirtualserver.org/zh/lvs4.html

 

clip_image001[7]

 

2      LVS使用詳解

ipvs也是做爲一個內核的功能的模塊,ipvsadm是一個管理工具,並不是服務,這個能夠類比iptables,其工做位置爲用戶空間/內核空間

iptables/netfilter

ipvsadm/ipvs

 

2.1    IPVS

IPVS工做在INPUT鏈上,其工做和netfilter不一樣,所以,若是功能有衝突的話,切記不能同時使用。

IPVS在鉤子函數(鏈上的數據流動狀況):

                        PREROUTING(這裏能夠對數據作標記,在後面LVS持久鏈接會講解)

                        INPUT:在這裏識別了請求是集羣服務,會對數據包作特殊處理(按照狀況而定)

                        OUPUT

                        POSTROUTING

               不通過forward鏈,這個本人未證明。不過從上面可知,IPVS工做在INPUT鏈上面。

查看內核是否編譯IPVS功能,linux內核2.6版本以後都包含了這個功能,內核自己就擁有的功能,所以和發行版沒有關係

[root@director ~]# grep -i "vs" /boot/config-2.6.32-358.el6.i686

# IPVS scheduler#單獨列出這個10種調度算法,其實還有其餘,請自行查詢

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

算法簡介:

rr :輪詢調度

wrr:加權輪詢

sh:源地址做爲關鍵字hash查找一個RS

dh: 目的地址做爲關鍵字hash查找一個RS

lc:最小鏈接調度,ipvs會存儲全部的活動鏈接

            active*256+inactive

wlc:加權的最小鏈接調度

            (active*256+inactive)/weight

LBLC:基於地址的最小鏈接請求調度:未來自同一個目的地址的請求分配給同一臺RS,此時這臺服務器是還沒有滿負荷的。不然就將這個請求分配給鏈接數最小的RS,並以它做爲下一次分配的首先考慮。

sed: 最短時間望延遲,對wlc的改進,防止第一次選擇了性能較差的主機處理

                        active+1)*256/weight

nqnq: never queue,對sed的改進,最開始每一個節點都發鏈接,以後再按照wlc來發

 

cache命中率和負載是相互背離,只能找到一箇中和點

 

非活動鏈接數很是多的時候,得考慮inactive,所以wlc比較理想

默認方法:wlc

2.2    管理工具ipvsadm

安裝管理工具ipvsadm

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

ipvsadm命令詳解:

1)    管理集羣服務

 

添加 –A  -t|u|f service-address –r server-address [-s scheduler]

                    -t tcp

                    -u udp

                    -f :防火牆標記,用於單獨提供多個服務綁定使用

                    service-address:對外服務的套接字,ip:port

                    默認調度算法是wlc

   -w :權值,部分算法須要使用

修改 –E :使用同上

刪除 –D –t|u|f service-address

# ipvsadm -A -t 172.16.100.1:80 -s rr

 

2)    管理集羣服務的RS

 

添加 –a  -t|u|f service-address –r server-address [-g|i|m]  [-w weight]

                    -t tcp

                    -u udp

                    -f :防火牆標記,用於單獨提供多個服務綁定使用

                    service-address:對外服務的套接字,ip:port

                    -g DR模型,默認

                    -m : NAT masuerading

                    -I : tun  ipip

   -w :權值,部分算法須要使用

修改 –e :使用同上

刪除 –d  -t|u|-f service-address  -r server-address

 

# ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.8 -m

                        # ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.9 -m

3)    查看集羣服務

 

-L|l

                    -n:數字格式顯示主機地址和端口

                    --stats:統計數據

            --rate:速率

                    --timeout:顯示會話的超時時間

                    -c:顯示當前IPVStcp鏈接狀況

4)    集羣的規則管理

-C:清空IPVS規則

-S 保存規則

        # ipvsadm –S > /path/to/somefile

-R:從新載入規則

        #ipvsadm –R </path/to/somefile

            service ipvsadm save 默認保存規則到 /etc/sysconfig/ipvsadm

 

如下的測試統一配置

RS1RS2安裝服務telnet-server httpd,默認配置

    [root@RS1 ~]# echo RS1 > /var/www/html/index.html

[root@RS2 ~]# echo RS2 > /var/www/html/index.html

添加用戶test 密碼test

selinux關閉(影響實驗,暫時關閉)

service iptables stop

因爲高可用集羣須要保證時間一致,所以能夠將director配置爲中繼ntp服務器,realserver把經過director來更新時間.

3      NAT模型詳解

NAT模型工做原理:

1)    集羣節點必須和director在同一個IP網絡中,通常都是內網地址

2)    集羣節點的RIP必須把網關指向DIP

3)    director負責數據報文的轉發,所以容易成爲系統瓶頸,只適合小規模應用

4)    支持端口映射

 

示例1

clip_image002[7]

配置:

director上配置

ipvsadm –A  -t 192.168.80.250:80 –s rr

ipvsadm –a  –t 192.168.80.250:80 –r 172.16.100.2 –m

ipvsadm –a  –t 192.168.80.250:80 –r 172.16.100.3 -m

查看命令驗證:

[root@localhost ~]# ipvsadm -L -c -n #查看鏈接

[root@localhost ~]# ipvsadm -L -n --stats #鏈接,數據包個數,字節總數

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes

  -> RemoteAddress:Port

TCP  192.168.80.250:80                  42      154      138    12521    12241

  -> 172.16.100.2:80                    21       76       68     6182     6145

  -> 172.16.100.3:80                    21       78       70     6339     6096

[root@localhost ~]# ipvsadm -L -n --rate #查看上面三類數據的平均值(瞬時)

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port                 CPS    InPPS   OutPPS    InBPS   OutBPS

  -> RemoteAddress:Port

TCP  192.168.80.250:80                   1        3        2      349      217

  -> 172.16.100.2:80                     0        1        1      169      113

  -> 172.16.100.3:80                     0        1        1      180      103

[root@localhost ~]# ipvsadm -L -n --timeout #查看 tcp tcpfin udp的超時退出時間

Timeout (tcp tcpfin udp): 900 120 300

 

http://192.168.80.250/ #切換是按照這個11的比例

 

演示規則的操做

 [root@localhost ~]# service ipvsadm save #保存規則

ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm:      [  OK  ]

[root@localhost ~]# ipvsadm -S > /etc/sysconfig/ipvsadm.http #保存規則到單獨位置

[root@localhost ~]# cat /etc/sysconfig/ipvsadm #查看規則表的信息

-A -t 192.168.80.250:80 -s rr

-a -t 192.168.80.250:80 -r 172.16.100.2:80 -m -w 1

-a -t 192.168.80.250:80 -r 172.16.100.3:80 -m -w 2

[root@localhost ~]# ipvsadm -C #清空規則表

[root@localhost ~]# ipvsadm -R < /etc/sysconfig/ipvsadm.http  #從新載入規則表

4      DR模型詳解

DR模型的工做原理:

1.    director必須有與realserver有一張網卡在同個物理網段中,必須是同個局域網

2.    diector經過僅僅修改二層的源目MAC地址,將數據包(保留源目ip地址)發往真實的realserverrealserver直接把數據包發回給客戶端,director只是接收請求,能夠不作響應報文的轉發,若是realserver把網關設置在director,則另當別論。

3.    不支持端口映射

 

DR有兩種模型,1.VIPDIPRIP在同一個ip網絡

                                                2.VIPDIP,RIP不在同一個IP網絡,通常做爲外網地址提供服務

補充知識點:

            ip地址是屬於內核的,不屬於單個網卡地址。做爲一臺有多網卡主機(多ip),把全部的ip通告給直連的主機。這個問題能夠解釋一臺雙網卡的主機A(不開啓轉發功能)(不一樣網段的ip),另外一臺與之相連的主機B能夠ping通另外一個ip.

            ip響應的數據包的幀數據包的源mac地址是出接口對應網卡的mac地址

            ip網絡響應數據包的時候是將請求數據包進入的接口的ip做爲源ip

 

所以以下圖,client請求VIP主機時候,按理是director來接收請求,可是reaserver也一樣會響應(根據ARP請求的原理),realserverVIP並不做爲這個通訊地址,僅僅爲了可以識別服務而提供的。

如上:所須要解決的問題有:

1.realserver不對ARP廣播請求VIP 地址響應或者是作出通告

            arptables

            內核的參數來修改arp的宣告和響應級別

2.須要修改diectorrealserver轉發數據包時候源ip保持爲VIP,而不是DIP或者RIP

  添加路由 route add –host VIP dev eth1:0

 

kernel parameter       

    arp_ingnore:

            響應級別:

                                                0:只要本地配置有相應地址則進行響應

                                                1:僅僅在請求的目標地址配置在請求到達的接口上的時候,才響應

            arp_announce:

            通告級別

                                                0:將本地任何接口上的任何地址向外通告

                                                1.試圖僅向目標網絡通告與其網絡匹配的地址

                                                2.僅向與本地接口地址上配置的網絡進行通告

[root@RS1 ~]# cd /proc/sys/net/ipv4/conf/

all/     default/ eth1/    lo/

all/是全局

eth1/是指定的網卡

都得配置

 

並且VIP地址配置在realserver上的時候要記得設置爲不廣播

ifconfig eth1:0 VIP broadcast VIP netmask 255.255.255.255 up

 

 

示例2

 

 

clip_image003[7]

 

 

 

1.先配置director

[root@director ~]# ifconfig eth1:0 172.16.100.1 255.255.0.0 up

[root@director ~]# route add -host 172.16.100.1 dev eth1:0

[root@director ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

2.清空配置列表

iptables -F  #清空

ipvsadm -C  #清空

iptables -Z #計數器清空

3.再配置RSRS要先配置arp_ingore arp_announce,再配置VIP地址,最後添加路由

[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_ignore

[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth1/arp_announce

 

[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_ignore

[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth1/arp_announce

 

[root@RS1 ~]# ifconfig eth1:0 172.16.100.1 broadcast 172.16.100.1 netmask 255.255.255.255 up

[root@RS2 ~]# ifconfig eth1:0 172.16.100.1 broadcast 172.16.100.1 netmask 255.255.255.255 up

 

[root@RS1 ~]# route add -host 172.16.100.1 dev eth1:0

[root@RS2 ~]# route add -host 172.16.100.1 dev eth1:0

 

3.director配置負載集羣

[root@director ~]# ipvsadm -A  -t 172.16.100.1:80 -s wrr

[root@director ~]# ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.2 -w 1 -g

[root@director ~]# ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.3 -w 2 -g

 

4.測試訪問成功

http://172.16.100.1

驗證:

[root@director html]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  172.16.100.1:80 wrr

  -> 127.0.0.1:80                 Local   5      0          4        

  -> 172.16.100.2:80              Route   1      0          0        

  -> 172.16.100.3:80              Route   2      1          0

 

 

 

 

 

 

 

 

複雜模型,VIP,提供服務的地址爲外網地址

clip_image004[7]

分析數據包走向:

1.客戶端發送的數據包經過專線到達diector,源目地址爲CIP:VIP

2.directorINPUT鏈收到數據包,發現是集羣服務的一個請求,根據算法,源目地址不變,修改二層幀,發送給一臺RS

3.這臺RS屬於內網地址,將數據包發往內網出口路由器,回送數據包

 

 

 

示例3

因爲手頭就一臺筆記本電腦,所以經過虛擬機來模擬此實驗。

 

準備:

            1臺物理機,3臺虛擬機

    Vmnet1host-only這塊網卡工做,物理機兩個ip都配置在這塊網卡上

            clip_image006[7]

   

clip_image008[7]

 

配置director

[root@director ~]# ifconfig eth1:0 192.168.10.80 netmask 255.255.255.0 up

[root@director ~]# route add -host 192.168.10.80 dev eth1:0 #eth1口轉發數據包的時候保持源地址不變

[root@director ~]# echo 1 >  /proc/sys/net/ipv4/ip_forward #開啓路由轉發功能

配置RS,先配置RSarp響應和請求級別,all是全局

[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_ignore

[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth1/arp_ignore

[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_ignore

 

[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_ignore

[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth1/arp_ignore

[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_ignore

再配置VIP地址

[root@RS1 ~]# ifconfig eth1:0 192.168.10.80 broadcast 192.168.10.80 netmask 255.255.255.255 up

[root@RS1 ~]# route add –host 192.168.10.80 dev eth1:0

[root@RS2 ~]# ifconfig eth1:0 192.168.10.80 broadcast 192.168.10.80 netmask 255.255.255.255 up

[root@RS2 ~]# route add –host 192.168.10.80 dev eth1:0

 

director上配置集羣,集羣調度算法爲wrr,工做模式爲DR

[root@director ~]# ipvsadm –A  -t 192.168.10.80:80 –s wrr

[root@director ~]# ipvsadm –a –t 192.168.10.80:80 –r 172.16.100.2 –g –w 1

[root@director ~]# ipvsadm –a –t 192.168.10.80:80 –r 172.16.100.3 –g –w 2

測試:客戶端訪問

 

clip_image009[7]

clip_image010[7]

使用wrr輪詢 權重爲12,訪問比例大概就是12

[root@director ~]# ipvsadm -L -n –stats #查看狀態

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes

  -> RemoteAddress:Port

TCP  192.168.10.80:80                   44      208        0    20510        0

  -> 172.16.100.2:80                    15       72        0     7442        0

  -> 172.16.100.3:80                    29      136        0    13068        0

因爲是使用物理機來作客戶端訪問和做爲這個http服務的數據包的出站網關,根據上述數據包的走向。

所以能夠經過對Vmnet1進行抓包分析

本機物理機Vmnet1接口的mac地址 00:50:56:c0:00:01

directormac地址 00:0c:29:98:5c:4a

RS1mac地址 00:0c:29:e4:ea:ee

RS2mac地址 00:0c:29:1c:25:e4

#client發往director

clip_image012[7]

#director發往某臺RS

clip_image014[7]

#RS經過另外一個接口發往客戶端

clip_image016[7]

 

5      LVS持久鏈接

不管使用算法,LVS持久都能實如今必定時間內,未來自同一個客戶端請求派發至此前選定的RS

持久鏈接模板(內存緩衝區)

                        每個客戶端  及分配給它的RS的映射關係;

配置方法很簡單:在配置集羣服務的時候添加-p參數來指定鏈接時長

ipvsadm -A|E ... -p timeout:

                        timeout: 持久鏈接時長,默認300秒;單位是秒;

主要應用:SSL鏈接會話

 

持久鏈接類型:

PPC:未來自於同一個客戶端對同一個集羣服務的請求,定位到以前選定的RS;單服務類型

PCC:未來自於同一個客戶端對一個集羣內全部服務的請求,定位到以前選定的RS;全部端口服務

PNMPP:防火牆標記鏈接 就是以前提升的-f選項

            因爲LVS應用在INPUT鏈上面,所以這個標記要在PREROUTING鏈上標記

 

示例4:經過示例2的例子來作繼續實驗

 

PPC

1.http服務設定爲持久鏈接,時間爲600s

ipvsadm -A -t 172.16.100.1  -p 600 -s wrr

ipvsadm -a -t 172.16.100.1 -r 172.16.100.2:80 -g -w 1

ipvsadm -a -t 172.16.100.1 -r 172.16.100.3:80 -g -w 2

 

PCC

2.未來自同一個客戶端對全部端口的請求,始終定向至此前選定的RS中去

ipvsadm -A -t 172.16.100.1 -p 600 -s wrr

ipvsadm -a -t 172.16.100.1 -r 172.16.100.2 -g -w 1

ipvsadm -a -t 172.16.100.1 -r 172.16.100.3 -g -w 1

 

PNMPP

3.未來自同一個客戶端訪問集羣的http服務和telnet服務都轉發都以前選定的RS中去

iptables -t mangle -A PREROUTING -i eth1 -d 172.16.100.1 -p tcp --dport 80 -j MARK --set-mark 10

iptables -t mangle -A PREROUTING -i eth1 -d 172.16.100.1 -p tcp --dport 23 -j MARK --set-mark 10

ipvsadm -A -f 10 -p 600 -s wrr

ipvsadm -a -f 10 -r 172.16.100.2 -g -w 1

ipvsadm -a -f 10 -r 172.16.100.3 -g -w 2

相關文章
相關標籤/搜索