LB 負載均衡的層次結構

来源:http://www.cnblogs.com/mindwind/archive/2016/03/31/5339657.html
-Advertisement-
Play Games

作為後端應用的開發者,我們經常開發、調試、測試完我們的應用併發布到生產環境,用戶就可以直接訪問到我們的應用了。但對於互聯網應用,在你的應用和用戶之間還隔著一層低調的或厚或薄的負載均衡層軟體,它們不顯山不露水默默的發揮著重要的作用,以至於我們經常忽略了它們的存在。因為負載均衡層通常不在一般開發人員的問 ...


作為後端應用的開發者,我們經常開發、調試、測試完我們的應用併發布到生產環境,用戶就可以直接訪問到我們的應用了。但對於互聯網應用,在你的應用和用戶之間還隔著一層低調的或厚或薄的負載均衡層軟體,它們不顯山不露水默默的發揮著重要的作用,以至於我們經常忽略了它們的存在。因為負載均衡層通常不在一般開發人員的問題域內,而且它們一般都是現成且成熟的解決方案,以至於我們習慣性的忽略和認為乏善可陳。其實不然,本文就寫寫我對負載均衡層次結構的認知和理解。

硬負載

所謂「硬負載」就是採用硬體設備來提供負載均衡。

在七、八年前那時我在做 Java 的企業軟體開發,開發出來的企業級 Java 應用程式就部署在像 Weblogic 之類的應用容器中。而這類應用容器軟體又跑在 Unix 的小型機上。把硬體和軟體一體打包作為企業應用解決方案賣給客戶。這類應用部署的方案十分簡單,層級也比較淺。為了保證可靠性,使用兩套小型機上各部署一個 Weblogic Server,在應用服務前面使用像 F5 之類的硬體負載均衡器,如下圖所示。

由於小型機和前面的 F5 負載均衡硬體都比較貴,所以出於可靠性、可維護性和成本的綜合考慮,一般應用部署兩套跑在兩台小型機上,在前面共用一個 F5 做負載均衡。而一般 F5 和小型機這類硬體設備都至少是 5 個 9 的可靠性保障,所以整體的系統可靠性基本有保障。

進入互聯網時代後,應用開發擁抱開源,部署使用更廉價的 PC Server 和免費開源的應用容器。負載均衡也逐步從硬負載向軟負載變遷,由於互聯網應用的海量特性和部署規模的急劇膨脹,前端負載均衡也開始變得豐富起來。

軟負載

進入互聯網公司後,我們剛開始開發應用時,業務規模小用戶量還不大,機器數量也少(<10)。所以一開始的負載均衡的結構也是很簡單的,類似硬負載只是把硬體換成了免費的開源軟體並跑在可用性是有 3 個 9 的廉價 PC Server 上。

前面一個 LVS 後面跟著幾個應用服務,後來為了方便做按功能變數名稱的分流和適配切流量上線,中間又加了一層 Nginx。

這樣就變成了兩層軟負載結構了,LVS 負責 4 層,Nginx 負責 7 層。 但 Nginx 只負責了單機內多實例的負載均衡,這裡主要是因為當時 PC Server 是物理機,CPU 16/32 core,記憶體 32/64G 不等,為了更充分的利用資源,一臺物理機上都部署了多個應用服務實例,而考慮到 Nginx 工作在 7 層的開銷遠高於 LVS/DR 模式,所以一般在一個 Nginx 後面掛的實例數也不會超過 10 個。

但隨著業務發展和用戶流量上升,機器規模也在不斷擴張,導致一個網段內的 IP 都不夠用了,這套負載結構又遇到了橫向擴展的瓶頸,因為 LVS/DR 模式下跨不了網段。所以後來又在 LVS 和 Nginx 之間加了一層 HAProxy,負載結構就變成了下麵這樣。

其實加了 HAProxy 之後,它也是工作在 7 層,這樣 Nginx 這層看起來就不是很有必要。但三層的負載結構能支撐更大規模的集群,而原本在 Nginx 層做了一套方便研發切流量上線的運維管理系統,所以犧牲一點性能換取現在的可維護性和將來擴展性,Nginx 這層就一直保留下來了。而且 Nginx 相比 HAProxy 不是純粹的負載均衡器,它還能提供 cache 功能,對於某些 HTTP 請求實際只走到 Nginx 這層就可以通過緩存命中而返回。

DNS負載

隨著業務發展,公司開始了多個 IDC 的建設,考慮到 IDC 級別的容災,集群開始部署到多個 IDC。跨 IDC 的負載均衡方案可以簡單通過 DNS 輪詢來實現,但可控性不好。所以我們沒有採用這種,而是採用一主加多子功能變數名稱的方式來基於業務場景實現動態功能變數名稱調度和負載。主功能變數名稱下實際是一個動態流量調度器,跨多個 IDC 部署,對於 HTTP 請求基於重定向方式跳子功能變數名稱,對於 TCP 方式每次建立長連接前請求分配實際連接的子功能變數名稱,如下圖所示。

CDN負載

最後再加上互聯網應用必不可少的 CDN 將靜態資源請求的負載分流,那麼整個負載的層次結構就完整了。

SSL 帶來的負載結構變化

隨著互聯網的普及,安全問題益發嚴重,原本早期只有銀行網銀等使用 HTTPS 方式訪問,現在電商類網站也開始啟用全站 HTTPS 了。引入 SSL 後對負載結構帶來了什麼影響麽?SSL 屬於應用層的協議,所以只能在 7 層上來做,而 HAProxy 也是支持 SSL 協議的,所以一種方式是只需簡單的讓 HAProxy 開啟 SSL 支持完成對內解密對外加密的處理。

但 HAProxy 的作者不太贊同這種方案,因為引入 SSL 處理是有額外的性能開銷的。那麼在承擔確定流量的情況下,假設原本需要 M 台 HAProxy,在開啟了 SSL 後可能需要 M + N 台 HAProxy。隨著流量增長,這種方式的橫向擴展成本較高(畢竟 SSL 證書按伺服器數量來收費的)。他給出的解決方案是再獨立一層 SSL 代理緩存層,像下麵這樣。

L4 和 L7 之間獨立的 SSL 代理緩存層只負責 SSL 協議的處理,把 HTTPS 轉換成 HTTP,並檢查本地緩存是否命中。若未命中再轉發請求到後端的 L7 層應用負載均衡層。這樣的好處是每個層次都可以根據流量來獨立伸縮,而且 SSL 層顯然可以跨多個應用共用,更節省成本。如果按這個思路來重新調整我們前面的負載均衡結構層次,將會演變成下麵這樣。

其實,這時我覺得應用前面的那層 Nginx 可能就顯得多餘了點,不是必需的。但如果現實這麼演進下來很可能就會有這麼一層冗餘的東西存在很長一段時間,這就是理想和現實之間的差距吧。

總結

好了,本文到此為止。作為一名後臺開發我其實對上面提及的各類開源軟體如何配置、調優和管理並不熟悉,這屬於運維開發的問題域範疇。但這並不妨礙我去瞭解我所開發的應用所處的整個環境是怎樣的,多瞭解些你工作領域範圍邊界外的 What 和 Why,有時也能幫助我們更好的設計和解決自身問題域內的問題,別為自己設限而最終畫地為牢。

本來以為負載均衡這個古老的課題已經定型了,在寫本文時又看到新聞,在近日舉辦的第十三屆網路系統設計與實現 USENIX 研討會上,來自 Google 的工程師又分享了其自研的 Maglev 負載均衡器。剛下了論文還沒看,回頭看了再來寫寫。

參考

[1] HAProxy Documentation. HAProxy Management Guide
[2] HAProxy Documentation. HAProxy Starter Guide
[3] Willy Tarreau. Making applications scalable with Load Balancing
[4] LVS wiki. Load balancing
[5] Wikipedia. Virtual Router Redundancy Protocol
[6] shuming. LVS 工作模式以及工作原理


寫點文字,畫點畫兒,「瞬息之間」一切都變了。覺得不錯,可長按或掃描二維碼關註。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文章向碼農們介紹php 表單提交錯誤後返回數據消失問題的解決方法,感興趣的碼農可以參考一下。 表單提交錯誤後返回數據消失怎麼辦吶,今天就來分析解決一下這個問題。 狀況概述: 做填寫表單信息提交的時候會碰到一個問題就是當用戶填寫並提交表單後,程式判斷不符合要求並返回,返回之後之前填寫的表單信息會被清 ...
  • opencv3.1 +windows10+ vs2015配置見文章 win10下vs2015配置Opencv3.1.0過程詳解(轉) 代碼經過測試,識別度極高,測試圖片50w張,識別率90%以上 如果可以結合微軟牛津計劃的api可以識別圖片物品 https://www.azure.cn/projec ...
  • 下載安裝Opencv3.1.0 下載Opencv3.1.0,進入官網,點擊opencv for windows即可下載。 點擊運行下載好的文件。實際上,opencv的安裝程式就是解壓縮文件,個人因為只有C盤,所以就直接在C盤建了一個文件夾Opencv3.1.0。 選好路徑之後點擊Extract即可。 ...
  • 如果我們需要產生多個對象,每個對象的邏輯完全一樣,只是對象內的成員變數的類型不同。那麼我們該如何去做? ① 創建多個類文件,給每個類中的成員變數設置指定的數據類型; 1 public class Demo1{ 2 public static void main(String []args){ 3 M ...
  • apache預設路徑配置方法 apache的配置 apache已經自帶了,只需如下三個命令就可以了。 開啟apache服務 sudo apachectl start 停止apache服務 sudo apachectl stop 重啟服務 sudo apachectl restart 查看版本 htt ...
  • 我們一般都會用webservice來做遠程調用,大概有兩種方式,其中一種方式rest風格的簡單明瞭。 記錄下來作為筆記: 開發服務端: 具體的語法就不講什麼了,這個網上太多了,而且只要看一下代碼基本上都懂,下麵是直接貼代碼: 這個風格和springmvc實在太像了,所以一看基本上就懂了。 下麵是配置 ...
  • 經查找一些資料,並且親自實驗之後得出: r+:打開已存在的文件時,游標位於開頭,文件可讀,可寫, 寫數據時,由於游標位於開頭,所以會覆蓋原有數據 w+:打開的文件已存在時,將覆蓋原文件 a+:打開已存在的文件時,游標位於文件尾,文件可讀,可寫 讀數據時,游標會回到開頭 ...
  • 基本介面:Collection 介面: List 實現類:ArrayList LinkedList 介面:Set(唯一,無序) 實現類:HashSet(哈希) TreeSetMap介面:Map 實現類:HashMap ArrayList類特點:長度可變,連續空間,任意類型,類型相同適用情況:適合多次 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...