Nginx負載均衡

jopen 9年前發布 | 36K 次閱讀 Nginx Web服務器

一、特點

1.1 應用情況

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

  1. 高并發連接

    </li>

  2. 內存消耗少

    </li>

  3. 配置文件非常簡單

    </li>

  4. 成本低廉

    </li>

  5. 支持Rewrite重寫規則

    </li>

  6. 內置的健康檢查功能

    </li>

  7. 節省帶寬

    </li>

  8. 穩定性高

    </li> </ol>

    1.2 架構

    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工作在網絡的7層,可以針對http應用本身來做分流策略。支持七層HTTP、HTTPS協議的負載均衡。對四層協議的支持需要第三方插件-yaoweibin的ngx_tcp_proxy_module實現了tcp upstream。

    https://github.com/yaoweibin/nginx_tcp_proxy_module

    此外,nginx本身也逐漸在完善對其他協議的支持:

    • Nginx 1.3.13 開發版支持WebSocket代理。

      </li>

    • Nginx 1.3.15開發版支持SPDY。

      </li> </ul>

      2.2 均衡策略

      nginx的負載均衡策略可以劃分為兩大類:內置策略和擴展策略。內置策略包含加權輪詢和ip hash,在默認情況下這兩種策略會編譯進nginx內核,只需在nginx配置中指明參數即可。擴展策略有很多,如fair、通用hash、 consistent hash等,默認不編譯進nginx內核。

      1. 加權輪詢(weighted round robin)

        輪詢的原理很簡單,首先我們介紹一下輪詢的基本流程。如下是處理一次請求的流程圖:

        Nginx負載均衡

        圖中有兩點需要注意,第一,如果可以把加權輪詢算法分為先深搜索和先廣搜索,那么nginx采用的是先深搜索算法,即將首先將請求都分給高權重的機器,直 到該機器的權值降到了比其他機器低,才開始將請求分給下一個高權重的機器;第二,當所有后端機器都down掉時,nginx會立即將所有機器的標志位清成 初始狀態,以避免造成所有的機器都處在timeout的狀態,從而導致整個前端被夯住。

        </li>

      2. ip hash

        ip hash是nginx內置的另一個負載均衡的策略,流程和輪詢很類似,只是其中的算法和具體的策略有些變化,如下圖所示:

        Nginx負載均衡

        ip hash算法的核心實現如下:

         for(i = 0;i < 3;i++){
             hash = (hash * 113 + iphp->addr[i]) % 6271;
         }
                    

        p = hash % iphp->rrp.peers->number;

        從代碼中可以看出,hash值既與ip有關又與后端機器的數量有關。經過測試,上述算法可以連續產生1045個互異的value,這是該算法的硬限制。對 此nginx使用了保護機制,當經過20次hash仍然找不到可用的機器時,算法退化成輪詢。因此,從本質上說,ip hash算法是一種變相的輪詢算法,如果兩個ip的初始hash值恰好相同,那么來自這兩個ip的請求將永遠落在同一臺服務器上,這為均衡性埋下了很深的 隱患。

        </li>

      3. fair

        fair策略是擴展策略,默認不被編譯進nginx內核。其原理是根據后端服務器的響應時間判斷負載情況,從中選出負載最輕的機器進行分流。這種策略具有很強的自適應性,但是實際的網絡環境往往不是那么簡單,因此要慎用。

        </li>

      4. 通用hash、一致性hash

        這兩種也是擴展策略,在具體的實現上有些差別,通用hash比較簡單,可以以nginx內置的變量為key進行hash,一致性hash采用了nginx內置的一致性hash環,可以支持memcache。

        </li> </ol>

        2.2 配置示例

        1. HTTP

          http {

           upstream  www.s135.com  {
          
             server   192.168.1.2:80;
          
             server   192.168.1.3:80;
          
           }
          
          
          
           server{
          
             listen  80;
          
             server_name  www.s135.com;
          
          
          
             location / {
          
                      proxy_pass        http://www.s135.com;
          
                      proxy_set_header   Host             $host;
          
                      proxy_set_header   X-Real-IP        $remote_addr;
          
                      proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
          
             }
          
          
          
             location /nginx_status {
          
                      stub_status on;
          
                      access_log off;
          
                      allow 192.168.1.1;#設置為可訪問該狀態信息的ip
          
                      deny all;
          
             }
          
           }
          
          

          }</pre></li>

        2. TCP – ngx_tcp_proxy_module

          tcp {

           upstream cluster {
          
               # simple round-robin
          
               server 192.168.0.1:80;
          
               server 192.168.0.2:80;
          
          
          
               check interval=3000 rise=2 fall=5 timeout=1000;
          
          
          
               #check interval=3000 rise=2 fall=5 timeout=1000 type=ssl_hello;
          
          
          
               #check interval=3000 rise=2 fall=5 timeout=1000 type=http;
          
               #check_http_send "GET / HTTP/1.0\r\n\r\n";
          
               #check_http_expect_alive http_2xx http_3xx;
          
           }
          
          
          
           server {
          
               listen 8888;
          
               proxy_pass cluster;
          
           }
          
          

          }</pre></li> </ol>

          三、動態負載均衡

          3.1 自身監控

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

          3.2 可擴展性

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

          Nginx負載均衡

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

          3.3 配置修改

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

          Nginx負載均衡

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

          四、優勢和劣勢

          4.1 優勢

          1. 可以很好地進行http 的頭處理

            </li>

          2. 對http協議以及https的良好支持

            </li>

          3. 有足夠的第三方插件供使用

            </li>

          4. 支持熱部署,更改后端是平滑的

            </li> </ol>

            4.2 劣勢

            1. 缺少對session的支持

              </li>

            2. 對四層tcp的支持不夠好

              </li>

            3. post請求寫文件系統,造成500 error

              </li>

            4. 缺乏主動的后端服務器健康監測

              </li>

            5. 默認的監控界面統計信息不全

              </li> </ol>

              五、Tengine

              5.1 特性

              1. 繼承Nginx-1.2.9的所有特性,100%兼容Nginx的配置;

                </li>

              2. 動態模塊加載(DSO)支持。加入一個模塊不再需要重新編譯整個Tengine;

                </li>

              3. 輸入過濾器機制支持。通過使用這種機制Web應用防火墻的編寫更為方便;

                </li>

              4. 動態腳本語言Lua支持。擴展功能非常高效簡單;

                </li>

              5. 支持管道(pipe)和syslog(本地和遠端)形式的日志以及日志抽樣;

                </li>

              6. 組合多個CSS、JavaScript文件的訪問請求變成一個請求;

                </li>

              7. 更加強大的負載均衡能力,包括一致性hash模塊、會話保持模塊,還可以對后端的服務器進行主動健康檢查,根據服務器狀態自動上線下線;

                </li>

              8. 自動根據CPU數目設置進程個數和綁定CPU親緣性;

                </li>

              9. 監控系統的負載和資源占用從而對系統進行保護;

                </li>

              10. 顯示對運維人員更友好的出錯信息,便于定位出錯機器;

                </li>

              11. 更強大的防攻擊(訪問速度限制)模塊;

                </li>

              12. 更方便的命令行參數,如列出編譯的模塊列表、支持的指令等;

                </li>

              13. 可以根據訪問文件類型設置過期時間;

                </li> </ol>

                5.2 負載均衡

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

                1. 支持一致性Hash模塊

                  </li>

                2. 會話保持模塊

                  </li>

                3. 對后端服務器的主動健康檢查。

                  </li>

                4. 增加了請求體不緩存到磁盤的機制

                  </li> </ol> </div> 來自:

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!