LVS

lvshtml

一、ARP協議簡介

ARP全稱:「Address Resolution Protocol」,中文名是地址解析協議,使用ARP協議可實現經過IP地址得到對應主機的物理地k址(MAC地址)。mysql

在TCP/IP的網絡環境下,每一個聯網的主機都會分配一個32位的ip地址,這種互聯網地址是在網際範圍標識主機的一種邏輯地址。爲了讓報文在物理網絡上傳輸,還必須知道對方主機的物理地址(MAC)才行,這樣就存在把IP地址變換爲物理地址的地址裝換問題。linux

咱們以以太網環境爲實例說明,爲了正確的向目的的主機傳送報文,必須把目標的32位ip地址轉化爲目標地址48位以太網mac地址,這就須要在互聯網層上有一個服務或者功能將ip地址轉換爲相應的物理地址(mac地址),這個服務或者功能就是ARP協議。nginx

所謂的地址解析,就是主機在發送幀以前將目標ip地址轉換成爲目標mac地址的過程,ARP協議的基本功能就是經過目標設備的IP地址,查詢目標設備的mac地址,以保證主機之間相互通信。web

ARP與DNS優勢類似之處,不一樣點是:DNS是在域名和IP之間解析,另外ARP協議不須要配置服務,而DNS須要配置服務。算法

注意:sql

1. ARP協議須要通訊的主機必須在一個物理網段(即局域網環境)後端

2.實現局域網內經過ip獲取主機的mac地址緩存

3.ARP是OSI的第二層數據鏈路層協議bash

1.一、什麼是ARP代理(ARP proxy)

 

 

ARP緩存表:

  arp –a   #查看全部

  arp –d   #清楚

  arp –s   #綁定IP和MAC地址

1.二、ARP緩存表

(1)       主機有了arp緩存表,能夠加快arp的解析速度,減小局域網內廣播風暴。

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

(3)       案例:切換路由器,負載均衡等設備,可能會致使短時網絡中斷。

1.三、ARP在生產環境的問題及解決辦法

(1)ARP病毒,ARP欺詐

  排查

  一、  MAC地址登記部門人員對應,IP綁定,全部設備登記MAC地址

  二、  局域網出現arp中毒,特別是沒法上網。

  三、  員工上網物理拓撲規範清晰,從交換機上

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

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

1.四、爲何使用ARP協議

       OSI把網絡分爲7層,彼此之間不能打交道,只能經過接口。IP在3層,mac在2層,在發送數據包的時候,先要封裝3層IP地址,而後封裝2層的mac地址,但協議只知道目的節點的ip地址,不知道mac,又不能跨2,3層因此得用ARP協議,幫助獲取mac地址

1.五、ARP小結

一、  ARP全稱:「Address Resolution Protocol」

二、  實現局域網內經過IP地址獲取主機的MAC地址

三、  MAC地址:48爲主機的物理地址,局域網內惟一。

四、  ARP協議相似DNS服務,但不須要配置ARP服務

五、  ARP協議是OSI 7層模型第三層網絡層協議

六、  ARP協議要求通信的主機雙方必須在同一物理網段(即局域網環境)

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

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

二、lvs負載均衡集羣介紹

2.一、搭建負載均衡的需求

  負載均衡集羣提供了一種廉價、透明、有效的方法,來擴展網絡設備和服務器的負載、帶寬、增長吞吐量、增強網絡數據處理能力、提升靈活性和可用性。

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

  1. 單臺計算機沒法承受大規模的併發訪問或者數據流量了,此時須要搭建負載均衡集羣把流量分攤到多臺節點設備上分別處理,即減小用戶的響應時間又提高用戶體驗。
  2. 單個負載均衡的運算服務分擔到多節點設備上作並行處理,每臺節點設備處理完畢後,將結果彙總返回,系統處理能力和效率獲得大幅度提升
  3. 7×24小時的服務保障,任意一個或者多個後端節點設備宕機,不影響整個業務的運行

2.二、lvs(ipvs)軟件工做層次圖

 

 

  從上圖能夠看出,lvs負載均衡調度技術是在Linux內核中實現的,所以,被稱爲Linux虛擬服務器,咱們使用該軟件配置lvs的時候,不能直接配置內核中的ipvs。而須要使用ipvs的管理工具ipvsadm進行管理,固然也能夠經過keepalive軟件之間管理ipvs,並非經過ipvsadm來管理ipvs。

 

兩個工具:

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

  二、實現負載調度的工具ip_vs(不能直接操做的),只能經過ipvsadm管理ip_vs。

ip_vs工做在內核層面的

ipvsadm工做在應用層面

2.三、lvs技術點

一、真正實踐調度的工具是ipvs,工做在Linux內核層面

二、lvs自帶的ipvs命令行管理工具是ipvsadm

三、keepalive實現管理ipvs(配置文件)及負載均衡器的高可用

四、redhat工具piranhaWEB管理實現調度的工具IPVS

2.四、工做過程圖

 

 

client 客戶端對應的ip地址    cip(client ip address)

負載均衡                       dip網卡上的IP地址(用於鏈接內外網絡的ip地址)

虛擬的ip地址                 vip提供服務的地址

節點(web)                 rip(集羣節點(real server)上使用的ip地址,物理ip地址)

2.五、四種工做模式

LVS的四種工做模式:

  NAT(network address translation)

  TUN(tunneling)

  DR(direct routing)

  FULLNAT(full network address translation)

2.5.一、DR

支持高併發。

爲了闡述方便,我根據官方原理圖另外製做了一幅圖,以下圖所示:VS/DR的體系結構:

 

我將結合這幅原理圖及具體的實例來說解一下LVS-DR的原理,包括數據包、數據幀的走向和轉換過程。

官方的原理說明:Director接收用戶的請求,而後根據負載均衡算法選取一臺realserver,將包轉發過去,最後由realserver直接回復給用戶。

實例場景設備清單:

說明:我這裏爲了方便,client是與vip同一網段的機器。若是是外部的用戶訪問,將client替換成gateway便可,由於IP包頭是不變的,變的只是源mac地址

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

 

 

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

 

 

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

 

 

④ 若是client與VS同一網段,那麼client(192.168.57.135)將收到這個回覆報文。若是跨了網段,那麼報文經過gateway/路由器經由Internet返回給用戶

特色:

一、經過在調度器lb上修改數據包的目的mac地址實現轉發。注意,源ip地址仍然是cip,目的ip地址仍然是vip

二、請求的報文經過調度器,而rs響應處理後的報文無需通過調度器LB所以,併發訪問量大時使用效率很高(和nat模式相比)

三、由於DR模式是經過MAC地址的改寫機制實現的轉發,所以,全部RS節點和調度器LB只能在一個局域網LAN中(小缺點)

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

五、強調下:RS節點的默認網關不須要的是調度器LB的DIP,而直接是IDC機房分配的上級路由器的ip(這是RS帶有外網ip地址的狀況),理論講:只要RS能夠出網便可,不是必需要配置外網ip

六、因爲DR模式的調度器僅進行了目的MAC地址的改寫,所以,調度器LB沒法改變請求的報文的目的端口(和NAT要區別)

七、當前,調度器LB支持全部的UNIX,LINUX系統,但目前不支持WINDOWS系統。真實服務器RS節點能夠是WINDOWS系統

八、總的來講DR模式效率很高,可是配置也比較麻煩,所以,訪問量不是特別大的公司能夠用haproxy/nginx取代之,這符合運維的原則:簡單、應用、高效。日1000-2000W PV或併發請求1萬如下均可以考慮用haproxy、nginx(LVS NAT模式)

九、直接對外的訪問業務,例如:web服務作RS節點,RS最好用公網IP地址。若是不直接對外的業務,例如:mysql,存儲系統RS節點,最好只用內部IP地址

 

2.5.二、NAT

  1. 進來的時候數據包源ip是cip,目標ip是vip,lvs把目標ip改爲rip
  2. 出來的時候數據包源ip是rip,目標ip是cip,lvs把源ip改爲vip

 

 

特色:

  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.三、FULLNAT

一、就是把數據包進來時CIP:VIP改成VIP:RIP

二、出去時:RIP:VIP改成VIP:CIP

2.5.四、TUN

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

也須要綁定VIP,抑制ARP,相似於DR模式

三、安裝LVS

3.一、手動配置過程

安裝軟件:

一、查看LB和節點有沒有安裝(全部機器)

rpm -qa ipvsadm
yum –y install ipvsadm

二、作軟鏈接,啓動,驗證(全部機器)

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

手動配置負載均衡:

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

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

四、配置規則,清理、添加規則、添加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

五、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

驗證:

六、訪問,查看

watch -n 1 ipvsadm -nL --stats

3.二、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.三、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.四、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.五、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.六、生產排錯和思路

一、肯定調度器的調度規則和IP的正確性

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

       生產思路:把RS綁定的VIP作實時監控,把RS綁定的VIP作成配置文件

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

三、tcpdump,ping

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

相關文章
相關標籤/搜索