高并发负载均衡(二):LVS 的 DR,TUN,NAT 网络模型推导
上節回顧
路由器就是要連接不同的網段,它是用來選擇路線的。它里面有路由表,可以進行路由轉發的判定。
交換機是負責同一個網絡中轉發,他只要轉發就行了。
ARP協議
發送端必須獲取到目的MAC地址,MAC地址通過ARP協議來獲取。
arp -a本質就是一個IP地址->MAC地址的對應表,表中每一個條目分別記錄了網絡上其他主機的IP地址和對應的MAC地址。
ARP表在初始的時候是空的。
ARP請求
主機A的ARP緩存表中不存在主機C的MAC地址,所以主機A會發送ARP Request來獲取目的MAC。主機A不知道主機C的MAC地址,所以目的MAC地址為廣播地址FF-FF-FF-FF-FF-FF。交換機收到這個特殊的包之后會廣播出去,ARP request報文會在整個網絡上傳播,該網絡中所有主機包括網關都會接受到此ARP request 報文。網關會阻止該報文發送到其他網絡上。
ARP響應
所有主機接收到該ARP request報文后,會檢查它的目的協議地址(一般是00-00-00-00-00-00-00與所有的匹配)字段與自身的IP地址是否匹配。如果不匹配,則該主機將不會響應該ARP request報文。如果匹配,則該主機會將ARP報文中的源MAC地址和源IP地址信息記錄到自己的ARP緩存表中,然后通過ARP Reply報文進行響應。
另外,交換機具有記憶,下一次再遇到相同的目標地址時,就不需要廣播了,直接發送到目標端口。現在通常情況下,計算機聯網后會主動向外通告自己的mac地址,減少了主動通過ARP拉取的過程。
案例
假如我有另一臺主機B,主機B的IP地址是192.168.150.3,我主機B上添加了一個虛擬網卡192.168.88.88之后,想要在當前這主機A上ping通這個新添加的網卡地址,需要手動配一下路由表條目,否則這個ping會被發送到網關192.168.150.2上,導致ping不通。
網絡包傳輸的過程
看下圖,一個網絡包在發送的過程中,每經過一跳,它的目標mac地址、源mac地址都要發生變化,而源IP、目標IP始終是不變的。
負載均衡
同一網絡當中IP地址不能重復出現,否則會沖突,不知道應該發給誰。
LVS的引入:
為什么Tomcat承受的并發少?因為Tomcat是在協議的第7層,也就是應用層的軟件,是整個網絡通信過程中最末端的層次。況且Tomcat是Java開發的,它跑在JVM上,又要進行用戶態內核態的切換,這樣就更慢了。(Nginx也是在7層應用層,所以Nginx的帶寬是有上限的,但是LVS是在4層的,可以承受更大的并發;socket可以看做是在第4層的,是一個規范的接口)
路由器只是三層的設備,只需要做轉發。
現在我們從通信的角度考慮,如果有一個負載均衡服務器設備,可以根本不需要和客戶端握手,收到數據包就直接轉發出去,這樣能夠提高性能。這就是一種數據包級別的 四層負載均衡技術。
我們得到下面這樣的拓撲模型,可以解決負載均衡的問題。
首先我們統一一下命名:
CIP:客戶端client IP地址
VIP:負載均衡服務器的虛擬virtual IP
DIP:用于分發的dispacher IP
RIP:真實的服務器的real IP
NAT 網路地址轉換
網路地址轉換一般出現在路由器上
首先我們要知道,私有地址不會出現在互聯網上
S-NAT:源地址替換協議
假設你和你女朋友在家都要訪問百度,你的IP:port是192.168.1.8:12121,你女朋友IP:port是192.168.1.6:12121,如果不進行地址轉換的話,你們倆的地址發到百度8.8.8.8:80之后,百度看到的都是6.6.6.6:12121,這時候百度服務器就懵了,不知道這倆有什么區別。
那怎么解決這個問題呢?
使用NAT網絡地址轉換,路由器自己維護一張轉換表,把你倆的192.168.1.8:12121和192.168.1.6:12121分別轉換成6.6.6.6:123和6.6.6.6::321,用不同的端口發送給百度,收到返回的數據包后,再按照自己記錄的轉換表,把網絡包發送回給你和你女朋友。
D-NAT模式:目標地址轉換協議,基于3層
可以用下圖這種方式實現負載均衡:客戶端發來的請求到負載均衡服務器,負載均衡服務器將請求分發到后面的server上,server將響應返回給負載均衡服務器,注意這之間需要多次源IP與目標IP的替換。
弊端:
- 非對稱:客戶端給服務端發送的請求數據量是很小的,但是服務端給客戶端返回的數據量很大。下行的數據使服務器帶寬成為瓶頸。早期的ADSL可以達到6M的全速單一方向,如果平分的話,上下行都是3M。所以運營商做了手腳進行了調整,將下行的帶寬調的很大,將上傳的帶寬調的比較小。
- 消耗算力
怎么解決上述弊端?如果能夠讓 real server 返回的數據不經過負載均衡服務器,而是直接返回給客戶端就好了。
DR模型:直接路由模型,基于2層,替換的是MAC地址而不是IP地址,也就是我們所說的“MAC地址欺騙”
于是我們想啊,如果有這么一種技術:每一個server都能夠配一個VIP,但是由于IP不能重復,這個VIP對外隱藏,只對內可見(其實是對ARP協議進行手術)。兩臺server共同在負載均衡服務器上對外暴露同一個VIP,別人請求只能請求到這臺負載均衡服務器上來,這樣就能從server直接向客戶端返回數據包,而不需要走負載均衡服務器了。
負載均衡服務器在轉發數據包的時候,將封裝的目標mac地址修改為real server的mac地址(mac地址是點到點的,代表的是一跳的距離,要保證負載均衡服務器與你的server在同一個網絡中,不能下一跳跳到別的網絡去。這種修改mac地址的模式是基于2層鏈路層的,沒有修改3層網絡層,缺點是不能跨網絡,負載均衡服務器和真實服務器RS realserver要在同一個局域網。這是一個約束)。
優勢:速度快,成本低
隧道模式
假設我們有好多好多的RS(real server),現在這些RS和負載均衡服務器不在同一個機房了。怎么解決這個問題?使用隧道技術。
啥是隧道技術?
在CIP->VIP外面包裹一層DIP->RIP地址,這樣數據包就可以順利的從負載均衡服務器被發送到server1
server1收到這個數據包之后,把外層的DIP->RIP撕掉,就能看到真正的CIP->VIP,自己處理之后,根據CIP->VIP直接返回給客戶端。
我們以往用到的PPPOE這種協議就是這種技術。
這節課我們講的是理論,下節課我們講它的實現,也就是LVS,以及LVS的DR模型實驗搭建
總結
以上是生活随笔為你收集整理的高并发负载均衡(二):LVS 的 DR,TUN,NAT 网络模型推导的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高并发负载均衡(一):网络协议原理
- 下一篇: 高并发负载均衡(三):LVS的DR模型试