lvs-dr模式

LVS-DR集羣

DR=Direct Routing(直接路由)

director 分配請求到不同的 real server。real server 處理請求後直接回應給用戶,這樣 director 負載均衡器僅處理客戶機與服務器的一半連接。負載均衡器僅處理一半的連接,避免了新的性能瓶頸,同樣增加了系統的可伸縮性。Direct Routing 由於採用物理層(修改 MAC 地址)技術,因此所有服務器都必須在一個網段中。

IP= IP Tunneling(IP 隧道)

director 分配請求到不同的 real server。real server 處理請求後直接回應給用戶,這樣 director 負載均衡器僅處理客戶機於服務器的一半連接。IP Tunneling 技術極大地提高了 director 的調度處理能力,同時也極大地提高了系統能容納的最大節點數,可以超過 100 個節點。real server 可以在任何 LAN 戒WAN 上運行,這意味着允許地理上的分佈,這在災難恢復中有重要意義。服務器必須擁有正式的公網 IP地址用於不客戶機直接通信,並且所有服務器必須支持 IP 隧道協議。

Direct Routing 和 IP Tunneling 區別

Direct Routing與IP Tunneling 相比,沒有 IP 封裝的開銷,但由於採用物理層(修改 MAC 地址)技術,所有服務器都必須在一個物理網段。

LVS-DR工作原理拓撲

Lvs-dr的工作原理:Director收到請求,將請求轉發給了我們的realserver,但是接下來的工作就是我們的realserver和我們的客戶端進行通訊了,所以原理圖如下

wKioL1csDSXjZbBuAAJljMQkPiw441.jpg

vs-dr工作流程

工作原理也就是:MAC 轉換過程 (過程,和實驗IP沒有關係)

實例場景設備清單: director 分發器,IP: 192.168.54.120, VIP : 192.168.57.126

wKiom1csDFnxbn2eAAEpsib0PdI286.jpg

1: client 基本信息: IP:192.168.57.135

       向目標vip 發出鏈接請求,Director接收。此時 IP 包頭及數據幀頭信息如下:

wKiom1csDGPT1IguAAFbm3TEDtg632.jpg

2: Director 分發器根據負載均衡算法選擇一臺 active 的 realserver(假設是 192.168.57.122),將此RIP 所在網卡的 mac 地址作爲目標 mac 地址,發送到局域網裏。此時 IP 包頭及數據幀頭信息如下:

wKioL1csDUXACyqwAAGSUpLLY-4208.jpg

       整個過程不會修改IP報文的內容! [訪問客戶端無論多麼複雜,我們可以認爲客戶端與LVS鏈接的時候屬於同一網段的公網地址]

3: realserver(192.168.57.122)在局域網中收到這個幀,拆開後發現目標 IP(VIP)與本地匹配,於是處理這個報文。隨後重新封裝報文,發送到局域網。此時 IP包頭及數據幀頭信息如下:

wKiom1csDKPSb_DSAAHeiyS4g9g411.jpg

4:如果 client 與LVS 同一網段,那麼client(192.168.57.135)將收到這個回覆報文。如果跨了網段,那麼報文通過 gateway路由器經由 Internet 返回給用戶。

歸納一下:1)接收client的請求,根據你設定的負載均衡算法選取一臺realserver的ip;

2)以選取的這個ip對應的mac地址作爲目標mac,然後重新將IP包封裝成幀轉發給這臺RS;

3)在hash table中記錄連接信息。

數據包、數據幀的大致流向是這樣的:client --> VS --> RS --> client

選擇LVS-DR的原因

因爲 NAT 模式效率太低。DR全部使用的公網地址,也就隨之即來的成本問題!


wKioL1csDYySPQJ4AAGw_gthUD4468.jpg

 

 

分發器IP配置

從拓撲圖看出我們的eth0有連個IP地址,所以我們需要配置eht0和eth0:1兩個IP

DIP===eth0===192.168.1.11                VIP===eth0:1===192.168.1.111

[root@pualinux11 ~]# cd/etc/sysconfig/network-scripts/

[root@pualinux11 network-scripts]#cpifcfg-eth0 ifcfg-eth0:1

[root@pualinux11 network-scripts]# vimifcfg-eth0

DEVICE=eth0

TYPE=Ethernet

UUID=4a887011-0d0d-4d90-9a48-6314af3eca79

ONBOOT=yes

NM_CONTROLLED=yes

BOOTPROTO=none

IPADDR=192.168.1.11

PREFIX=24

GATEWAY=192.168.1.254

DNS1=192.168.1.254

HWADDR=00:0C:29:2D:60:43          #若配置文件有MAC,必須和eth0:1的MAC一樣

[root@pualinux11 network-scripts]# vimifcfg-eth0:1

DEVICE=eth0:1#修改名稱

UUID=4a887011-0d0d-4d90-9a48-6314af3eca79           

TYPE=Ethernet

ONBOOT=yes                      #開機啓動

NM_CONTROLLED=yes

BOOTPROTO=none

IPADDR=192.168.1.111#修改IP地址

PREFIX=24

GATEWAY=192.168.1.254

DNS1=192.168.1.254

DEFROUTE=yes

IPV4_FAILURE_FATAL=yes

IPV6INIT=no

HWADDR=00:0C:29:2D:60:43          #若配置文件有MAC,必須和eth0的MAC一樣

[root@pualinux11 network-scripts]#ifdowneth0 ; ifup eth0

[root@pualinux11 network-scripts]# ifconfig                 //查看能否有兩個IP地址

eth0     Link encap:EthernetHWaddr00:0C:29:2D:60:43

inet addr:192.168.1.11 Bcast:192.168.1.255  Mask:255.255.255.0

……

 

eth0:1   Link encap:EthernetHWaddr00:0C:29:2D:60:43

inet addr:192.168.1.111 Bcast:192.168.1.255  Mask:255.255.255.0

         UP BROADCAST RUNNING MULTICAST MTU:1500  Metric:1

兩臺RealServer的IP配置

[root@pualinux13 ~]# cd/etc/sysconfig/network-scripts/

[root@pualinux13network-scripts]#cpifcfg-lo ifcfg-lo:1

[root@pualinux13 network-scripts]# vimifcfg-lo:1

DEVICE=lo:1#修改名稱

IPADDR=192.168.1.111#修改IP

NETMASK=255.255.255.255#代表這臺設備

ONBOOT=yes

NAME=loopback

[root@pualinux13 network-scripts]#ifdown lo; ifup lo

[root@pualinux13 network-scripts]#ifconfiglo:1

lo:1     Link encap:Local Loopback 

inet addr:192.168.1.111 Mask:255.255.255.255

         UP LOOPBACK RUNNING  MTU:16436  Metric:1

 

[root@pualinux15 ~]# cd/etc/sysconfig/network-scripts/

[root@pualinux15network-scripts]#cpifcfg-lo ifcfg-lo:1

[root@pualinux15 network-scripts]# vimifcfg-lo:1

DEVICE=lo:1

IPADDR=192.168.1.111

NETMASK=255.255.255.255

ONBOOT=yes

NAME=loopback

[root@pualinux15 network-scripts]#ifdown lo; ifup lo

[root@pualinux15 network-scripts]#ifconfiglo:1

lo:1     Link encap:Local Loopback 

inet addr:192.168.1.111 Mask:255.255.255.255

         UP LOOPBACK RUNNING  MTU:16436  Metric:1

分發器配置LVS-DR規則

[root@pualinux11 network-scripts]# cd

[root@pualinux11 ~]# rpm -ivh/media/Packages/ipvsadm-1.26-2.el6.x86_64.rpm

[root@pualinux11 ~]#ipvsadm -A -t192.168.1.111:80 -s rr

-t: TCP協議的集羣

-u: UDP協議的集羣

       -f:FWM: 防火牆標記

 [root@pualinux11 ~]# ipvsadm -a -t192.168.1.111:80 -r 192.168.1.13:80 -g        //-g 表示--gatewaying,DR模式

[root@pualinux11 ~]#ipvsadm -a -t192.168.1.111:80 -r 192.168.1.15:80 -g

[root@pualinux11 ~]#ipvsadm -L -n

IP Virtual Server version 1.2.1(size=4096)

ProtLocalAddress:Port Scheduler Flags

->RemoteAddress:Port           Forward Weight ActiveConnInActConn

TCP 192.168.1.111:80rr

->192.168.1.13:80              Route   100

->192.168.1.15:80              Route   100

三個LVS 模式中,只有NAT模式需要開啓路由轉發功能。 DR和TUN模式不需要開啓。

測試數據站

[root@pualinux13 network-scripts]# cd

[root@pualinux13 ~]# vim /etc/sysctl.conf

net.ipv4.conf.eth0.arp_ignore =1#追加這兩行

net.ipv4.conf.eth0.arp_announce =2

net.ipv4.conf.all.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2

-----------------------------------------------------------------------------------

參數說明:

arp_ignore 爲:1  只回答目標 IP 地址是訪問本網絡接口(eth0)的 ARP 查詢請求。 

自己的理解:

在設置參數的時候將 arp_ignore 設置爲 1,意味着當別人的 arp 請求過來的時候,如果接收的網卡設備上面沒有這個 ip,就不做出響應,默認是0,只要這臺機器上面任何一個網卡設備上面有這個 ip,就響應arp 請求,併發送mac 地址。

arp_announce  (宣告) 爲2

對查詢目標使用最適當的本地地址。例如,如果在 eth0 接口上接受到了一個 VIP 的 arp 請求包。內核判斷這個 VIP 地址是不是 eth0 接口上的IP 一樣。如果一樣,則回覆這個包。如果不一樣,就丟棄不迴應。 或者使用命令:不過是臨時生效

echo2>/proc/sys/net/ipv4/conf/eth0/arp_announce

echo1>/proc/sys/net/ipv4/conf/eth0/arp_ignore

[root@pualinux13 ~]#sysctl -p

[root@pualinux13 ~]# cat/etc/sysconfig/network-scripts/ifcfg-eth0 | grep GATEWAY

GATEWAY=192.168.1.254                                  #網關要正確

[root@pualinux13 ~]# yum install -y httpd

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

[root@pualinux13 ~]# service httpd restart

 

[root@pualinux15 network-scripts]# cd

[root@pualinux15 ~]# vim /etc/sysctl.conf

net.ipv4.conf.eth0.arp_ignore =1#追加這四行

net.ipv4.conf.eth0.arp_announce =2

net.ipv4.conf.all.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2

[root@pualinux15~]# cat/etc/sysconfig/network-scripts/ifcfg-eth0 | grep GATEWAY

GATEWAY=192.168.1.254                                  #網關要正確

[root@pualinux15 ~]# yum install -y httpd

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

[root@pualinux15 ~]# service httpd restart

 

注意,在前面我們重啓網卡的時候,我們沒有做ARP處理方案的時候,可能網卡是無法重啓成功的,你也可以配置好VIP和Arp相關的處理方式之後,在重新啓動,效果一樣,只是一個啓動順序的問題而已!

測試集羣運作

如果VMware模擬環境,這裏你可能出現刷新一直都在一個頁面,但你的配置確實很正常的話,那就沒有問題,可以用Linux做輪詢演示:



Linux下使用elinks做輪詢演示:

[root@pualinux113 ~]# yum install -y elinks

[root@pualinux113 ~]#elinkshttp://192.168.1.111 –dump

Pualinux13

[root@pualinux113 ~]#elinkshttp://192.168.1.111 –dump

    Pualinux15

LVS集中調度模式

-s rr                     輪詢法                                                    -swrr    帶權重的輪詢

    -slc                     最少鏈接法                                     

    -swlc    帶權重的最少鏈接法

    -slblc          基於本地的最少鏈接法                         

    -s dh            目標散列法

     -ssh             散列法                                                    

     -ssed          最短週期延遲法

     -snq            永不排隊法                                           

  -s=scheduler=調度的意思

調度散發配置後立即生效,就像iptables規則一樣

rr輪詢   roundrobin

       在服務器中無窮的循環中遍歷

wrr帶權重輪詢   WeightedRound Robin

       基於集羣節點可以處理多少來分配給每個節點一個權重值。權重值爲 2 的服務器將收到權重值爲 1 的服務器的兩倍的連接數量。如果服務器的權重爲 0 ,則不會收到新的連接請求(但當前活動的已經建立的連接將不會丟失)。

lc最少鏈接法             Least-Connection

       當新的請求到達 director 時,director 查看活動和非活動的連接數量,以確定把請求分發給哪個服務器。director 將集羣節點目前的活動連接數量 x256 再加上不活動的連接數量,得到節點的開銷值。最低開銷值的節點勝出,被分發給新的入站請求。(如果開銷一樣,則第一個節點被選中)

wlc帶權重的最少鏈接法  WeightedLeast-Connection

       先如上算出集羣節點的開銷值,然後除以分配給其的權重值,最小值節點勝出,將入站請求分發給它。

lblc基於本地的最少鏈接法           Locality-Based  Least-Connection

       基於局部的最小連接,當 real server 是緩存服務器時用得比較多

dh目標散列法    DestinationHashing

sh散列法     Source  Hashing

       同一個ip 的客戶端總是分發給同一個 real server。 讓客戶端總是能訪問到自己的會話信息,這種機制叫會話保持。

基於ip 地址標識客戶端的缺點:很多內網用戶會僞裝成公網 ip,來訪問服務器,不能人爲的控制負載均衡。

       比較高級的方法是基於客戶端提供我們的 session id 來實現會話保持。haproxy(做負載均衡的軟件)可以實現基於會話信息來判斷保持會話。

如何保持會話一致:如果總是保持和一個 RS 會話,這臺 RS 如果故障了,要確定另一個 RS 也有會話信息,所有的 RS保持數據同步。

       會話同步的方法:所有的 RS 把自己的會話信息保存到數據庫當中(memcached 軟件)。

sed最短週期延遲法  ShortestExpected Delay 最短延時預測 (Ci+1)/Ui  Ci 連接數  Ui 權重值

       在wlc 方法上做了輕微改進,這些服務使用 tcp,而且當羣節點在處理每個請求時保持在活動狀態。

計算方法:每個休羣節點的開銷值是通過將活動的連接數加 1 計算的。然後開銷值除以分配給每個節點的權重,以取得 SED 值,具有最低 SED 值的集羣節點勝出。

nq永不排隊法    Never  Queue

沒有隊列,分配請求給空閒的服務器,沒有空閒的就找響應最快的,如果集羣節點中沒有活動的連接,不管每個集羣節點 SED 計算值的結果,它始終被 分配置服務的新入站請求。

HTTP 的會話(session)信息:

cookies 客戶端(client)自己保存緩存

會話(session)服務器(server)端保存

LVS DR wrr調度算法

實現我們訪問,輪詢的時候在15上輪詢兩次之後,13上一次,2:1的比例承擔我們的訪問負載!

算法配置

[root@pualinux11 ~]#ipvsadm -C

[root@pualinux11 ~]#ipvsadm -A -t192.168.1.111:80 -s rr

[root@pualinux11 ~]#ipvsadm -a -t192.168.1.111:80 -r 192.168.1.13:80 -g -w 10

[root@pualinux11 ~]#ipvsadm -a -t192.168.1.111:80 -r 192.168.1.15:80 -g -w 20

[root@pualinux11 ~]#ipvsadm -L -n –stats

IP Virtual Server version 1.2.1(size=4096)

ProtLocalAddress:Port               Conns   InPktsOutPktsInBytesOutBytes

->RemoteAddress:Port

TCP 192.168.1.111:8000000

->192.168.1.13:8000000

->192.168.1.15:8000000

測試

物理機上刷新http://192.168.1.111,或者linuxelinks測試

[root@pualinux113 ~]#elinkshttp://192.168.1.111 -dump

Pualinux15

 [root@pualinux113 ~]#elinkshttp://192.168.1.111 -dump

Pualinux15

 [root@pualinux113 ~]#elinkshttp://192.168.1.111 -dump

Pualinux13

刷新的過程中我們發現,15的頁面我們看到兩次之後纔會變爲Pualinxu13,也就是訪問了15兩次之後才訪問一次13

[root@pualinux11 ~]# ipvsadm -L -n –stats                    //狀態說明問題

IP Virtual Server version 1.2.1(size=4096)

ProtLocalAddress:Port               Conns   InPktsOutPktsInBytesOutBytes

->RemoteAddress:Port

TCP 192.168.1.111:80362160220860

->192.168.1.13:801272073920

->192.168.1.15:80241440146940

可以看到,一共36次連接,64承擔了24次,62承擔了12次,是2:1的關係,說明權重越大,獲得的連接越多

LVS DR wrr 權重爲0

[root@pualinux11 ~]#ipvsadm -C

[root@pualinux11 ~]#ipvsadm -A -t192.168.1.111:80 -s wrr

[root@pualinux11 ~]#ipvsadm -a -t192.168.1.111:80 -r 192.168.1.13 -g -w 0

[root@pualinux11 ~]#ipvsadm -a -t192.168.1.111:80 -r 192.168.1.15 -g -w 20

客戶單物理機刷新頁面,多次之後查看

[root@pualinux11 ~]#ipvsadm -L -n --stats

P Virtual Server version 1.2.1(size=4096)

ProtLocalAddress:Port               Conns   InPktsOutPktsInBytesOutBytes

->RemoteAddress:Port

TCP 192.168.1.111:80211260129360

->192.168.1.13:8000000

->192.168.1.15:80211260129360

可以看到所有的鏈接都給了15,爲0的權重不接收鏈接

此外:發現InPkts是有的,OutPkts爲0,  因爲數據包出去時,直接交給了 real server,而沒有交給 Director!

網站壓力測試命令

語法: ab -n 數字  -c 數字  http://鏈接

-n requests Number of requests to perform                                       #在測試會話中所執行的請求總個數。默認時,僅執行一個請求

-c concurrency Number of multiple requests to make                             #一次產生的請求個數。默認是一次一個。

[root@pualinux113 ~]# yum install -yhttpd-tools

[root@pualinux113 ~]# ab -n 1000 -c 1000http://192.168.1.111/ #共1000 個請求。 一次要執行 1000 個併發請求。

his is ApacheBench, Version 2.3<$Revision:655654$>

Copyright 1996 Adam Twiss, Zeus Technology Ltd,http://www.zeustech.net/

Licensed to The Apache SoftwareFoundation,http://www.apache.org/

 

Benchmarking 192.168.1.111(be patient)#patient 耐心

Completed 100 requests

Completed 200 requests

Completed 300 requests

Completed 400 requests

Completed 500 requests

Completed 600 requests

Completed 700 requests

Completed 800 requests

Completed 900 requests

Completed 1000 requests

Finished 1000 requests                              # 完成1000個請求

 

Server Software:       Apache/2.2.15# 被測試的httpd服務器版本:平臺 apache 版本

Server Hostname:192.168.1.111# 192.168.1.11 服務器主機名

Server Port:80# 服務器端口

 

Document Path:/# 測試的頁面文檔

Document Length:13 bytes                   # 文檔大小

 

Concurrency Level:      1000                    # 併發數

Time taken for tests:2.919 seconds           # 整個測試花費的時間

Complete requests:      1000                        # 完成的請求數量

Failed requests:0# 失敗的請求數量

Write errors:0

Total transferred:280280 bytes                # 整個測試過程中總傳輸字節數

HTML transferred:13013 bytes                 # 整個場景中的 HTML 內容傳輸量

Requests per second:342.56[#/sec](mean)# 每秒處理請求數。

#大家最關心的指標之一,相當於服務器中的每秒事務數,後面括號中的 mean 表示這是一個平均值

Time per request:2919.174[ms](mean)

#大家最關心的指標之二,平均請求響應時間,後面括號中的 mean 表示這是一個平均值

Time per request:2.919[ms](mean, across all concurrent requests)# 每個請求的時間

#2.919[毫秒](意思是說,在所有的併發請求)每個請求實際運行時間的平均值。

#由於對於併發請求,cpu實際上並不是同時處理的,而是按照每個請求獲得的時間片逐個輪轉處理的,所以基本上第一個 Time per request 時間約等於第二個 Time per request 時間乘以併發請求數

Transfer rate:93.76[Kbytes/sec] received     #傳輸速率,平均每秒網絡上的流量,可以幫劣排除是否存在網絡流量過大導致響應時間延長的問題

Connection Times (ms)# 連接時間(毫秒)

min mean[+/-sd] median  max

Connect:0204398.611077

Processing:18384846.8712816

Waiting:17382847.0702812

Total:56588943.3772907

 

Percentage of the requests served within a certain time (ms)    #在一定的時間內提供服務的請求的百分比(毫秒)

  50%     77

  66%    120

  75%   1119

  80%   1134

  90%   2850

  95%   2868

  98%   2880

  99%   2890

 100%   2907 (longest request)

 #整個場景中所有請求的響應情況。在場景中每個請求都有一個響應時間,其中 50%的用戶響應時間小於77 毫秒,60%的用戶響應時間小於120 毫秒,最大的響應時間小於2907 毫秒

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