壓測平臺 - 使用 LVS 負載均衡解決網路流量成為瓶頸的問題

varqiao發表於2024-10-13

背景

由於公司特性,我們對檔案傳輸壓測較多。通常在高併發的情況下,單機的網路卡流量會存在瓶頸,我們機器的配置是千兆網路卡,單機最多能夠同時處理 1G 左右的網路頻寬。由於物理層面的限制,單機的 mock 服務無法支撐我們的壓測需求。所以我們需要找到一個方案,能夠支撐我們的需求。

方案:

首先我們很容易想到的是,對 mock 服務做一個負載均衡,將流量分散至多臺機器,能夠無限橫向擴充套件,從而解決網路卡流量成為瓶頸的問題。
我們初期調研了常見的 nginx 負載均衡,發現 nginx 作為負載均衡器無法滿足我我們的需求。故而採取 lvs 負載均衡的方式做我們負載轉發器。

nginx 負載均衡

Nginx 作為一個基於 C 實現的高效能 Web 伺服器,可以透過系列演算法解決上述的負載均衡問題。並且由於它具有高併發、高可靠性、高擴充套件性、開源等特點,成為開發人員常用的反向代理工具。

缺點

所有流量都會經過 nginx 所在的伺服器,導致 nginx 成為流量吞吐的瓶頸,無法滿足我們的需求。

LVS 負載均衡

什麼是 LVS

LVS: 是 Linux Virtual Server 的簡寫,也就是 Linux 虛擬伺服器,是一個虛擬的伺服器叢集系統,本專案在 1998 年 5 月由章文嵩博士成立,是中國國內最早出現的自由軟體專案之一。官方網站 :http://www.linuxvirtualserver.org LVS 實際上相當於基於 IP 地址的虛擬化應用,為基於 IP 地址和內容請求分發的負載均衡提出了高效的解決方法,現在 LVS 已經是 Linux 核心標準的一部分。

工作模式

基於 NAT 的 LVS 模式負載均衡

在 NAT 模式下,LVS 負載均衡器作為客戶端和後端伺服器之間的中間人。當客戶端請求到達負載均衡器時,負載均衡器會將請求的目標地址和埠轉換為後端伺服器的實際地址和埠,然後將請求轉發給後端伺服器處理。後端伺服器將響應返回給負載均衡器,負載均衡器再將響應轉發給客戶端。由於轉換地址的過程,客戶端認為直接與負載均衡器通訊,而後端伺服器不直接與客戶端通訊,因此稱為 NAT 模式。

基於 DR 的 LVS 負載均衡

在 DR 模式下,LVS 負載均衡器僅負責將客戶端請求轉發給後端伺服器,而不對請求的源地址和目標地址進行 NAT 轉換。在這種模式下,負載均衡器和後端伺服器必須在同一子網內,且後端伺服器的響應包直接返回給客戶端,不經過負載均衡器。為了實現這一點,負載均衡器和後端伺服器之間透過 ARP 協議繫結了一個虛擬 IP 地址(VIP),客戶端請求到達負載均衡器後,負載均衡器根據配置的轉發規則,將請求直接轉發給後端伺服器,並透過 ARP 來告訴後端伺服器響應的目標 MAC 地址,使得響應可以直接返回給客戶端。

基於 TUN 的 LVS 負載均衡

在 TUN 模式下,LVS 負載均衡器將客戶端請求轉發給後端伺服器,類似於 DR 模式,但後端伺服器響應包返回給負載均衡器,而不是直接返回給客戶端。後端伺服器的響應經過負載均衡器後,再由負載均衡器轉發給客戶端。在 TUN 模式下,負載均衡器和後端伺服器之間透過 IP 隧道建立連線,負載均衡器使用隧道 IP 地址與後端伺服器通訊,並將請求和響應進行封裝和解封裝以實現轉發。

特性 LVS-TUN 模式 LVS-DR 模式
適用網路結構 後端伺服器可以位於不同網路或地理位置 LVS 和後端伺服器必須在同一區域網
資料包傳輸 使用 IP-in-IP 隧道封裝資料包 直接修改 MAC 地址,保持 IP 地址不變
負載均衡器的負載 只處理入站請求,響應直接返回客戶端 只處理入站請求,響應直接返回客戶端
對後端伺服器的要求 後端伺服器必須支援 IP 隧道 後端伺服器必須配置 loopback 上的 VIP
典型應用場景 分散式伺服器叢集,伺服器在不同地理位置 區域網中的高效能伺服器叢集
封裝開銷 有 IP 隧道封裝和解封裝開銷 沒有額外封裝開銷

mock 服務中心架構

從圖片可以看到,整體的服務架構很簡單,我們使用一臺機器作為負載均衡器,使用 lvs 的 DR 模式,將 72.50 作為虛擬 ip。當請求 72.50 的時候,會透過負載均衡演算法,將請求轉發到 72.49 及 72.51 兩個服務上面。

以下為效果

未使用 LVS 負載均衡

未使用 LVS 負載均衡的情況下,壓測機的流量使用達到 110M 左右。

使用 LVS 負載均衡後

由下圖很明顯可以看到,在採取 LVS 負載均衡後,壓測機的網路流量由 110M 左右降低至 1M 以內,而兩個 mock 服務均漲至 50M+,說明兩臺的負載均衡策略成功執行。
原因:改造之前,每個壓測機內部會啟動一個 mock 服務,當單機壓測流量太高的時候,壓測機器的網路頻寬就會出現瓶頸。
現如今的改造是將 mock 服務拆分出來單獨部署,使用 lvs 負載均衡分散流量,將流量分配到不同的節點上。
故從表現來看,壓測機的流量降幅很高,是因為壓測機器已經沒有了 mock 服務。
我們只需要關注兩臺 mock 服務的流量分配即可。

壓測機:72.36,
以下是發壓節點的網路流量情況:

負載均衡器:10.13.72.48~10.13.72.50(50 為虛擬地址)

mock 服務:10.13.72.49

mock 服務:10.13.72.51

難點

  1. 被壓服務只能配置一個 mock 服務的 url,無法配置多個 mock 服務的 url,在使用端沒有做負載均衡。
  2. 流量吞吐量要求高,很容易達到宿主機的網路卡瓶頸,需要分散式配置。
  3. 分散式配置不能採取反向代理或者流量都經過一個節點的模式。

相關文章