深入理解負載均衡經典案例

2021-08-21 05:26:32 字數 2224 閱讀 3236

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

負載均衡

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

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

乙個沒有使用負載均衡的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啥的和一些大廠的實踐分析都沒加也暫時沒能力加,以後如果有接觸再補上吧(坑我先挖了)。

理解負載均衡

負載均衡是高可用網路基礎架構的的乙個關鍵組成部分,有了負載均衡,我們通常可以將我們的應用伺服器部署多台,然後通過負載均衡將使用者的請求分發到不同的伺服器用來提高 應用 資料庫或其他服務的效能以及可靠性。為什麼要引入負載均衡 先看乙個沒有負載均衡機制的web架構 上圖中的架構有什麼缺陷了?首先,使用者...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...

mysql 索引深入理解 深入理解MySql的索引

為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...