上一篇負載均衡的文章有一個點不少人有疑問,所以我覺得有必要單獨寫篇文章解釋一下,先看下上篇文章展示的架構圖:
這里一些朋友的疑問點是 Nginx 是否多此一舉,能否能直接從 LVS 打到站點層?即改成下面的架構
答案是不行,為什么?其實我在上文中有提到一些點已經暗示了,只不過不那么明顯而已,我再單獨把這些點拎出來
LVS 是四層負載均衡器
Nginx 是七層負載均衡器,可以根據 url 來轉發流量
首先我們需要明白為什么根據 url 轉發請求這么重要,假設現在有「營銷」,「運營中心」這兩個集群,使用 Nginx 的話很簡單,根據 url 來決定到底將請求轉發到哪個集群即可
由于 LVS 不能根據 url 轉發,那么請問 LVS 收到請求后該轉給誰
那么 LVS 為什么不能根據 url 來轉發呢,因為它是四層負載均衡器,什么是四層和七層,這里就要簡單復習下 ISO 七層參考模型了
由此可知,七層對應著應用層,四層對應著傳輸層,如果從應用層發起一個請求會在「傳輸層」,「網絡層」,「數據鏈路層」分別加上各自層的包頭,比如現在 A 電腦要發一個「I‘m Deepon」數據給 B 電腦,則在各層的轉化流程如下圖所示
但最終在互聯網上要傳輸的包(數據鏈路層傳輸的包叫禎,統稱為包)是有大小限制的,如下圖所示
在互聯網上傳輸的包不能超過 14 + 20 + 20 + 1460 + 4 = 1518 byte,其中包含的應用層(即 payload)數據一次性不能超過 1460 個 byte,也就是說如果一個 HTTP 請求有 2000 byte,那么它必須分成兩個包發送才能在網絡上傳輸,再來看看 HTTP 的格式
如果一個 HTTP POST 請求很大,超過了 1460 byte(一個包 payload 的最大值),那么它必須分成兩個包才能傳輸,也就意味著一個包可能包含 URI,另一個包不包含 URI,既然包都不包含 URI,那么請問 LVS 如何根據 URL 來轉發給相應的集群呢,所以理解了 TCP/IP 的工作機制相信你不難理解開頭的問題:LVS 是四層負載均衡器,無法根據 URL 來轉發請求。
其實最關鍵的原因是四層以下其實只負責包的轉發,只要拿出包頭查看一下 ip 地址就可知道該轉發哪里,很高效,如果你還要根據 url 來匹配那么需要拿到應用層數據根據正則等做匹配,顯然會消耗更多的性能,所以專業的人做專業的事,應該由 LVS 來負責承載所有流量,Nginx 負責根據 url 來轉發給對應的集群,因為它是七層負載均衡器,與上下游各建立了一個 TCP 鏈接
所以如果有多個分包,由于 Nginx 與 client 建立了 TCP 連接,可以在 Nginx 先拿到 client 發出的所有的分包再組裝成完整的報文, 然后根據 url 選擇其中一臺 server 與之建立 TCP 連接后將數據分批完整地傳給上游 server
另外需要注意的是現在在大廠中如果只將 Nginx 作為轉發之用是不夠的,一般用的 OpenResty ,什么是 OpenResty 呢
“OpenResty 是一個基于 Nginx 與 Lua 的高性能 Web 平臺,其內部集成了大量精良的 Lua 庫、第三方模塊以及大多數的依賴項。用于方便地搭建能夠處理超高并發、擴展性極高的動態 Web 應用、Web 服務和動態網關。
OpenResty 的目標是讓你的 Web 服務直接跑在 Nginx 服務內部,充分利用 Nginx 的非阻塞 I/O 模型,不僅僅對 HTTP 客戶端請求,甚至于對遠程后端諸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都進行一致的高性能響應。”
注意上面一句「提供了與 MySQL ,Redis 等的交互能力」這一點非常關鍵,我們之前不是說 Nginx 可以根據 url 來決定打向哪個集群嗎,假設現在有一個這樣的場景:所有包含 operation 的請求都轉發到運營中心的集群,則需要寫死類似如下的配置
upstream backend {
server 192.168.1.10:8080
server 192.168.1.11:8080
}
server {
location /operation {
proxy_pass http://backed
}
}
在我們集團中類似這樣的規則非常多,難道要像上面這樣把所有的規則都一個個寫死在 Nginx 的配置文件里嗎?顯然不可行,更合理的方式是把這些規則(哪個 url 對應哪些集群)保存在 MySQL 中,然后 Nginx 在啟動的時候將這些規則從 MySQL 中取出并保存在 Redis 及本地緩存中,然后 Nginx 要根據 url 匹配的時候從本地緩存(如果沒有從 redis 拿,redis 過期從 MySQL 拿)里拿這些規則再根據匹配項轉發到相應的集群,Nginx 沒有這樣的能力,而 OpenResty 由于集成了 Lua,引入了與 MySQL, Redis 等交互的模塊,所以用它是可行的,所以最終架構如下(將 Nginx 換成 OpenResty)
責任編輯:haq
-
負載均衡
+關注
關注
0文章
112瀏覽量
12373 -
LVS
+關注
關注
1文章
36瀏覽量
9957
原文標題:再談負載均衡
文章出處:【微信號:gh_3980db2283cd,微信公眾號:開關電源芯片】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論