軟件負載均衡

一、軟件負載均衡概述

硬件負載均衡性能優越,功能全面,但是價格昂貴,一般適合初期或者土豪級公司長期使用。因此軟件負載均衡在互聯網領域大量使用。常用的軟件負載均衡軟件有Nginx,Lvs,HaProxy等。本文參考大量文檔,部分為直接拷貝,參考出處見負載均衡詳解(4)。

二、Ngnix負載均衡

Ngnix是一款輕量級的Web服務器/反向代理服務器,工作在七層Http協議的負載均衡系統。具有高性能、高并發、低內存使用等特點。是一個輕量級的Http和反向代理服務器。Nginx使用epoll and kqueue作為開發模型。能夠支持高達 50,000 個并發連接數的響應。
操作系統:Liunx,Windows(Linux、FreeBSD、Solaris、Mac OS X、AIX以及Microsoft Windows)
開發語言:C
并發性能:官方支持每秒5萬并發,實際國內一般到每秒2萬并發,有優化到每秒10萬并發的。具體性能看應用場景。

2.1.特點

1.模塊化設計:良好的擴展性,可以通過模塊方式進行功能擴展。
2.高可靠性:主控進程和worker是同步實現的,一個worker出現問題,會立刻啟動另一個worker。
3.內存消耗低:一萬個長連接(keep-alive),僅消耗2.5MB內存。
4.支持熱部署:不用停止服務器,實現更新配置文件,更換日志文件、更新服務器程序版本。
5.并發能力強:官方數據每秒支持5萬并發;
6.功能豐富:優秀的反向代理功能和靈活的負載均衡策略

2.2.功能

2.2.1基本功能

支持靜態資源的web服務器。
http,smtp,pop3協議的反向代理服務器、緩存、負載均衡;
支持FASTCGI(fpm)
支持模塊化,過濾器(讓文本可以實現壓縮,節約帶寬),ssl及圖像大小調整。
內置的健康檢查功能
基于名稱和ip的虛擬主機
定制訪問日志
支持平滑升級
支持KEEPALIVE
支持url rewrite
支持路徑別名
支持基于IP和用戶名的訪問控制。
支持傳輸速率限制,支持并發數限制。

2.2.2擴展功能

2.2.3性能

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

2.3架構

2.3.1 Nginx的基本工作模式


一個master進程,生成一個或者多個worker進程。但是這里master是使用root身份啟動的,因為nginx要工作在80端口。而只有管理員才有權限啟動小于低于1023的端口。master主要是負責的作用只是啟動worker,加載配置文件,負責系統的平滑升級。其它的工作是交給worker。那么當worker被啟動之后,也只是負責一些web最簡單的工作,而其他的工作都是有worker中調用的模塊來實現的。
模塊之間是以流水線的方式實現功能的。流水線,指的是一個用戶請求,由多個模塊組合各自的功能依次實現完成的。比如:第一個模塊只負責分析請求首部,第二個模塊只負責查找數據,第三個模塊只負責壓縮數據,依次完成各自工作。來實現整個工作的完成。
他們是如何實現熱部署的呢?其實是這樣的,我們前面說master不負責具體的工作,而是調用worker工作,他只是負責讀取配置文件,因此當一個模塊修改或者配置文件發生變化,是由master進行讀取,因此此時不會影響到worker工作。在master進行讀取配置文件之后,不會立即的把修改的配置文件告知worker。而是讓被修改的worker繼續使用老的配置文件工作,當worker工作完畢之后,直接當掉這個子進程,更換新的子進程,使用新的規則。

2.3.2Nginx支持的sendfile機制

Sendfile機制,用戶將請求發給內核,內核根據用戶的請求調用相應用戶進程,進程在處理時需要資源。此時再把請求發給內核(進程沒有直接IO的能力),由內核加載數據。內核查找到數據之后,會把數據復制給用戶進程,由用戶進程對數據進行封裝,之后交給內核,內核在進行tcp/ip首部的封裝,最后再發給客戶端。這個功能用戶進程只是發生了一個封裝報文的過程,卻要繞一大圈。因此nginx引入了sendfile機制,使得內核在接受到數據之后,不再依靠用戶進程給予封裝,而是自己查找自己封裝,減少了一個很長一段時間的浪費,這是一個提升性能的核心點。


以上內容摘自網友發布的文章,簡單一句話是資源的處理,直接通過內核層進行數據傳遞,避免了數據傳遞到應用層,應用層再傳遞到內核層的開銷。
目前高并發的處理,一般都采用sendfile模式。通過直接操作內核層數據,減少應用與內核層數據傳遞。

2.3.3Nginx通信模型(I/O復用機制)

開發模型: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.
以上概念較多,大家自行百度或谷歌,知識領域是網絡通信(BIO,NIO,AIO)和多線程方面的知識。

2.4均衡策略

nginx的負載均衡策略可以劃分為兩大類:內置策略和擴展策略。內置策略包含加權輪詢和ip hash,在默認情況下這兩種策略會編譯進nginx內核,只需在nginx配置中指明參數即可。擴展策略有很多,如fair、通用hash、consistent hash等,默認不編譯進nginx
內核。由于在nginx版本升級中負載均衡的代碼沒有本質性的變化,因此下面將以nginx1.0.15穩定版為例,從源碼角度分析各個策略。

2.4.1. 加權輪詢(weighted round robin)

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

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

2.4.2. ip hash

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

2.4.3. fair

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

2.4.4 通用hash、一致性hash

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

2.5場景

Ngnix一般作為入口負載均衡或內部負載均衡,結合反向代理服務器使用。以下架構示例,僅供參考,具體使用根據場景而定。

2.5.1入口負載均衡架構


Ngnix服務器在用戶訪問的最前端。根據用戶請求再轉發到具體的應用服務器或二級負載均衡服務器(LVS)

2.5.2內部負載均衡架構


LVS作為入口負載均衡,將請求轉發到二級Ngnix服務器,Ngnix再根據請求轉發到具體的應用服務器。

2.5.3Ngnix高可用


分布式系統中,應用只部署一臺服務器會存在單點故障,負載均衡同樣有類似的問題。一般可采用主備或負載均衡設備集群的方式節約單點故障或高并發請求分流。
Ngnix高可用,至少包含兩個Ngnix服務器,一臺主服務器,一臺備服務器,之間使用Keepalived做健康監控和故障檢測。開放VIP端口,通過防火墻進行外部映射。
DNS解析公網的IP實際為VIP。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282630.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282630.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282630.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JAVA多線程之先行發生原則

一、引子   如果java內存模型中所有的有序性都僅僅依靠volatile和synchronized來完成,那么有一些操作會變得很繁瑣,但我們在編寫java并發代碼時并未感覺到這一點,這是因為java語言中有個先行發生原則(happens-before&#xff09…

git工具 將源碼clone到本地指定目錄的三種方式

git工具 將源碼clone到本地指定目錄的三種方式 CreationTime--2018年7月27日15點34分 Author:Marydon 1.情景展示 運行git-bash.exe,輸入命令:git clone 下載源碼地址-->回車,結果發現項目被下載到了,git工具的安裝目錄下 如何…

[摘]全文檢索引擎Solr系列—–全文檢索基本原理

原文鏈接--http://www.importnew.com/12707.html 全文檢索引擎Solr系列—–全文檢索基本原理 2014/08/18 | 分類: 基礎技術, 教程 | 2 條評論 | 標簽: solr 分享到: 64 本文作者: ImportNew - 劉志軍 未經許可,禁止轉載…

優化-瀏覽器緩存和壓縮優化

一、減少HTTP請求 1.圖片地圖: 假設導航欄上有五幅圖片,點擊每張圖片都會進入一個鏈接,這樣五張導航的圖片在加載時會產生5個HTTP請求。然而,使用一個圖片地圖可以提高效率,這樣就只需要一個HTTP請求。 服務器端圖片…

匯新杯┃拼多多黃崢:普通的創業者,不普通的朋友圈_創成匯

本月26日晚,拼多多在美國納斯達克上市,開盤后便持續走高,收漲高達40.53%,這家從成立到上市不過短短2年10個月的企業,是近四年來最大中概股IPO。拼多多創始人黃崢身家一夜暴漲到138.5億美元。在拼多多之前,黃…

NCC CAP 6.2 版本正式發布

原文:https://www.cnblogs.com/savorboard/p/cap-6-2.html作者:楊曉東前言今天,我們很高興宣布 CAP 發布 6.2 版本正式版,在這個版本中我們主要做了一些功能優化,以及針對目前已經發現的幾個 BUG 進行了修復了。那么&a…

pdksh 包

安裝oracle gi,rac 時經常會碰到 pdksh 的檢測失敗,可以從這個網站下載需要的包 http://rpm.pbone.net/ rpm -q ksh-* rpm -e ksh-* rpm -ivh ./pdksh* 或者參考 Requirements for Installing Oracle 11gR2 RDBMS on RHEL6 or OL6 64-bit (x86-64) (文…

sysctl.conf工作原理

2019獨角獸企業重金招聘Python工程師標準>>> sysctl.conf工作原理 sysctl命令被用于在內核運行時動態地修改內核的運行參數,可用的內核參數在目錄/proc/sys中。它包含一些TCP/IP堆棧和虛擬內存系統的高級選項, 這可以讓有經驗的管理員提高引人…

CDN加速

一、CDN的概念 全稱是Content Delivery Network,即內容分發網絡。 其基本思路是: 盡可能避開互聯網上有可能影響數據傳輸速度和穩定性的瓶頸和環節,使內容傳輸的更快、更穩定。 通過在網絡各處放置節點服務器所構成的在現有的互聯網基礎之上的一層智…

修復刪除/var/lib/dpkg目錄后,無法使用apt-get命令問題

2019獨角獸企業重金招聘Python工程師標準>>> Unfortunately Ive deleted dpkg directory while removing the lock. By mistake I typed rootsam:~$ rm -r /var/lib/dpkgNow when I am trying to install/uninstall packages it shows me following error. E: Could…

動態加載vs靜態加載

動態加載: 1:靈活,可以在需要的時候用LoadLibrary進行加載,在不需要的時候用FreeLibrary進行卸載,這樣可以不必占用內存。2:可以在沒有dll時候發現,而不致程序報錯。3:加載程序中有條…

Webpack前端打包工具

一、安裝 安裝Webpack之前需要安裝nodejs,然后用npm安裝: $ npm install webpack -g &nsbp;運行以上命令就將Webpack安裝到了全局環境中。 但是通常我們會將Webpack只安裝到項目的依賴中: $ cd /www/webpack_demo1 // 進入項目目錄,確保該目錄…

動態語言靜態化

一、什么是動態語言靜態化 將現有PHP等動態語言的邏輯代碼生成為靜態html文件,用戶訪問動態腳本重定向到靜態html的過程 注 : 對實時性要求不高的頁面才適合去做動態語言靜態化 二、為什么要靜態化 1. 動態腳本通常會做邏輯計算和數據查詢,訪問量越大,服務器壓力越大 2. 訪…

WPF-06 樣式(Style)

在我們前面介紹資源的時候&#xff0c;我們提到了樣式表&#xff0c;如果你之前是做Web開發的&#xff0c;你會發現Style有點類似于Web中的CSS。控件級別樣式我們可以在控件級別定義自己的樣式&#xff0c;控件級別的樣式是優先級最高的<Window x:Class"Example_06.Sel…

構建Squid代理服務器-傳統代理、透明代理、反向代理

Squid是Linux系統中最常用的一款開源代理服務軟件&#xff0c;主要提供緩存加速和應用層過濾控制的功能&#xff0c;可以很好的實現HTTP、FTP、DNS查詢以及SSL等應用的緩存代理。 正向代理&#xff1a;根據實現的方式不同&#xff0c;代理服務可分為傳統代理和透明代理。 傳統代…

Struts2之初識

Struts2教程 第一章 初識Struts2 主頁&#xff1a;http://struts.apache.org/ 優勢&#xff1a;用戶請求&#xff0c;模塊處理&#xff0c;頁面展現。適用于企業級開發&#xff0c;便于維護。 配置&#xff1a;web.xml中添加的核心控制器 <filter> <filter-name>St…

數據庫緩存層

一 常見的緩存形式 : 1.文件緩存 (為了避免I/O開銷,盡量使用內存緩存) 2.內存緩存 二 為什么要使用緩存 緩存數據是為了讓客戶端很少甚至不訪問數據庫服務器進行的數據查詢,高并發下,能最大程度降低對數據庫服務器的訪問壓力 一般的數據請求: 用戶請求->數據查詢->…

python面試題~反射,元類,單例

1 什么是反射&#xff1f;以及應用場景&#xff1f; test.py def f1():print(f1) def f2():print(f2) def f3():print(f3) def f4():print(f4) a 1 復制代碼import test as ss ss.f1() ss.f2() print(ss.a) 復制代碼我們要導入另外一個模塊,可以使用import.現在有這樣的需求,我…

僅有50Mb大小的cli即可搞定大廠才能玩的CloudIDE丨SmartIDE

作者&#xff1a;徐磊&#xff0c;開源云原生SmartIDE創始人、LEANOSFT創始人/首席架構師/CEO&#xff0c;微軟最有價值專家MVP/微軟區域技術總監Regional Director&#xff0c;華為云最有價值專家。從事軟件工程咨詢服務超過15年時間&#xff0c;為超過200家不同類型的企業提供…