Java編程——如何深入淺出Nginx負載均衡

Java編程——如何深入淺出Nginx負載均衡

一 特點

1.1 應用情況

Nginx做為一個強大的Web服務器軟件,具有高性能、高併發性和低內存佔用的特點。此外,其也能夠提供強大的反向代理功能。俄羅斯大約有超過20%的虛擬主機採用Nginx作為反向代理服務器,在國內也有騰訊、新浪、網易等多家網站在使用Nginx作為反向代理服務器。據Netcraft統計,世界上最繁忙的網站中有11.48%使用Nginx作為其服務器或者代理服務器。基於反向代理的功能,Nginx作為負載均衡主要有以下幾點理由:

  1. 高併發連接
  2. 內存消耗少
  3. 配置文件非常簡單
  4. 成本低廉
  5. 支持Rewrite重寫規則
  6. 內置的健康檢查功能
  7. 節省帶寬
  8. 穩定性高

1.2 架構

Java編程——如何深入淺出Nginx負載均衡

上圖為來自官方的一張總體架構圖。

nginx在啟動後,會以daemon的方式在後臺運行,後臺進程包含一個master進程和多個worker進程。工作進程以非特權用戶運行。

master進程主要用來管理worker進程,包含:接收來自外界的信號,向各worker進程發送信號,監控worker進程的運行狀態,當worker進程退出後(異常情況下),會自動重新啟動新的worker進程。

worker進程則是處理基本的網絡事件。多個worker進程之間是對等的,他們同等競爭來自客戶端的請求,各進程互相之間是獨立的。一個請求,只可能在一個worker進程中處理,一個worker進程,不可能處理其它進程的請求。

開發模型:epoll和kqueue。

支持的事件機制:kqueue、epoll、rt signals、/dev/poll 、event ports、select以及poll。

支持的kqueue特性包括EV_CLEAR、EV_DISABLE、NOTE_LOWAT、EV_EOF,可用數據的數量,錯誤代碼.

支持sendfile、sendfile64和sendfilev;文件AIO;DIRECTIO;支持Accept-filters和TCP_DEFER_ACCEP.

1.3 性能

Nginx的高併發,官方測試支持5萬併發連接。實際生產環境能到2-3萬併發連接數。10000個非活躍的HTTP keep-alive 連接僅佔用約2.5MB內存。三萬併發連接下,10個Nginx進程,消耗內存150M。淘寶tengine團隊說測試結果是“24G內存機器上,處理併發請求可達200萬”。

二 動態負載均衡

2.1 自身監控

內置了對後端服務器的健康檢查功能。如果Nginx proxy後端的某臺服務器宕機了,會把返回錯誤的請求重新提交到另一個節點,不會影響前端訪問。它沒有獨立的健康檢查模塊,而是使用業務請求作為健康檢查,這省去了獨立健康檢查線程,這是好處。壞處是,當業務複雜時,可能出現誤判,例如後端響應超時,這可能是後端宕機,也可能是某個業務請求自身出現問題,跟後端無關。

2.2 可擴展性

Nginx屬於典型的微內核設計,其內核非常簡潔和優雅,同時具有非常高的可擴展性。如下圖所示:

Java編程——如何深入淺出Nginx負載均衡

Nginx是純C語言的實現,其可擴展性在於其模塊化的設計。目前,Nginx已經有很多的第三方模塊,大大擴展了自身的功能。nginx_lua_module可以將Lua語言嵌入到Nginx配置中,從而利用Lua極大增強了Nginx本身的編程能力,甚至可以不用配合其它腳本語言(如PHP或Python等),只靠Nginx本身就可以實現複雜業務的處理。

2.3 配置修改

nginx的配置架構如下圖所示:

Java編程——如何深入淺出Nginx負載均衡

Nginx支持熱部署,幾乎可以做到7*24不間斷運行,即使運行數個月也不需要重新啟動。能夠在不間斷服務的情況下,對軟件版本進行進行升級。Nginx的配置文件非常簡單,風格跟程序一樣通俗易懂,能夠支持perl語法。使用nginx –s reload可以在運行時加載配置文件,便於運行時擴容/減容。重新加載配置時,master進程發送命令給當前正在運行的worker進程worker進程接到命令後會在處理完當前任務後退出。同時,master進程會啟動新的worker進程來接管工作。

三 優勢和劣勢

3.1 優勢

  1. 可以很好地進行http 的頭處理
  2. 對http協議以及https的良好支持
  3. 有足夠的第三方插件供使用
  4. 支持熱部署,更改後端是平滑的

3.2 劣勢

  1. 缺少對session的支持
  2. 對四層tcp的支持不夠好
  3. post請求寫文件系統,造成500 error
  4. 缺乏主動的後端服務器健康監測
  5. 默認的監控界面統計信息不全

四 Tengine

Tengine是淘寶基於nginx開源代碼二次開發一款服務器軟件,在繼承了nginx的特性以外,提供了一些nginx商業版才有的功能。基本上同步於nginx的更新,目前最新的版本已經繼承了nginx 1.6.2穩定版5

4.1 特性

tengine的特性包括但不限於:

  1. 更友好的運維信息顯示
  2. 動態模塊加載機制
  3. 自動根據CPU數目設置進程個數和綁定CPU親緣性
  4. 更方便的命令行參數,如列出編譯的模塊列表、支持的指令等
  5. 更加強大的負載均衡能力,包括一致性hash模塊、會話保持模塊,還可以對後端的服務器進行主動健康檢查,根據服務器狀態自動上線下線
  6. 動態腳本語言Lua支持。擴展功能非常高效簡單
  7. 輸入過濾器機制支持。通過使用這種機制Web應用防火牆的編寫更為方5

4.2 負載均衡

負載均衡方面,Tengine主要有以下幾個特點,基本上彌補了nginx在負載均衡方面的欠缺:

  1. 支持一致性Hash模塊
  2. 會話保持模塊
  3. 對後端服務器的主動健康檢查
  4. 增加了請求體不緩存到磁盤的機制
Java編程——如何深入淺出Nginx負載均衡


分享到:


相關文章: