天天看點

LVS

lvs

1、ARP協定簡介

ARP全稱:“Address Resolution Protocol”,中文名是位址解析協定,使用ARP協定可實作通過IP位址獲得對應主機的實體地k址(MAC位址)。

在TCP/IP的網絡環境下,每個聯網的主機都會配置設定一個32位的ip位址,這種網際網路位址是在網際範圍辨別主機的一種邏輯位址。為了讓封包在實體網絡上傳輸,還必須知道對方主機的實體位址(MAC)才行,這樣就存在把IP位址變換為實體位址的位址裝換問題。

我們以以太網環境為執行個體說明,為了正确的向目的的主機傳送封包,必須把目标的32位ip位址轉化為目标位址48位以太網mac位址,這就需要在網際網路層上有一個服務或者功能将ip位址轉換為相應的實體位址(mac位址),這個服務或者功能就是ARP協定。

所謂的位址解析,就是主機在發送幀之前将目标ip位址轉換成為目标mac位址的過程,ARP協定的基本功能就是通過目标裝置的IP位址,查詢目标裝置的mac位址,以保證主機之間互相通訊。

ARP與DNS優點相似之處,不同點是:DNS是在域名和IP之間解析,另外ARP協定不需要配置服務,而DNS需要配置服務。

注意:

1. ARP協定需要通信的主機必須在一個實體網段(即區域網路環境)

2.實作區域網路内通過ip擷取主機的mac位址

3.ARP是OSI的第二層資料鍊路層協定

1.1、什麼是ARP代理(ARP proxy)

LVS

ARP快取記錄:

  arp –a   #檢視所有

  arp –d   #清楚

  arp –s   #綁定IP和MAC位址

1.2、ARP快取記錄

(1)       主機有了arp緩存表,可以加快arp的解析速度,減少區域網路内廣播風暴。

(2)       正是有了arp緩存表,給惡意黑客帶來了攻擊伺服器主機的風險,這個就是arp欺騙攻擊。

(3)       案例:切換路由器,負載均衡等裝置,可能會導緻短時網絡中斷。

1.3、ARP在生産環境的問題及解決辦法

(1)ARP病毒,ARP欺詐

  排查

  1、  MAC位址登記部門人員對應,IP綁定,所有裝置登記MAC位址

  2、  區域網路出現arp中毒,特别是無法上網。

  3、  員工上網實體拓撲規範清晰,從交換機上

(2)高可用伺服器對之間切換時要考慮ARP緩存的問題

(3)路由等裝置無縫遷移時要考慮ARP緩存的問題,例如:更換辦公室的路由器

1.4、為什麼使用ARP協定

       OSI把網絡分為7層,彼此之間不能打交道,隻能通過接口。IP在3層,mac在2層,在發送資料包的時候,先要封裝3層IP位址,然後封裝2層的mac位址,但協定隻知道目的節點的ip位址,不知道mac,又不能跨2,3層是以得用ARP協定,幫助擷取mac位址

1.5、ARP小結

1、  ARP全稱:“Address Resolution Protocol”

2、  實作區域網路内通過IP位址擷取主機的MAC位址

3、  MAC位址:48為主機的實體位址,區域網路内唯一。

4、  ARP協定類似DNS服務,但不需要配置ARP服務

5、  ARP協定是OSI 7層模型第三層網絡層協定

6、  ARP協定要求通訊的主機雙方必須在同一實體網段(即區域網路環境)

7、  arp欺騙的原理,arp欺騙的解決方法

8、  arp緩存表的案例:路由器、負載均衡切換

2、lvs負載均衡叢集介紹

2.1、搭建負載均衡的需求

  負載均衡叢集提供了一種廉價、透明、有效的方法,來擴充網絡裝置和伺服器的負載、帶寬、增加吞吐量、加強網絡資料處理能力、提高靈活性和可用性。

那麼在什麼情況下,企業網站需要負載均衡服務呢?

  1. 單台計算機無法承受大規模的并發通路或者資料流量了,此時需要搭建負載均衡叢集把流量分攤到多台節點裝置上分别處理,即減少使用者的響應時間又提升使用者體驗。
  2. 單個負載均衡的運算服務分擔到多節點裝置上做并行處理,每台節點裝置處理完畢後,将結果彙總傳回,系統處理能力和效率得到大幅度提高
  3. 7×24小時的服務保障,任意一個或者多個後端節點裝置當機,不影響整個業務的運作

2.2、lvs(ipvs)軟體工作層次圖

LVS

  從上圖可以看出,lvs負載均衡排程技術是在Linux核心中實作的,是以,被稱為Linux虛拟伺服器,我們使用該軟體配置lvs的時候,不能直接配置核心中的ipvs。而需要使用ipvs的管理工具ipvsadm進行管理,當然也可以通過keepalive軟體之間管理ipvs,并不是通過ipvsadm來管理ipvs。

兩個工具:

  1、  管理配置LVS的工具,ipvsadm.

  2、實作負載排程的工具ip_vs(不能直接操作的),隻能通過ipvsadm管理ip_vs。

ip_vs工作在核心層面的

ipvsadm工作在應用層面

2.3、lvs技術點

1、真正實踐排程的工具是ipvs,工作在Linux核心層面

2、lvs自帶的ipvs指令行管理工具是ipvsadm

3、keepalive實作管理ipvs(配置檔案)及負載均衡器的高可用

4、redhat工具piranhaWEB管理實作排程的工具IPVS

2.4、工作過程圖

LVS

client 用戶端對應的ip位址    cip(client ip address)

負載均衡                       dip網卡上的IP位址(用于連接配接内外網絡的ip位址)

虛拟的ip位址                 vip提供服務的位址

節點(web)                 rip(叢集節點(real server)上使用的ip位址,實體ip位址)

2.5、四種工作模式

LVS的四種工作模式:

  NAT(network address translation)

  TUN(tunneling)

  DR(direct routing)

  FULLNAT(full network address translation)

2.5.1、DR

支援高并發。

為了闡述友善,我根據官方原理圖另外制作了一幅圖,如下圖所示:VS/DR的體系結構:

我将結合這幅原理圖及具體的執行個體來講解一下LVS-DR的原理,包括資料包、資料幀的走向和轉換過程。

官方的原理說明:Director接收使用者的請求,然後根據負載均衡算法選取一台realserver,将包轉發過去,最後由realserver直接回複給使用者。

執行個體場景裝置清單:

LVS

說明:我這裡為了友善,client是與vip同一網段的機器。如果是外部的使用者通路,将client替換成gateway即可,因為IP標頭是不變的,變的隻是源mac位址

①        client向目标vip送出請求,Director接收。此時IP標頭及資料幀頭資訊如下:

LVS

②LVS根據負載均衡算法選擇一台active的realserver(假設是192.168.57.122),将此RIP所在網卡的mac位址作為目标mac位址,發送到區域網路裡。此時IP標頭及資料幀頭資訊如下:

LVS

③ realserver(192.168.57.122)在區域網路中收到這個幀,拆開後發現目标IP(VIP)與本地比對,于是處理這個封包。随後重新封裝封包,發送到區域網路。此時IP標頭及資料幀頭資訊如下:

LVS

④ 如果client與VS同一網段,那麼client(192.168.57.135)将收到這個回複封包。如果跨了網段,那麼封包通過gateway/路由器經由Internet傳回給使用者

特點:

1、通過在排程器lb上修改資料包的目的mac位址實作轉發。注意,源ip位址仍然是cip,目的ip位址仍然是vip

2、請求的封包通過排程器,而rs響應處理後的封包無需經過排程器LB是以,并發通路量大時使用效率很高(和nat模式相比)

3、因為DR模式是通過MAC位址的改寫機制實作的轉發,是以,所有RS節點和排程器LB隻能在一個區域網路LAN中(小缺點)

4、需要注意RS節點的VIP的綁定(lo:vip/32,lo1:vip/32)和ARP抑制問題

5、強調下:RS節點的預設網關不需要的是排程器LB的DIP,而直接是IDC機房配置設定的上級路由器的ip(這是RS帶有外網ip位址的情況),理論講:隻要RS可以出網即可,不是必須要配置外網ip

6、由于DR模式的排程器僅進行了目的MAC位址的改寫,是以,排程器LB無法改變請求的封包的目的端口(和NAT要差別)

7、目前,排程器LB支援所有的UNIX,LINUX系統,但目前不支援WINDOWS系統。真實伺服器RS節點可以是WINDOWS系統

8、總的來說DR模式效率很高,但是配置也比較麻煩,是以,通路量不是特别大的公司可以用haproxy/nginx取代之,這符合運維的原則:簡單、應用、高效。日1000-2000W PV或并發請求1萬以下都可以考慮用haproxy、nginx(LVS NAT模式)

9、直接對外的通路業務,例如:web服務做RS節點,RS最好用公網IP位址。如果不直接對外的業務,例如:mysql,存儲系統RS節點,最好隻用内部IP位址

2.5.2、NAT

  1. 進來的時候資料包源ip是cip,目标ip是vip,lvs把目标ip改成rip
  2. 出來的時候資料包源ip是rip,目标ip是cip,lvs把源ip改成vip
LVS
  1. nat将請求封包(DNAT方式)和相應封包中的ip進行修改
  2. 每台RS節點的網關位址,必須配成LB的私有lan内實體網卡位址,這樣才能確定資料包傳回是經過LB
  3. 由于所有資料包傳回都要經過LB,是以LB鴨梨大,成為了叢集瓶頸
  4. nat模式支援對IP和端口的轉換(DR和TUN不行)、
  5. 資料包來回都要經過LB,是以,要開啟核心轉發net.ipv4.ip_forward = 1,

2.5.3、FULLNAT

1、就是把資料包進來時CIP:VIP改為VIP:RIP

2、出去時:RIP:VIP改為VIP:CIP

2.5.4、TUN

就是在資料包的前面加標頭的形式,什麼都不改的情況下,添加IP頭,到達節點把頭去掉

也需要綁定VIP,抑制ARP,類似于DR模式

3、安裝LVS

3.1、手動配置過程

安裝軟體:

1、檢視LB和節點有沒有安裝(所有機器)

rpm -qa ipvsadm
yum –y install ipvsadm      

2、做軟連接配接,啟動,驗證(所有機器)

ln -s /usr/src/kernels/2.6.32-573.el6.x86_64 /usr/src/linux
ipvsadm
lsmod |grep ip_vs      

手動配置負載均衡:

3、在lb機器上添加VIP(LB機器)

ip addr add 10.0.0.3/24 dev eth0 label eth0:0      

4、配置規則,清理、添加規則、添加real server、檢視驗證(LB機器)

ipvsadm -C
ipvsadm -A -t 10.0.0.3:80 -s wrr -p 300
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.70:80 -g -w 1
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.80:80 -g -w 1
ipvsadm -Ln      

5、RS伺服器,配置VIP、添加路由記錄、抑制ARP(RS所有機器)

ip addr add 10.0.0.3/32 dev lo label lo:0
或者ipconfig lo:0 10.0.0.3/32 up   <==子網路遮罩特殊
route add -host 10.0.0.3 dev lo
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      

驗證:

6、通路,檢視

watch -n 1 ipvsadm -nL --stats      

3.2、ipvsadm指令參數

-A                                  在核心的虛拟伺服器表中添加一條新的虛拟伺服器記錄

-E                                    編輯核心虛拟伺服器表中的一條虛拟伺服器記錄。

-D                                 删除核心虛拟伺服器表中的一條虛拟伺服器記錄。

-C                                   清除核心虛拟伺服器表中的所有記錄。

-R                                   恢複虛拟伺服器規則

-S                                   儲存虛拟伺服器規則,輸出為-R選項可讀的格式

-a                                   在核心虛拟伺服器表的一條記錄裡添加一條新的真實伺服器記錄。

-e                                   編輯一條虛拟伺服器記錄中的某條真實伺服器記錄

-d                                   删除一條虛拟伺服器記錄中的某條真實伺服器記錄

-L|-l--list                                 顯示核心虛拟伺服器表

-Z--zero                         虛拟服務表計數器清零(清空目前的連接配接數量等)

--settcptcpfinudp                   設定連接配接逾時值

--start-daemon                      啟動同步守護程序。他後面可以是master或backup,用來說明LVSRouter是master或是backup。在這個功能上也可以采用keepalived的VRRP功能。

--stop-daemon                      停止同步守護程序

-h--help                           顯示幫助資訊

其他的選項:

-t --tcp-serviceservice-address           說明虛拟伺服器提供的是tcp的服務

-u --udp-serviceservice-address         說明虛拟伺服器提供的是udp的服務

-f --fwmark-servicefwmark                  說明是經過iptables标記過的服務類型。

-r --real-serverserver-address            真實的伺服器

-s --schedulerscheduler                     使用的排程算法,rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,預設的排程算法是:wlc.

-p--persistent[timeout]                        持久穩固的服務。這個選項的意思是來自同一個客戶的多次請求,将被同一台真實的伺服器處理。timeout的預設值為300秒。

-g--gatewaying            指定LVS的工作模式為直接路由模式(也是LVS預設的模式)

-i --ipip                                                指定LVS的工作模式為隧道模式

-m --masquerading                             指定LVS的工作模式為NAT模式

-w--weightweight                                真實伺服器的權值

--mcast-interfaceinterface                 指定多點傳播的同步接口

-c--connection                                   顯示LVS目前的連接配接如:ipvsadm-L-c

--timeout                                           顯示tcptcpfinudp的timeout值如:ipvsadm-L--timeout

--daemon                                          顯示同步守護程序狀态

--stats                                          顯示統計資訊

--rate                                           顯示速率資訊

--sort                                           對虛拟伺服器和真實伺服器排序輸出

--numeric-n                                 輸出IP位址和端口的數字形式

3.3、lvs+keepalived

global_defs {
   router_id LVS_DEVEL
}

vrrp_instance LVI_40 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.4/24 dev eth0 label eth0:1
    }
}

virtual_server 10.0.0.4 80 {                 #vip
    delay_loop 6                              
    lb_algo wlc                                     #算法
    lb_kind DR                                      #模式
    nat_mask 255.255.255.0                 #子網路遮罩
   # persistence_timeout 50                #保持會話
protocol TCP                                  #-t TCP協定

    real_server 10.0.0.70 80 {                #節點IP
        weight 1                                      #權重
              TCP_CHECK {                         #TCP的健康檢查
                     connect_timeout 3         #逾時時間
                     nb_get_retry 3                #
                     delay_before_retry 3      #重複的次數
                     connect_port 80             #檢查的端口
              }
    }

    real_server 10.0.0.80 80 {
        weight 1
              TCP_CHECK {
                     connect_timeout 3
                     nb_get_retry 3
                     delay_before_retry 3
                     connect_port 80
              }
    }
}      

3.4、lvs相關腳本

lvs啟動腳本

!#/bin/bash
VIP=(
10.0.0.3
)

. /etc/rc.d/init.d/functions

case "$1" in
start)
       for ((i=0; i<`echo ${#VIP[*]}`;i++))
       do
              interface="lo:`echo ${VIP[$i]}|awk -F . '{print $4}'`"
              /sbin/ifconfig $interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 up
       done
       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
       action "Start LVS of RearServer.by oldboy "
;;

stop)
       for ((i=0;i<`echo ${#VIP[*]}`;i++))
       do
              interface="lo:`echo ${VIP[$i]}|awk -F . '{print $4}'`"
              /sbin/ifconfig $interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 down
       done
       echo "Close LVS Directorserver"
       action "Start LVS of RearServer.by oldboy "
       if [ ${#VIP[*]} -eq 1 ];then
              echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
              echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
              echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
              echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
       fi
       action "Start LVS of RearServer.by oldboy "
;;

*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac      

lvs健康檢查腳本

#!/bin/sh
VIP=10.0.0.29
PORT=80
RIP=(
10.0.0.80
10.0.0.70
)
while true
do
       for ((i=0;i<`echo ${#RIP[*]}`;i++))
       do
              PORT_COUNT=`nmap ${RIP[$i]} -p $PORT|grep open|wc -l`
              [ $PORT_COUNT -ne 1 ]&&{
              ipvsadm -d -t $VIP:$PORT -r ${RIP[$i]}:$PORT
              echo "${RIP[$i]}" >>/tmp/rx.log
              }
       done
       sleep
done      

3.5、lvs叢集分發請求RS不均衡的解決方法

生産中ipvsadm -L -n發現兩台RS的負載不均衡,一台多一台沒有,并且RS測試服務正常,lo:VIP也有。就是沒有請求

問題原因:

       persistent10的原因,persistent會話保持

IP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags
 -> RemoteAddress:Port               Forward  Weight    ActiveConn     InActConn
TCP  10.0.0.3:80  wrr

-> 10.0.0.70:80                        Route      1            0                   0         
-> 10.0.0.80:80                        Route      1            0                   0      

解決辦法:

       注釋keepalive的配置檔案# persistence_timeout字段,然後reload

其他導緻負載不均衡的原因:

  1. lvs自身的會話保持參數設定(-p,persistent)。
  2. lvs排程算法設定,例如:rr,wrr,wlc,lc
  3. 後端RS節點的會話保持參數
  4. 通路量少的情況,不均衡現象更加明顯
  5. 使用者發送請求時間短,請求資源的多少大小

3.6、生産排錯和思路

1、确定排程器的排程規則和IP的正确性

2、RS節點上的VIP綁定和ARP抑制的檢查

       生産思路:把RS綁定的VIP做實時監控,把RS綁定的VIP做成配置檔案

例如:/etc/sysconfig/network-scripts/lo:0

3、tcpdump,ping

tcpdump 詳解https://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html