分散式系統關註點——「負載均衡」到底該如何實施?

来源:https://www.cnblogs.com/Zachary-Fan/archive/2018/10/23/DoLoadBalance.html
-Advertisement-
Play Games

本文長度為3032字,預計讀完需1.1MB流量,建議閱讀8分鐘。 閱讀目錄 為什麼沒有DNS? 如何實施? 優缺點 結語 閱讀目錄 為什麼沒有DNS? 如何實施? 優缺點 結語 為什麼沒有DNS? 如何實施? 優缺點 結語 為什麼沒有DNS? 如何實施? 優缺點 結語 為什麼沒有DNS? 如何實施? ...


本文長度為3032字,預計讀完需1.1MB流量,建議閱讀8分鐘。

 

閱讀目錄

 

        前面兩篇《分散式系統關註點——初識「高可用」》、《分散式系統關註點——僅需這一篇,吃透「負載均衡」妥妥的》看完後,相信大家對實現高可用的思路和負載均衡的策略有了一些瞭解。這篇主要闡述一下在實施的時候主流的一些解決方案。

一、為什麼沒有DNS?

        再翻出第一篇中放出的一張圖來回顧一下。

        之前也有的小伙伴問到,為什麼沒有列出DNS?我認為,DNS的本質是解決「domain name --> ip」的問題。雖然DNS除了在公網運用的之外,還會運用於做內網的自定義domain name解析,但是在程式里單靠它來做負載均衡的話,還是太勉強了。

        當然,基於DNS“智能解析”功能可以做到IP的動態返回,也算起到了負載均衡的作用。但是,由於其本身是一個工作在L3(網路層)的解決方案,所以無法對“埠”進行工作。而一般我們程式之間的通訊很多都會涉及到埠,因此我們本篇先不討論DNS~

二、如何實施?

        在清楚了我們應該在哪些環節考慮做負載均衡之後,接下去就是思考如何能夠循序漸進的進行。

        古時候軍隊打仗的時候一般都是拿盾的抗在前面,頂住攻擊。而負載均衡解決方案從某種角度來說也是一個類似盾一般的防禦性設施,因為前提就是要能承載上游過來的流量。因此,越往“前”做負載均衡解決方案,效果肯定會越好,因為受保護的應用範圍越廣。

 

        如果說,系統之前沒有運用過負載均衡,現在開始第一次做,該如何選擇呢?小Z根據心目當中的優先順序來和大家聊一下。

01  硬體負載均衡

        硬體這塊名氣最大的還屬F5(根據ZOL的數據,其在市場占有率51.44%),大大蓋過了其它幾家硬體商的風頭。此類硬體負載均衡器的特點是“壕”,畢竟是純商業化的東西,投入的資源和精力自然是眾多開源軟體負載均衡所無法比擬的,所以功能非常強大。包含訪問加速、壓縮、安全等等負載均衡之外的許多附加功能。

題外話:如果用F5組網的話,有兩種結構,串列結構和並行結構,也稱為直連模式和旁路模式。前者的優勢在對硬體產生壓力較小、且天然安全性高,而後者對原網路架構的改動較小、且擴展性較好。大家在實際的使用中結合自身情況來部署。

 

        “壕”物能夠同時支持L2~L7的轉發,所以上圖中的每一個標註點都可以用硬體來做負載均衡。因此,如果在經濟允許的情況下,直接上F5能解決很多原本需要花更多時間去解決的問題。所以當“時間”的重要度大於“金錢”的時候,建議優先採用硬體方案。

02  軟體負載均衡(L7)

        當“金錢”的重要程度大於“時間”的時候,我們可以通過軟體來達到我們要的效果。相應的,也增加了一些運維成本。

 

        一般情況下,只要對資料庫不濫用,往往我們從「單應用 + 單庫」組合最先需要突破的是應用,變成「多應用 + 單庫」。那麼針對Web應用的L7負載均衡,比較主流的產品是2個Nginx、HAProxy。在L7做負載均衡,最大的特點就是靈活,請求的URL、Header都是我們可以去掌控的,所以我們可以利用其中的任何信息為負載均衡策略所用。

 

        這一類就是前面圖中的「反向代理」。作為「客戶端」和「Web應用」、「前端」和「後端」之間的橋梁。實際操作中主要做2步:

        1. 在公網的功能變數名稱解析中,配置解析到「反向代理」。記錄類型是「A」,記錄值是「反向代理」的IP。

        2. 配置真實提供服務的Web應用IP和埠,和負載均衡均衡策略。上圖中的配置是Nginx中的示例,負載均衡策略的預設值是輪詢。

03  軟體負載均衡(L4)

        當「Web應用」所依賴的TCP協議的「服務」需要橫向擴展,或者需要做「資料庫」、「分散式緩存」的多主、主從集群時,那麼就需要一個支持L4的負載均衡軟體。這裡最知名的就屬LVS了,1998年5月由章文嵩博士建立,2004年底被納入Lunix內核。也正因為它是內核態的程式,所以相比用Nginx、HAProxy來做L4的負載均衡,在性能、資源的消耗上會更優一些。

        實際運用中的操作步驟主要也是2步:

        1. 在LVS中添加一個IP虛擬服務(IPVS),並指定它的IP、埠和負載均衡策略。

        2. 將IP虛擬服務關聯到真實的服務上,並指定模式和權重的信息。(做L4的負載均衡可以使用NAT或者FULLNAT模式)

 

題外話:LVS的模式一共有四種,除了NAT和FULLNAT(NAT的增強版)模式外,它的TUN模式可以在L3做負載均衡,DR模式可以在L2做負載均衡,到這個層面其實就和做硬體同處於一個層次了。並且,隨著層次的深入,雖然對功能性上有所弱化,但是如果不考慮埠的話,單從IP層面的負載均衡來說,用DR模式做,則對數據包的加工介入度會降到最低,因此也是通過軟體做負載均衡能夠達到的性能極致。

        另外,LVS中運用的虛擬IP概念,本質上和Nginx中的“server”概念一樣,定義了一個統一入口,作用上並沒有差別。將Nginx中的upstream關聯到server,就如LVS操作步驟第2點中的關聯一般。

 

        這些每個具體的解決方案的使用教程網上比較多,就不展開了,大家實際用到的時候自行查閱一下,當然儘量優先看官方的。

三、優缺點

        做了一個苦差事,把所有同類型的產品都整合了一下優缺點和使用場景。不過,其中有不少是我沒用過的,所以僅供大家參考。順手將一些網上到處充斥的一些過時結論做了更新,如:Nginx不支持session sticky等。

 

        我們可以看到,不同的解決方案有不同的側重點。因此在單個解決方案已經無法滿足的情況下,我們可以組合使用,各盡所長。

 

        負載均衡這個領域還是以高可用和性能為2個最重要因素,下麵是小Z推薦的一種組合方式,也是在系統量級達到每小時上億PV之後最被廣泛使用的一種。理論上,利用第一步DNS的功能變數名稱解析所帶的負載均衡效果,只要複製多套LVS主備出來,綁上多個不同的虛IP,可以做到無限橫向擴展,以支撐不斷增長的流量。

        用到的3個軟體目前都是開源產品,LVS+Keepalived負責做Nginx的負載均衡,而Nginx負責分發到實際的請求到Http和Tcp協議的應用上。

        關於LVS的模式選擇,如果在同網段內的話優先使用DR模式進行L2轉發,性能最好。否則使用TUN模式進行L3分發。與此同時,在L4、L7的分發上使用Nginx來做,可以發揮其靈活易擴展的特點以及其它的一些額外特性如緩存等,也算是物盡其用。

 

        雲時代,service mesh風興起。以sidecar模式為核心的後起之秀Linkerd、Conduit、NginMesh、Istio等軟體除了滿足負載均衡之外,還為高可用相關的做了眾多的考量,後續有機會小Z和大家一起來梳理一下。很久之前寫過一篇調研服務治理框架的文章,裡面順帶有提到一下,有興趣的小伙伴們可以跳過去看看:《分散式系統中的必備良藥 —— 服務治理》。

四、結語

        有些事,並不需要做到一步到位,做技術也是這樣。其實大部分情況下,在以上方案中選擇一個,做一層轉發就夠了。行遠自邇,避免給自己添不必要的麻煩。

 

 

相關文章:

 

作者:Zachary(個人微信號:Zachary-ZF)

微信公眾號(首發):跨界架構師<-- 點擊後閱讀熱門文章,或右側掃碼關註 -->

定期發表原創內容:架構設計丨分散式系統丨產品丨運營丨一些深度思考

 


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

-Advertisement-
Play Games
更多相關文章
  • GraphQuery " " " " " " " " " " " " GraphQuery is a query language and execution engine tied to any backend service. It is . Project Address: "GraphQue ...
  • Learun FrameWork 強大工作流引擎,讓OA更智能 互聯網的發展促使企業在信息化的道路上不斷探索,而隨著企業信息化進程的不斷深入,OA協同辦公的概念也逐步進入大眾的視野。 OA的選型關乎企業的生存發展,除了需要重視“OA技術、OA品牌、OA產品、OA服務”四大要素之外,更重要的其實是讓O ...
  • 前言: 在生產環境中,未避免單點故障,每個微服務都會做高可用部署。 通白的說,就是每一個一模一樣的服務會根據需求提供多分在多台機器上。 那麼在大併發的情況下,如何分配服務可以快速得到響應,就成為了我們要解決的問題。 Ribbon就是一款優秀的客戶端負載均衡機制。 什麼是客戶端負載均衡呢? 就是由服務 ...
  • 本文探討如下幾個問題: 什麼是架構屬性 約束和架構屬性的關係 有哪些架構屬性 各個架構屬性涉及知識點 什麼是架構屬性 首先,問個很簡單的問題!請看下麵的Java代碼: 請問上面的代碼中: name和age被稱為Person這個類的什麼? skill又稱為Person這個類的什麼呢? name和age ...
  • 文章提綱 概述要點 理論基礎 詳細步驟 總結 概述要點 理論基礎 詳細步驟 總結 概述要點 設計模式的產生,就是在對開發過程進行不斷的抽象。 我們先看一下之前訪問數據的典型過程。 在Controller中定義一個Context, 例如: private AccountContext db = new ...
  • java併發的一系列框架和技術主要是由java.util.concurrent 包所提供。包下的所有類可以分為如下幾大類: locks部分:顯式鎖(互斥鎖和速寫鎖)相關; atomic部分:原子變數類相關,是構建非阻塞演算法的基礎; executor部分:線程池相關; collections部分:併發 ...
  • 真值和假值 相等操作符(==和 ) 下麵分析一下不同類型的值用相等操作符(==)比較後的結果 toNumber 對不同 類型返回的結果如下: toPrimitive 對不同類型返回的結果如下: 操作符。如果比較的兩個值的類型相同,結果就如下;如果比較的兩個值類型不同,返回的就是false 下麵的例子 ...
  • 關於MVC架構中的Repository模式 關於MVC架構中的Repository模式 關於MVC架構中的Repository模式 關於MVC架構中的Repository模式 個人理解:Repository是一個獨立的層,介於領域層與數據映射層(數據訪問層)之間。它的存在讓領域層感覺不到數據訪問層的 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...