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

深入理解負載均衡

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

技術文章第一時間送達!

原始碼精品專欄

 

來源: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)

分享創造快樂