歡迎光臨
每天分享高質量文章

深入理解負載均衡

點選上方“芋道原始碼”,選擇“置頂公眾號”

技術文章第一時間送達!

原始碼精品專欄

 

來源:http://uee.me/a2wfy

前言

閑來無事寫篇文章總結下負載均衡。

正文

負載均衡

負載均衡是高可用架構的一個關鍵元件,主要用來提高效能和可用性,透過負載均衡將流量分發到多個伺服器,同時多伺服器能夠消除這部分的單點故障

當然負載均衡器本身就是一個單點故障隱患,可以考慮文章後面說的負載均衡雙機熱備或其他方案消除單點故障提高可用性。

一個沒有使用負載均衡的Web架構一般會長得像這樣:

沒有負載均衡的架構

在這個例子裡面,使用者直接透過yourdomain.com連線Web Server,如果這一個Web Server掛了那麼整個系統都無法使用,也就是我們常說的系統中的單點故障,同樣如果大量的使用者同時訪問這一臺伺服器,那麼這些使用者很可能會遇到載入時間緩慢或者根本無法連線的問題。

這部分的單點故障可以透過引入負載均衡器和至少另一個Web Server來緩解。一般來說所有後端伺服器會提供相同的內容,以便使用者無論訪問哪個伺服器都會收到一致的內容。同時由於有多臺伺服器同時提供服務,也加大了系統的負載能力提高了效能。

負載均衡可以處理哪些型別的流量

由於一般程式員接觸到的負載均衡可能大多都是處理HTTP、HTTPS流量的,但實際上負載均衡還可以處理TCP和UDP流量(比如對資料庫叢集的訪問、DNS等)。

負載均衡演演算法

負載均衡演演算法用於確定流量應該被分發到哪一個健康的伺服器上,常見的幾個演演算法如下:

Round Robin — 輪轉(Round Robin)意味著伺服器會被按順序地選擇,比如負載均衡器會將第一個請求分配給第一個伺服器,然後下一個請求分配給第二個伺服器,這樣分配下去分配完一輪之後回到開頭分配給第一個伺服器(作業系統排程演演算法複習一下)。這種方式比較適合各伺服器處理能力相同而且每個業務處理量差不多的時候。

Least Connections — 最少連線(Least Connections)這個演演算法意味著負載均衡器會選擇當前連線最少的伺服器。

IP hash — 在這個演演算法下,負載均衡器根據請求源的IP來決定分發給哪個伺服器。這個方法保證了一個特定的使用者會一直訪問相同的伺服器。

其他還有一些不算太常見的演演算法,比如Url hash、Random等。

健康檢測(health checks)

在負載均衡演演算法一節中我們有一個前提,就是流量只會被分配到健康的伺服器上,那麼負載均衡器怎麼去判斷伺服器現在是否健康呢?

為了監控健康的伺服器,健康檢查一般會透過配置的協議和埠嘗試去連線伺服器來保證伺服器正在監聽。如果一個伺服器的健康檢查失敗了,也就是說伺服器無法正常響應請求,那麼就會被自動的移除池子中,流量也不會被分配到這個壞掉的伺服器直到它能透過健康檢查。

這塊具體的方式可以參考阿裡雲關於負載均衡的檔案健康檢查原理

負載均衡如何處理狀態

我們都知道基於session的使用者認證會在伺服器存有session的一些資訊,但當系統引入負載均衡的時候這樣會出現一些問題。

舉個電商網站的例子,當使用者U傳送的登入請求被分發到了伺服器S1併在伺服器中記錄了session資訊,而當使用者想要提交購物請求的時候這個請求被分發到了伺服器S2,但伺服器S2並沒有儲存使用者U的session資訊。

為瞭解決這個問題一個是可以使用之前說的IP hash演演算法,這個演演算法根據IP來分配流量對應的伺服器,所以可以保證同一個使用者的流量會訪問到同一個伺服器。另一個應用層的方法是sticky session,中文應該叫粘性會話,負載均衡器會設定一個cookie然後帶有這個cookie的session都會被分配到同一個伺服器上。

負載均衡雙機熱備(Hot standby)

正如開頭所說,負載均衡器本身就是一個單點故障隱患,其中一個解決方案就是雙機熱備(提高可用性的一大基本方法就是冗餘)。

雙機熱備方案為瞭解決負載均衡器的單點故障問題,引入了第二個負載均衡器,當主節點GG了之後切換到備用節點。在網上找了個比較形象的gif:

我自己之前畢業設計的架構用了雙機熱備,實現上主要是透過keepalived實現nginx的高可用

關於冷備份、熱備份、雙機熱備、

後記

這篇文章算是對於負載均衡的一個初步總結和一些自己的理解,比較適合希望對負載均衡有個初步全面瞭解的人,但由於我個人只是個萌新所以很多進階的東西比如LVS啥的和一些大廠的實踐分析都沒加也暫時沒能力加,以後如果有接觸再補上吧(坑我先挖了)。

參考資料

[1]負載均衡很難嗎?看完這篇秒懂

[2]what-is-load-balancing – DigitalOcean

[3]load-balancing – Nginx

[4]負載均衡健康檢查 – 阿裡雲




如果你對 Dubbo / Netty 等等原始碼與原理感興趣,歡迎加入我的知識星球一起交流。長按下方二維碼噢

目前在知識星球更新了《Dubbo 原始碼解析》目錄如下:

01. 除錯環境搭建
02. 專案結構一覽
03. 配置 Configuration
04. 核心流程一覽

05. 拓展機制 SPI

06. 執行緒池

07. 服務暴露 Export

08. 服務取用 Refer

09. 註冊中心 Registry

10. 動態編譯 Compile

11. 動態代理 Proxy

12. 服務呼叫 Invoke

13. 呼叫特性 

14. 過濾器 Filter

15. NIO 伺服器

16. P2P 伺服器

17. HTTP 伺服器

18. 序列化 Serialization

19. 叢集容錯 Cluster

20. 優雅停機

21. 日誌適配

22. 狀態檢查

23. 監控中心 Monitor

24. 管理中心 Admin

25. 運維命令 QOS

26. 鏈路追蹤 Tracing

… 一共 69+ 篇

目前在知識星球更新了《Netty 原始碼解析》目錄如下:

01. 除錯環境搭建
02. NIO 基礎
03. Netty 簡介
04. 啟動 Bootstrap

05. 事件輪詢 EventLoop

06. 通道管道 ChannelPipeline

07. 通道 Channel

08. 位元組緩衝區 ByteBuf

09. 通道處理器 ChannelHandler

10. 編解碼 Codec

11. 工具類 Util

… 一共 61+ 篇

目前在知識星球更新了《資料庫物體設計》目錄如下:


01. 商品模組
02. 交易模組
03. 營銷模組
04. 公用模組

… 一共 17+ 篇

原始碼不易↓↓↓

點贊支援老艿艿↓↓

贊(0)

分享創造快樂