根據規模的提升在不同的階段需要使用不同的技術和架構,具體的需求需要具體分析,如果是中小型的 Web 應用。
日活躍小於 1000 萬,使用 nginx 就可以完全滿足了;大型網站或重要的服務,並且服務比較多時,就可以考慮使用 LVS。NginxNginx ("engine x") 是一個高效能的 HTTP 和 反向代理 伺服器,也是一個 IMAP/POP3/SMTP 代理伺服器。
Nginx 特點是佔有記憶體少,併發能力強,nginx 的併發能力在同類型的網頁伺服器中表現較好。
Nginx 的簡單架構:
Nginx 的架構設計Nginx 的架構設計採用的是模組化的,基於事件驅動、非同步、單執行緒且非阻塞(epoll 模型)
Nginx 使用多路複用和事件通知,Nginx 啟動後,在後臺以 daemon 的方式在系統中執行,其中會包括一個主(master)程序,n(n≥1)個工作(worker)程序。
所有的程序都是單執行緒(即只有一個主執行緒)的,程序間通訊主要使用共享記憶體的方式。
其中,master 程序用於接收外部的請求,傳送訊號給 worker 程序,同時監控 worker 程序的工作狀態。
worker 程序用來處理外部請求資訊,請求只能在一個 worker 程序中被處理,一個 worker 程序只有一個主執行緒,同時只能處理一個請求。
Nginx 負載均衡Nginx 負載均衡是對七層網路通訊模型中的應用層(HTTP,HTTPS)進行的。
Nginx 是以反向代理的方式進行負載均衡
反向代理:是以代理伺服器來接收使用者的請求,然後將請求發給內部網路上的伺服器,並將伺服器上的結果返回給請求的客戶端,此時代理伺服器就是一個伺服器。負載均衡:就是將這些客戶端的請求按照某種策略分攤到後臺多臺伺服器上面,進行處理。Nginx 的 upstream 目前支援 6 種演算法分配方式:
輪詢
最基本的配置方法,它是 upstream 模組預設的負載均衡預設策略。每個請求會按時間順序逐一分配到不同的後端伺服器。
有如下引數:
在 30 秒內錯誤次數超過 2 次,就認為伺服器已經不能訪問了,下次就不會訪問該機器
server 10.168.226.1:8080 max_fails=2 fail_timeout=30s;
server 10.168.226.2:8080 max_fails=2 fail_timeout=30s;
weight
權重方式,在輪詢策略的基礎上指定輪詢的機率
server 10.168.226.1:8080 weight=1 ;
server 10.168.226.2:8080 weight=2;
注意:
權重越高分配到需要處理的請求越多。此策略比較適合伺服器的硬體配置差別比較大的情況。ip_hash
指定負載均衡器按照基於客戶端 IP 的分配方式,這個方法確保了相同的客戶端的請求一直髮送到相同的伺服器,以保證 session 會話。
這樣每個訪客都固定訪問一個後端伺服器,可以解決 session 不能跨伺服器的問題。
ip_hash; # 保證每個訪客固定訪問一個後端伺服器
server 10.168.226.1:8080 weight=1 ;
server 10.168.226.2:8080 weight=2;
注意:
ip_hash在nginx1.3版本之後才有的 ip_hash不能與backup同時使用這種策略適合有狀態服務,比如session 當有伺服器需要剔除,必須手動down掉。
least_conn
但是,有些請求佔用的時間很長,會導致所在的後端負載較高,這種情況下,least_conn這種方式就可以達到更好的負載均衡效果least_conn;
server 10.168.226.1:8080 weight=1;
server 10.168.226.2:8080 weight=2;
注意:
這種負載均衡策略適合請求處理時間長短不一致造成伺服器過載的情況
第三方策略
第三方的負載均衡策略的實現需要安裝第三方外掛(upstream_fair)
fair安裝伺服器端響應時間來分配請求,響應時間段的優先分配fair;server 10.168.226.1:8080 weight=1;server 10.168.226.2:8080 weight=2;url_hash按訪問 URL 的 hash 結果來分配請求,是每個 URL 定向知道同一個後端伺服器,要配合緩衝命中來使用同一個資源多次求,可能會到達不同的伺服器上,導致不必要的多次下載,快取命中率不高以及一些資源時間的浪費。而使用 url_hash,可以使得同一個 URL 會到達同一臺伺服器,一段快取了資源,再次請求的時候,就可以從快取中讀取,需要 hash 軟體包hash $request_uri; # 實現每個 URL 定向到同一個後端伺服器server 10.168.226.1:8080 weight=1;server 10.168.226.2:8080 weight=2;Nginx 的優點跨平臺:Nginx 可以在 Linux 上編譯執行,也可以在 window 上執行配置簡單:直接可以透過簡單修改配置檔案,容易上手非阻塞、高併發:官網理論可以支援 5 萬併發連線,在實際生產環境也可以跑到 2-3 萬的併發事件驅動:採用 epoll 模型,支援更多的併發連線記憶體消耗小:記憶體和 CPU 佔用率低。(為 Apache 的 1/5-1/10)內建健康檢查:Nginx 代理的後端的某臺伺服器宕機了,會自動不訪問該機器Nginx 的缺點Nginx 僅能支援 HTTP,HTTPS,tcp,email 等協議不支援直接儲存 session,可以透過 ip_hash 來支援LVSLVS 就是 Linux 虛擬(Virtual Server)伺服器。從 Linux 核心 2.4 之後,內建了 LVS 的各個功能模組,就可以直接 使用 LVS 提供的功能。
LVS 的體系架構LVS 架構 的伺服器集群系統有三個部分 組成:
最前端的負載均衡層,用 Load Balancer 表示中間的伺服器叢集層,用 Server Array 表示最底層的資料共享層,Shard storage 表示負載均衡機制LVS 是四層負載均衡,建立在 OSI 模型的第四層——傳輸層之上,傳輸層有 TCP/UDP,相對於其它高層負載均衡的方法,比如 DNS 域名輪詢解析,應用層負載的排程,客戶端的排程等,它的效率都非常高。
四層負載均衡:主要透過報文中的目標地址和埠七層負載均衡:也稱為“內容交換”,主要透過報文中的 真正有意義的應用層內容。LVS 的轉發主要透過修改 IP 地址(NAT 模式,分為源地址修改 SNAT 和目標地址修改 DNAT)、修改目標 MAC(DR 模式)來實現。
LVS 相關術語DS:Director Server。指的是前端負載均衡器節點。
RS:Real Server。後端真實的工作伺服器。
VIP:向外部直接面向用戶請求,作為使用者請求的目標的 IP 地址。
DIP:Director Server IP,主要用於和內部主機通訊的 IP 地址。
RIP:Real Server IP,後端伺服器的 IP 地址。
CIP:Client IP,訪問客戶端的 IP 地址
NAT 模式:網路地址轉換NAT(network address transaction)是外網和內網地址對映的技術。
NAT 模式下,網路資料的進出都要經過 LVS 處理,LVS 需要作為真實伺服器的閘道器。
當包請求到 LVS 時,LVS 做目標地址轉換(DNAT),將目標 IP 改為 RS 的 IP。RS 處理完,返回響應時,源 IP 是 RS IP,目標 IP 是客戶端的 IP。RS 的包透過閘道器(LVS)中轉,LVS 做源地址轉換(SNAT),將包的源地址改為 VIP,這樣,這個包對客戶端來說就像是 LVS 直接返回給它的。DR 模式:直接路由DR 模式下需要 LVS 和 RS 叢集繫結同一個 VIP,與 NAT 的不同點在於:
請求由 LVS 接受,由真實提供服務的伺服器(RS)直接發放給使用者,返回的時候不經過 LVS。
DR 負載均衡模式資料分發過程中不修改 IP 地址,只修改 Mac 地址,由於實際處理請求的真實物理 IP 地址和 資料請求目的 IP 地址一致,所以不需要透過負載均衡伺服器進行地址轉換,就可以將響應資料直接返回給瀏覽器,避免伺服器網絡卡頻寬成為瓶頸。
DR 模式具有較好的效能,也是目前大型網站使用最廣泛的一種負載均衡。