深入淺出 LVS 負載均衡系列(二):DR、TUN 模型原理

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"上篇從計算機間的通信說起,知道通信必要的六要素是 源 IP 地址、端口號、源 MAC 地址,目標 IP 地址、端口號、目標 MAC 地址。其中,端口號標誌了在應用層的兩個具體應用信息,即快遞的具體發送人和接收人,IP 地址表示在網絡層上兩個端點的地址,即快遞的發出地址和收貨地址,MAC 地址表示在數據鏈路層上節點間的地址,即快遞傳送中的各個驛站的地址。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在瞭解 LVS 的 NAT、FULLNAT 模型對數據包的修改方式以及它們的缺點之後,站在 NAT 模型的肩膀上,怎樣才能更好地優化負載均衡器?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在 NAT 和 FULLNAT 模式中,不管是請求數據包還是響應數據包,都要經過負載均衡器。但是響應數據包一般要比請求數據包大很多,這可能會成爲系統的瓶頸。如果能夠將請求數據包轉發到真實服務器之後,響應數據包由真實服務器直接返回,這樣對負載均衡器的壓力就小很多。這種模式又應該如何實現呢?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"DR 模式","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/cc/cc16b3af3dbfebc6378d4c984764e25d.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果真的能夠由真實服務器直接響應客戶端,而不經過負載均衡器。那麼這個由負載均衡器直接響應回客戶端的數據包需要滿足什麼條件,才能被客戶端正常接收?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"真實服務器發出的數據包,在客戶端接收到的時候,一定要匹配得上從客戶端發出的數據包。如果不匹配的話,客戶端收到響應數據包後會直接將數據包丟棄。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"📌客戶端發出的請求數據包:CIP ➡️ VIP,則收到的響應數據包一定是 VIP ➡️ CIP。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"💡做個小思考,爲什麼沒有帶上 MAC 地址?後文有解釋~","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"但是 VIP 已經綁定在負載均衡器上,真實服務器也有多個,在連通的網絡裏,如何能讓多個真實服務器和負載均衡器的 VIP 地址相同?並且真實服務器的 VIP 不能被其他設備訪問的到。也就是說在每臺真實服務器上的 VIP 地址,只能它們自己知道“我悄悄藏着 VIP”,別的設備壓根不知道。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這裏不得不提另一個非常神奇的 IP 地址 127.0.0.1/0.0.0.0。仔細想一下,127.0.0.1 不就是每臺設備上都相同,“悄悄藏着”的 IP 地址嗎,除了自己的其他設備都沒辦法訪問。這個神奇的 IP 地址,叫做 Loopback 接口。它是一種純軟件性質的虛擬接口,當有請求數據包送達到 lo 接口,那麼 lo 接口會將這個數據包直接 “掉頭”,返回給這個設備本身,這就是“環回”接口的由來。所以,如果將 VIP 綁定在 lo 接口上,是不是就可以完成“只有自己知道這個 VIP,別的設備不知道”呢?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"將 VIP 綁定在 lo 接口上,其實只完成了一半,只是做到了在多臺真實服務器上綁定相同的 VIP 地址。還記得上篇文章中所講的 ARP 協議嗎,ARP 協議會採集在當前局域網中,除了自己之外的其他主機的 MAC 地址和 IP 地址的映射關係。而 VIP 是一個不能被別的設備採集到的地址,所以我們要對真實服務器的 ARP 協議做一些修改,讓 VIP 不會被其他設備採集到。很顯然,這不但要修改設備收到 ARP 請求之後的響應(arp_ignore 參數),也要修改設備向外通告 ARP 的請求 (arp_announce 參數)。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"📌arp_ignore:定義接收 ARP 請求時的響應級別 0:響應任意網卡上接收到的對本機 IP 地址的 ARP 請求(包括環回網卡),不論目的 IP 地址是否在接收網卡上 1:只響應目的 IP 地址爲接收網卡地址的 ARP 請求 2:只響應目的 IP 地址爲接收網卡地址的 ARP 請求,且 ARP 請求的源 IP 地址必須和接收網卡的地址在同網段","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"📌arp_announce:定義將自己地址向外通告時的通告級別 0:允許任意網卡上的任意地址向外通告 1:儘量僅向目標網絡通告與其網絡匹配的地址 2:僅向與本地接口上地址匹配的網絡進行通告","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"可以看到,arp_ignore 爲 1 並且 arp_announce 爲 1 時,lo 接口上綁定的 VIP 可以被藏在本機上,只有自己知道。","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/63/635d448836c17c6ca1d0ee7a8321f3b9.webp","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"(如圖:紅色表示發出的數據包;綠色表示返回的數據包;黃色表示負載均衡器修改的內容;虛線表示經過 N 個下一跳,即可以不在同一局域網內;實線表示只能 “跳躍一次”,即必須在同一局域網內)","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1.當計算機發出一個請求的數據包到達負載均衡器後,負載均衡器修改請求數據包的 { 目標MAC 地址 } 爲 真實服務器的 MAC 地址,其餘信息不變。負載均衡器和真實服務器必須在同一局域網內,否則負載均衡器無法替換請求數據包的 { 目標MAC 地址 } 爲 真實服務器的 MAC 地址","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2.真實服務器收到請求的數據包,發現自己有一個 “隱藏“ 的 VIP,於是接收這個數據包,並交由對應的上層應用處理","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"3.處理完成後,將響應數據包直接返回給客戶端。此時在真實服務器上查看 TCP 連接爲:VIP ➡️ CIP","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"總結一下 DR 模式的特點:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1.僅修改請求數據包的「目標 MAC 地址」,作用在數據鏈路層。因此負載均衡器必須和真實服務器在同一局域網內,且不能對端口進行轉發","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2.真實服務器中的 VIP,只能被自己 “看見”,其他設備不可知。因此 VIP 必須綁定在真實服務器的 lo 網卡上,並且不允許將此網卡信息經過 ARP 協議對外通告","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"3.請求的數據包經過負載均衡器後,直接由真實服務器返回給客戶端,響應數據包不需要再經過負載均衡器","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"TUN 模式","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/cc/cc16b3af3dbfebc6378d4c984764e25d.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"除了直接修改請求數據包的目標 MAC 地址,做一次 MAC 地址欺騙之外,還有沒有其他方式能夠將響應數據包由真實服務器直接返回給客戶端呢?看看 VPN 是怎麼能夠支持你遠程辦公的吧~","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們已經討論過,如果真實服務器直接將響應數據包返回給客戶端,那麼真實服務器必須有一個 “隱藏” 的 VIP,即配置在 lo 網卡上並且不允許此 VIP 通過 ARP 協議對外通告。","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/23/23a979a4b6c75de98cbbb1a9ad6dd3cd.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"(如圖:紅色表示發出的數據包;綠色表示返回的數據包;黃色表示負載均衡器修改的內容;虛線表示經過 N 個下一跳,即可以不在同一局域網內;實線表示只能 “跳躍一次”,即必須在同一局域網內)","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1.當計算機發出一個請求的數據包到達負載均衡器後,負載均衡器不改變源數據包,而是在源數據包上新增一層 IP 首部 { 分發 IP、端口號、MAC 地址 } ➡️ { 真實服務器 IP、端口號、MAC 地址 }","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2.真實服務器收到請求的數據包後,將最外層封裝的 IP 首部去掉,發現還有一層 IP 首部,並且目標 IP 地址能夠和 lo 上的地址匹配,於是收下請求數據包,並交由對應的上層應用處理","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"3.處理完成後,將響應數據包直接返回給客戶端。此時在真實服務器上查看 TCP 連接爲:VIP ➡️ CIP","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"總結一下 TUN 模式的特點:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1.不改變請求數據包,而是在請求數據包上新增一層 IP 首部信息。因此負載均衡器不能對端口進行轉發,但可以和真實服務器不在同一局域網內,且真實服務器需要支持能夠解析兩層 IP 首部信息,即需要支持“IP Tunneling”或“IP Encapsulation”協議","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2.真實服務器中的 VIP,只能被自己 “看見”,其他設備不可知。因此 VIP 必須綁定在真實服務器的 lo 網卡上,並且不允許將此網卡信息經過 ARP 協議對外通告","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"3.請求的數據包經過負載均衡器後,直接由真實服務器返回給客戶端,響應數據包不需要再經過負載均衡器","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"NAT、FULLNAT、DR、TUN模式總結","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/ef/ef71dcf3ef8a3bb22dd9c63cd41f2cd6.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在 DR 和 TUN 模式中,負載均衡器只轉發了請求數據包,響應數據包不經過負載均衡器,而是直接返回給客戶端。解決了在通常情況下響應數據包比請求數據包大,如果請求和響應數據包都經過負載均衡器,在高併發下可能成爲系統瓶頸的問題。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"根據我們的推導過程,可以輕易地得出各種模式的特點和它們要解決的問題。","attrs":{}}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"NAT 模式,通過修改數據包的「目標 IP 地址」和 「源 IP 地址」,將請求負載到多臺真實服務器,是四層負載均衡模式中最基礎的負載方式。因爲它是對 IP 地址層面的修改,作用在網絡層,所以可以對端口進行映射。真實服務器返回的響應數據包必須經過負載均衡器,所以要求真實服務器的默認網關是負載均衡器。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"FULLNAT 模式,是對 NAT 模式的一種演進。通過同時修改「源 IP 地址」和「目標 IP 地址」,突破 NAT 模式中真實服務器的默認網關必須是負載均衡器的限制。但是由於同時修改了「源 IP 地址」和「目標 IP 地址」,真實服務器建立的真實連接和客戶端毫無關係,所以會丟失客戶端的信息。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"DR 模式,是對 NAT 模式的另一種演進。由於真實請求中響應數據包比請求數據包大很多的特點,在高併發下會成爲系統的瓶頸,於是將響應數據包直接由真實服務器返回給客戶端。使用 MAC 地址欺騙來達到此目的,作用於數據鏈路層,所以不能對端口映射。並且在真實服務器上,必須有一個僅自己可見的 “隱藏” VIP。在網絡中,真實的 VIP 綁定在負載均衡器上,用來接收客戶端的真實請求數據包。而 “隱藏” 的 VIP 綁定在真實服務器的 lo 接口上,用來欺騙自己可以正常接收目標地址是 VIP 的數據包。所以真實服務器的默認網關也必須是負載均衡器。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"TUN 模式,是對 DR 模式的一種演進。突破 DR 模式中真實服務器的默認網關必須是負載均衡器的限制。TUN 模式不會對源數據包進行修改,而是在源數據包上額外新增一條 IP 首部信息,所以不能對端口映射,且要求真實服務器必須能夠卸載掉兩層 IP 首部信息。","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"💡 回顧之前的小思考題:爲什麼在說真實服務器能夠正常接收負載均衡器轉發的數據包的必要條件時,沒有帶上 MAC 地址?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在網絡通信部分介紹 ARP 協議和下一跳機制時,我們提到數據包在網絡中的轉發和快遞傳送中的驛站類似,每一次數據包的發送,會不斷地找到 “下一個目的地” 的 MAC 地址。所以,但凡涉及到物理端口的變遷,都涉及到源 MAC 地址的變化,這個變化是 IP 通信的特性,而並不是負載均衡的特點。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在對負載均衡的各個模式有一定的瞭解之後,下一篇我們來看看具體實踐和配置💡 ~","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"關於UCloud負載均衡服務ULB","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/cc/cc16b3af3dbfebc6378d4c984764e25d.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"UCloud負載均衡服務ULB支持內網和外網兩種場景,支持請求代理和報文轉發兩種轉發模式。ULB4是基於DPDK技術自研的,採用了類似於DR的轉發模式,單臺服務器可以提供超過3000萬併發連接,1000萬 pps,10G線速轉發能力。採用集羣部署,單個集羣至少4臺服務器。利用ECMP+ BGP實現高可用。ULB7基於Haproxy開發,也就是Fullnat模式,單個實例可以支持超過40w pps,2Gbps,以及至少40萬併發連接。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"相對於ULB7,ULB4轉發能力更強,適合與追求轉發性能的場景。而ULB7則可以對七層數據進行處理,可以進行SSL的卸載,執行域名轉發、路徑轉發等功能,並且後端節點不需要額外配置VIP(虛擬IP)。","attrs":{}}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章