LVS單機測試不負載web
當咱們在我的PC上搭建虛擬機(Vmware)作LVS負載實驗的時候,咱們不管是在我的瀏覽器或者其餘虛擬機上訪問LVS的VIP都會出現上時間刷新都出現同一個頁面的狀況。瀏覽器
那麼這種狀況是咱們的配置錯誤仍是虛擬機的緣由呢。緩存
下面簡單交待下虛擬的環境:服務器
服務器名稱網絡 |
IP以及內容負載均衡 |
LB02curl |
10.0.0.6 VIP:10.0.0.3測試 |
WEB01url |
10.0.0.8 VIP:10.0.0.3 spa 頁面內容 yangliheng |
WEB01 |
10.0.0.9 VIP:10.0.0.3 頁面內容 yyyy |
LVS的配置以及WEB的配置的常規配置咱們就省略了。
重點說下抑制ARP的配置;
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
這些配置的做用就是在與確保上端路由設備去訪問VIP的時候能獲得惟一的MAC地址。
arp_ignore = 1即不迴應不是目標IP是物理網絡IP的ARP請求。確保了客戶端請求VIP的時候只會獲得LB的MAC地址。
arp_announce = 2即RS在回覆客戶端的時候,發送的ARP請求不以本身的VIP的爲源IP,確保了不會更新上端路由的ARP緩存,從而保證之後客戶端請求VIP的時候讀取路由器ARP緩存會獲得LB的MAC地址。
當咱們在另外一臺虛擬機上測試LVS的負載均衡的時候
[root@lb01 ~]# curl 10.0.0.3
yangliheng
[root@lb01 ~]# curl 10.0.0.3
yangliheng
[root@lb01 ~]# curl 10.0.0.3
yangliheng
[root@lb01 ~]# curl 10.0.0.3
yangliheng
[root@lb01 ~]# curl 10.0.0.3
yangliheng
[root@lb01 ~]# curl 10.0.0.3
yangliheng
能夠看到不論刷新多少次都是這個內容(WEB01的)
咱們在這個虛擬機上
[root@lb01 ~]# arp -n
Address HWtype HWaddress Flags Mask Iface
10.0.0.3 ether 00:0c:29:f4:80:e8 C eth0
這是查看10.0.0.3對應的MAC地址,正常來講10.0.0.3應該對應LB02上的MAC地址可是咱們分別查看LB02和WEB01的MAC地址
[root@lb02 ~]# ifconfig
eth0Link encap:Ethernet HWaddr 00:0C:29:3E:C2:E0
inet addr:10.0.0.6Bcast:10.0.0.255Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe3e:c2e0/64 Scope:Link
UP BROADCAST RUNNING MULTICASTMTU:1500 Metric:1
RX packets:46221 errors:0 dropped:0 overruns:0 frame:0
TX packets:16725 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:9061863 (8.6 MiB) TX bytes:1574822 (1.5 MiB)
eth0:0Link encap:Ethernet HWaddr 00:0C:29:3E:C2:E0
inet addr:10.0.0.3Bcast:0.0.0.0 Mask:255.255.255.0
[root@web01 ~]# ifconfig
eth0Link encap:Ethernet HWaddr 00:0C:29:F4:80:E8
inet addr:10.0.0.8Bcast:10.0.0.255Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fef4:80e8/64 Scope:Link
UP BROADCAST RUNNING MULTICASTMTU:1500 Metric:1
RX packets:12579 errors:0 dropped:0 overruns:0 frame:0
TX packets:9604 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1727749 (1.6 MiB) TX bytes:1840750 (1.7 MiB)
eth0:0Link encap:Ethernet HWaddr 00:0C:29:F4:80:E8
inet addr:10.0.0.3Bcast:0.0.0.0Mask:255.255.255.255
UP BROADCAST RUNNING MULTICASTMTU:1500 Metric:1
發現10.0.0.3對應的是WEB01上的MAC地址,即下次訪問10.0.0.3的時候不會通過負載而是直接去訪問WEB01,因此就不會有負載均衡的效果了。
上述是在LINUX客戶端的測試,那麼咱們在咱們的PC瀏覽器上測試的時候也會出現這個問題
屢次訪問都是同一個內容。
那麼咱們懷疑也有多是ARP緩存的問題,咱們來驗證一下。
首先清空電腦的ARP緩存 arp –d
而後在瀏覽器訪問10.0.0.3。
獲得的是
而後在CMD查看ARP緩存
發現了10.0.0.3對應的MAC地址,咱們在虛擬機上查看發現這個MAC地址是WEB02的MAC地址,因此他之後訪問VIP的時候都是直接訪問WEB02。
那麼如何正確測試
一、在LINUX客戶端上
測試前先狀況ARP緩存。
[root@lb01 ~]# arp -d 10.0.0.3 ; curl 10.0.0.3
yyyy
[root@lb01 ~]# arp -d 10.0.0.3 ; curl 10.0.0.3
yangliheng
[root@lb01 ~]# arp -d 10.0.0.3 ; curl 10.0.0.3
yangliheng
[root@lb01 ~]# arp -d 10.0.0.3 ; curl 10.0.0.3
yyyy
[root@lb01 ~]# arp -d 10.0.0.3 ; curl 10.0.0.3
yyyy
[root@lb01 ~]# arp -d 10.0.0.3 ; curl 10.0.0.3
yangliheng
二、在瀏覽器上
同理,刷新瀏覽器頁面前如今CMD中清空ARP緩存。
那麼爲何會出現這種狀況,會影響到咱們的生產環境嗎?
答案是不會,在生產環境中。
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
這些參數已經足夠保證咱們的局域網內的ARP正常
(包括2個方面:不響應ARP請求,RS的ARP請求不會讓上端路由器更新),
那麼因爲咱們是在我的的電腦上去模擬這個LVS的環境,因此有些參數不會生效,好比arp_announce,因此仍是會更新ARP緩存,從而得不到負載的效果。
這個緣由多是由於不管是LINUX客戶端仍是PC 上虛擬出來的路由,並非真實的路由器,因此不支持這個參數吧。