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)

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、搭建負載均衡的需求
負載均衡叢集提供了一種廉價、透明、有效的方法,來擴充網絡裝置和伺服器的負載、帶寬、增加吞吐量、加強網絡資料處理能力、提高靈活性和可用性。
那麼在什麼情況下,企業網站需要負載均衡服務呢?
- 單台計算機無法承受大規模的并發通路或者資料流量了,此時需要搭建負載均衡叢集把流量分攤到多台節點裝置上分别處理,即減少使用者的響應時間又提升使用者體驗。
- 單個負載均衡的運算服務分擔到多節點裝置上做并行處理,每台節點裝置處理完畢後,将結果彙總傳回,系統處理能力和效率得到大幅度提高
- 7×24小時的服務保障,任意一個或者多個後端節點裝置當機,不影響整個業務的運作
2.2、lvs(ipvs)軟體工作層次圖
從上圖可以看出,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、工作過程圖
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直接回複給使用者。
執行個體場景裝置清單:
說明:我這裡為了友善,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傳回給使用者
特點:
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
- 進來的時候資料包源ip是cip,目标ip是vip,lvs把目标ip改成rip
- 出來的時候資料包源ip是rip,目标ip是cip,lvs把源ip改成vip
- nat将請求封包(DNAT方式)和相應封包中的ip進行修改
- 每台RS節點的網關位址,必須配成LB的私有lan内實體網卡位址,這樣才能確定資料包傳回是經過LB
- 由于所有資料包傳回都要經過LB,是以LB鴨梨大,成為了叢集瓶頸
- nat模式支援對IP和端口的轉換(DR和TUN不行)、
- 資料包來回都要經過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
其他導緻負載不均衡的原因:
- lvs自身的會話保持參數設定(-p,persistent)。
- lvs排程算法設定,例如:rr,wrr,wlc,lc
- 後端RS節點的會話保持參數
- 通路量少的情況,不均衡現象更加明顯
- 使用者發送請求時間短,請求資源的多少大小
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