首先讓我們來看看下面這張大家都非常熟悉的TCP/IP協議族的分層圖:

關于每層在網絡數據包傳輸過程中所起到的作用不是本文的重點,本文主要是講解如何在網絡層中使用IP來做服務器集群的負載均衡,為什么可以在這一層來做負載均衡。下面在來看IP協議的報頭格式:

內紅色框內的源地址和目的地址是IP負載均衡功能的關鍵所在,IP負載均衡又可以稱之為網絡層負載均衡,其核心原理就是通過內核驅動更改IP的目的地址來完成數據負載均衡的,如下圖:

如上圖所示,用戶請求數據包(源地址為200.10.10.1)到達負載均衡服務器114.100.80.10后,負載均衡服務器在內核進程獲取網絡數據包,根據一定的負載均衡算法得到一臺內部的真實服務器10.0.0.1,然后將數據包的目的IP修改為10.0.0.1,此后數據包將會被發往10.0.0.1的服務器上,服務器處理完后,將向負載均衡服務器返回相應的數據包,負載均衡服務器在把源地址修改為200.10.10.1后將數據包傳輸給用戶瀏覽器。在這一整個過程中,數據包沒有通過用戶的應用進程,因此該負載均衡的性能是非常之高的。
根據以上的圖和上文的講解,大家可能會覺得這很容易實現,其實不然,在這里需要處理關鍵的地方就是如何將集群內部服務器處理完后的數據返回給負載均衡服務器。因為,用戶請求的數據包到達負載均衡服務器前的目的地址是114.100.80.10,源地址是200.10.10.1,通過負載均衡服務器修改后的目的地址是10.0.0.1,源地址還是200.10.10.1,所以處理后返回的數據包目的地址將是200.10.10.1,源地址是10.0.0.1,最終返回的數據包要回到負載均衡服務器就成了問題。
解決的辦法大概有如下兩種:
一、負載均衡服務器使用雙網卡,一個對內一個對外,在修改請求數據包的目的IP的同時也修改源地址,將源地址設為自身的IP,即源地址轉換(SNAT),這樣內部集群服務器響應會再回到負載均衡服務器;
二、將負載均衡服務器作為真實物理服務器集群的網關服務器,這樣所有的響應都將通過負載均衡服務器。
IP負載均衡在內核進程完成數據分發,處理性能得到了很好的提高。但是由于所有請求和響應都要經過負載均衡服務器,集群的最大響應數據吞吐量將受到負載均衡服務器網卡帶寬的限制,對于提供下載服務或者視頻服務等需要大量傳輸數據的站點而言,這是難以滿足需求的。要是能讓響應數據包繞過負載均衡服務器直接發往用戶機器上就好了,有什么辦法可以做到呢?當然有,那就是鏈路層的負載均衡。
參考網站: