常用負載均衡策略分析

背景

一般生產環境單機所能承受的QPS壓力為2w左右,過大的壓力會導致服務器爆炸。即便是單機能夠撐住2w QPS,一般也不會這么做,生產環境一般會預留50%的冗余能力,防止QPS因為某個熱門的活動而爆炸。當QPS超過單機所能承受的壓力時,自然而然會想到引入分布式集群。那么,某一個請求會被哪臺服務器處理呢,這是隨機的,還是說按照一定的規則處理的?這就是負載均衡算法所要干的事。

負載均衡器

負載均衡器就是實現一種或者多種負載均衡算法的軟件或者硬件設備。負載均衡器根據協議層的不同,通常又分為兩種,第一種在四層傳輸層實現,第二種就是在七層應用層實現。


很多專用的硬件負載均衡器都支持在TCP層實現負載均衡,效率高。當然TCP層實現負載均衡有它的缺點,如無法保存長連接等。所以一般類似于BAT這種大公司,都是多層負載均衡配合的。


一般純軟件實現的通常在應用層來實現,這也是應用比較多的一種實現方式。目前比較流行的實現有Nginx、HAProxy、Keepalived等。當然Linux內核自帶的LVS(Linux Virtual Server)就是四層的實現。

輪詢(Round Robin)

輪詢是一種很簡單的實現,依次將請求分配給后端服務器。

  • 優點:實現簡單,請求均勻分配。
  • 缺點:請求均勻分配,因為后端服務器通常性能會有差異,所以希望性能好的服務器能夠多承擔一部分。也不適合對長連接和命中率有要求的場景。

加權輪詢(Weighted Round Robin)

加權本質是一種帶優先級的方式,加權輪詢就是一種改進的輪詢算法,輪詢算法是權值相同的加權輪詢。需要給后端每個服務器設置不同的權值,決定分配的請求數比例。這個算法應用就相當廣泛了,對于無狀態的負載場景,非常適合。

  • 優點:解決了服務器性能不一的情況
  • 缺點:權值需要靜態配置,無法自動調節。也不適合對長連接和命中率有要求的場景。

隨機Random

隨機把請求分配給后端服務器。請求分配的均勻程度依賴于隨機算法了,因為實現簡單,常常用于配合處理一些極端的情況,如出現熱點請求,這個時候就可以random到任意一臺后端,以分散熱點。當然缺點也不言而喻。

哈希Hash

哈希算法想必大家并不陌生,應用最為廣泛。根據Source IP、 Destination IP、URL、或者其它,算hash值或者md5,再采用取模。比如有N臺服務器: S1、S2、S3……Sn

hash值 % N 

哈希
顯然,相同的請求會被映射到相同的后端。這非常適合維護長連接和提高命中率。
但是它天生也有一些缺點。比如說,現在某個請求通過哈希被映射到S3上去了,如果S3宕機了,就不得不二次Hash,重新計算路由時會剔除宕機的后端。

hash值 % (N - 1)

這樣會導致幾乎所有請求路由產生變化。由此導致命中率的急劇下降。當然一般生產環境通過提供S3的備機來解決這種問題,但是主備之間切換也是需要時間,它們之間的數據同步也是有延時的。所以需要根據業務場景來權衡了。
擴容也會有類似的問題,計算路由公式變為:

hash值 % (N + 1) 

為了解決這種問題,一般生產環境可能采用成倍擴容的方式。N -> 2N,這樣求路由可以做到與原來保持一致。當然必不可少的造成機器資源的浪費。請各位看官自行權衡。
對于熱點請求,這種Hash算法也可能成在雪崩效應,取決于采用何種Hash,基于URL還是基于IP等。總之,不能把熱點請求路由到單機上,否則單機撐不住,會逐個逐個被打爆,也就是雪崩效應。

最小連接數LC

最小連接數(Least Connection),把請求分配給活動連接數最小的后端服務器。它通過活動來估計服務器的負載。比較智能,但需要維護后端服務器的連接列表。

加權最小連接數WLC

加權最小連接數(Weighted Least Connection),在后端服務器性能差異較大的情況下,可以優化LC的性能,高權值的服務可以承受更多的連接負載。

最短響應時間LRT

最短響應時間(Least Response Time),把請求分配給平均響應時間最短的后端服務器。平均響應時間可以通過ping探測請求或者正常請求響應時間獲取。
RT(Response Time)是衡量服務器負載的一個非常重要的指標。對于響應很慢的服務器,說明其負載一般很高了,應該降低它的QPS。

之前有人說使用CPU占用率作為負載均衡的指標,只能說沒理解CPU占用率的實質。理論上CPU占用率是越高越好,說明服務充分利用了CPU資源。但對于設計不合理的程序導致的CPU占用過高這是程序的設計問題,并不違背這條理論。

?

常用「負載均衡」策略優缺點和適用場景

?

參考文獻

  • 深入一致性哈希(Consistent Hashing)算法原理,并附100行代碼實現

?

轉載于:https://www.cnblogs.com/kaleidoscope/p/9754489.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451086.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451086.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451086.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

cpu id 系列號代碼

1。先看看是那家公司的cpu,有intel的,還有amd的和 cyrix的。全世界只有三家,實際就是兩家。 先讓EAX0,再調用CPUID Inel的CPU將返回: EBX:756E6547H Genu EDX:49656E69H ineI ECX:6C65746EH ntel EBX,EDX,E…

解決- SecureCRT上運行 linux vim 命令中文出現亂碼

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 亂碼如圖: 這個問題是CRT的編碼設置造成的,改一下設置就可以了: 1. 在當前連接上右鍵選擇最后一個 2…

開發一個自己的 CSS 框架(五)

這一期我們繼續完成我們的網格布局 容器類 通過一個 # 占位符,來減少代碼輸出量。 #containerpadding-right: 15pxpadding-left: 15pxmargin-right: automargin-left: auto.containerwidth: 100%extend #containermedia screen and (min-width: $media-size-1)max-w…

mysql event 簡單demo

功能:每3秒刪除b表數據,查詢a表中的5條數據并插入b表。 /* 查看mysql事件狀態 */ show variables like %event_scheduler%;/* 開啟mysql事件 */ SET GLOBAL event_scheduler ON;/* 測試a表*/ CREATE TABLE test_a (id int(11) NOT NULL AUTO_INCREMENT…

linux中操作數據庫的使用命令記錄

1,mysql 查看數據庫表編碼格式: show create table widget; 修改數據庫表編碼格式: alter table widget default character set utf8; 修改數據庫表中某字段的編碼格式: alter table widget change widget_name widget_name varc…

ICC Scenario Definition

現代先進工藝下的后端設計都是在 MCMM 情況下設計的,所謂 MCMM 就是 muti-corner muti-mode,用于芯片的不同工作模式和工作條件。 后端設計過程中,需要保證芯片在所有工作模式和工作條件下都能正常工作,工作模式一般只有幾種&…

別瞎忙活:創業公司的6條時間管理策略

導讀:無數創業者為自己的公司努力拼搏,把一切時間投入到公司建設中。這種724小時的熱情對于創業者本人是必須的,然而對于創業中的團隊來說,更重要的是學會管理時間。倦怠是錯誤時間管理帶來的顯著危害,但最大的危險是因…

JDK8下載|JDK1.8下載可選擇window版和linux版

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 摘要:Oracle甲骨文公司Oracle公司如期發布了Java 8正式版!現在你就可以下載Java 8正式版了,同期發布的還有JDK 8。…

持續集成與持續部署寶典Part 2:創建持續集成流水線

2019獨角獸企業重金招聘Python工程師標準>>> 在本系列文章中,我們將探討在容器時代如何在基于Docker的環境中創建連貫的工作流程和流水線來簡化大規模項目的部署。另外,我們還將詳細介紹如何利用Docker和Rancher自動化處理這些工作流。 在上文…

64 裝飾器函數: 母版 csrf防御機制 cookie

主要內容: 1: 裝飾器函數 a: 原理: 在不改變原函數的代碼和調用方式的情況下, 給函數動態的添加功能 b: 實例: 裝飾器的原理: def yue(tools):print(使用%s約一約 % tools) def wrapper(fn):def inner(*args, **kwargs):print(先準備好錢)fn(*args, **kwargs)return inner yue …

Facebook與Google的互聯網霸主爭奪戰

摘要:谷歌的兩位創始人對搜索情有獨鐘,而沒有看到互聯網發展的大勢。雖然目前Facebook的估值最高為1000億美元,與谷歌近2000億美元的市值還相去甚遠,但是未來很有可能超越谷歌,成為互聯網新一代霸主。谷歌的兩位創始人…

Eclipse將引用了第三方jar包的Java項目打包成jar文件的兩種方法

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 方案一:用Eclipse自帶的Export功能 步驟1:準備主清單文件 “MANIFEST.MF”, 由于是打包引用了第三…

Linux-MySQL基本命令-SQL語句

服務端命令SQL 在數據庫系統中,SQL語句不區分大小寫(建議用大寫) ?SQL語句可單行或多行書寫,以“;”結尾 ?關鍵詞不能跨多行或簡寫 ?用空格和縮進來提高語句的可讀性 ?子句通常位于獨立行,便于編輯,提高可讀性 ?注釋&#x…

webAPI token驗證

ASP.NET WebApi 實現Token驗證 https://www.cnblogs.com/dukang1991/p/5627584.html轉載于:https://www.cnblogs.com/KQNLL/p/9757025.html

評論:中國企業向Faceook學習什么

摘要:古人云:“迨天之未陰雨,徹彼桑土,綢繆牖戶。且不論究竟誰會成為中國的Facebook,伴隨著Facebook因上市帶來的又一輪火熱,不妨先來看看中國企業最需要向Facebook學習什么。古人云:“迨天之未…

java ++i、i++、i++ + ++i、i++ + i++原理

先上代碼: public static void main(String args[]) {int A 1;int B 10;int C 100;int D 1000;System.out.println(A);System.out.println(B);System.out.println(C C);System.out.println(C);System.out.println(D D);System.out.println(D);} 在來運行結果…

一個判斷session是否過期的小技巧

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 Session一直是我們做web項目經常使用的,以前沒太注意,這次又細致的看了下! 1.session其實就是一個Ma…

擴展方法

擴展方法是寫在靜態類中,且方法是靜態方法。 不限制參數的數量。 不限制返回類型。 不限制可使用擴展方法的類型。 和普通方法編寫相似,唯一不同的是每一個擴展方法都必須有一個固定的參數。statc void Method( this DataType name&#xff0…

cpu執行命令方式

(一)有序處理器 早期的處理器為有序處理器(In-order processors),有序處理器處理指令通常有以下幾步: 指令獲取如果指令的輸入操作對象(input operands)可用(例如已經在寄存器中了&#xff09…

jQuery基礎-事件

只能添加一個處理函數,后面的會覆蓋前面 會有兼容性差異 冒泡 會依次檢查父元素 截獲冒泡 或者 最大的缺陷 并且在IE和NetSpace里面分別為冒泡和捕獲兩種 多個處理函數 依次執行 捕獲--->自己--->冒泡 true 只捕獲,不冒泡 false 只冒泡 從父元素的…