1. 程式人生 > >負載均衡 LB(Load Balance)-- 演算法(策略)

負載均衡 LB(Load Balance)-- 演算法(策略)

@[email protected]

上一篇介紹了負載均衡的內容和分類,這篇文章主要說明一下一些常用的負載均衡演算法。

   在實際的應用過程中,往往不會在不管伺服器是否滿載或者宕機讓客戶端的請求平均的被分配給內部的各個伺服器來處理。一般會讓配置更高的機器接受更多的服務請求,一臺處理服務請求較少的伺服器能分配到更多的服務請求,出現故障的伺服器將不再接受服務請求直至故障恢復等等。
   之所以要採用負載均衡的演算法或者策略,就是為了讓多個裝置在一起共同更好的完成任務,避免或則消除網路負載分佈不均、資料流量擁擠反應時間過長的瓶頸。

負載演算法

  解決後端系統的承載能力,,一般經常使用的有兩種方法,
  1)手動配置
  對於中小系統而言,手動配置是最方便有效的也是最穩定的方式。因為管理人員知道自己後端伺服器的引數配置,部署的服務,瞭解其大概的效能和承載能力,所以在配置的時候,可以預先分配好最大承載壓力。
  比如,某nginx的配置如下:
    upstream simplemain.com {
    server  192.168.1.100:8080 weight=30;
    server  192.168.1.101:8080 weight=70;
    }

   上述的配置的含義即有兩臺後端的伺服器,一臺的效能明顯優於另外一臺,更強的,我們就給他70%的壓力;弱一點的,我們就給他30%的壓力。這樣,nginx就會把更多的壓力分配給第二臺。

   這種方式配置簡單,而且很穩定,基本不會產生分配的抖動。不過,帶來的問題就是分配很固定,不能動態調整。如果你的後端伺服器有一段時間出現效能抖動(比如有其他服務擾動了機器的穩定執行,造成cpu利用率一段時間升高),前端呼叫者就很難根據實際的情況重新分配請求壓力。所以,引入了第二種方法。

2)動態調整
   該方案能夠根據機器目前的執行狀態,通過對比歷史平均值,如果發現當前狀態好過歷史平均值,就會增加請求壓力;如果發現比歷史平均狀況要糟糕,就會動態的請求減少請求的數量。

   這種方案的好處在於可以動態的來平衡後面伺服器的處理能力。不過,任何事物都有兩面性。這種方案如果遇到極端情況,可能會造成系統雪崩!當某臺機器出現短暫網路抖動的時候,他的響應就可能變慢,這個時候,前端服務就會將他的請求分配給其他的機器。如果分配的很多,就有可能造成某些機器響應也變慢。然後又將這些機器的請求分配給另外的……如此這般,執行著的機器終將被這些請求壓死。

   更好的方式是將兩者結合起來使用。通過預先靜態配置一個承載負荷的範圍,超過這個負荷就將其拋棄。同時動態的監控後端機器的響應情況,做出相應的動態請求調整。

均衡演算法

均衡演算法主要解決的問題是用何種方式將請求傳送給後端伺服器。

1)隨機(random)演算法
   依舊採用上面30-70的例子,演算法的虛擬碼描述:
   bool res = abs(rand()) % 100 < 30

1、先產生一個偽隨機數:rand()
2、將這個偽隨機數的轉化為非負數: abs(rand())
3、將這個數取模100,將值轉化到[0,100)的半開半閉區間:abs(rand()) % 100
4、看這個數是否落入了前30個數的區間[0,30):abs(rand()) % 100 < 30
如果隨機是均勻的話,他們落到[0,100)這個區間裡一定是均勻的,所以只要在[0,30)這個區間裡,就分給第一臺機器,否則就分給第二臺機器。

   隨機演算法是最常用的演算法。從概率上講,它能保證請求基本是分散的,從而達到我們想要的均衡效果;其次,它又是無狀態的,不需要維持上一次的選擇狀態,也不需要均衡因子等。

2)輪訓(round-robin)演算法
   就像字面上的理解,輪訓演算法就像是挨個數數一樣(123-123-123……)。
   上面的例子的可表述為:

第一臺機器叫做A,第二臺叫做B:
1、先給兩臺機器做個排序的陣列:array = [ABBABBABBB]
2、用一個計數指標來標明現在陣列的位置:idx = 3
3、當一個請求來的時候,我們就把指標對應的機器選取出來,並且指標加一,挪到下一個位置。
這樣,十個請求,我們就可以保證有3個一定是A,7個一定是B。
因為要維護idx指標,所以輪詢演算法是有狀態的。

3)一致雜湊(consistent-hash)演算法
一致Hash要解決的是兩個問題:
   1、雜湊的不變性:就是同一個請求(比如:同一個使用者id)儘量的落入到一臺機器,不要因為時間等其他原因,落入到不同的機器上了;
   2、異常以後的分散性:當某些機器壞掉(或者增加機器),原來落到同一臺機器的請求(比如:使用者id為1,101,201),儘量分散到其他機器,不要都落入其他某一臺機器。這樣對於系統的衝擊和影響最小。

  一致Hash演算法用的最多的場景,就是分配cache服務。將某一個使用者的資料快取在固定的某臺伺服器上,那麼我們基本上就不用多臺機器都快取同樣的資料,這樣對我們提高快取利用率有極大的幫助。

  不過硬幣都是有兩面的,一致Hash也不例外。當某臺機器出問題以後,這臺機器上的cache失效,原先壓倒這臺機器上的請求,就會壓到其他機器上。由於其他機器原先沒有這些請求的快取,就有可能直接將請求壓到資料庫上,造成資料庫瞬間壓力增大。如果壓力很大的話,有可能直接把資料庫壓垮。

  所以,在考慮用一致Hash演算法的時候,一定要估計一下如果有機器宕掉後,後端系統是否能承受對應的壓力。如果不能,則建議浪費一點記憶體利用率,使用隨機演算法。


4)主備(master-slave)演算法
  演算法核心的思想是將請求儘量的放到某個固定機器的服務上,而其他機器的服務則用來做備份,如果出現問題就切換到另外的某臺機器的服務上。

相關推薦

負載均衡 LB(Load Balance)-- 演算法策略

@[email protected] 上一篇介紹了負載均衡的內容和分類,這篇文章主要說明一下一些常用的負載均衡演算法。 在實際的應用過程中,往往不會在不管伺服器是否滿載或者宕機讓客戶端的請求平均的被分配給內部的各個伺服器來處理。一般會讓配

haproxy 7層負載均衡代理轉發實戰講解-老男孩筆記系列

######################################################### # haproxy L7 實戰講解 #date:2010-06-09 #作者:老男孩---《老男孩linux就業培訓中心 》 #QQ:31333741 MAIL:[email 

nginx實現負載均衡的5種模式RR

負載均衡 負載均衡是Nginx常用的一個功能,負載均衡其意思就是分攤到多個操作單元上進行執行,例如Web伺服器、FTP伺服器、企業關鍵應用伺服器和其它關鍵任務伺服器等,從而共同完成工作任務。簡單而言就是當有2臺或以上伺服器時,根據規則隨機的將請求分發到指定的伺服器上處理,負載均衡配置

Springcloud負載均衡feign與Hystrix斷路器

springcloud學習總結 4、負載均衡feign與Hystrix斷路器 一、ribbon與feign有什麼區別? Ribbon Ribbon 是一個基於 HTTP 和 TCP 客戶端的負載均衡器 它可以在客戶端配置 ribbonServerList(服務端列表),然

NLB網路負載均衡管理器詳解轉載

篩選 .html 用戶訪問 並且 operation 可用性 相關 .... 獨立 序言 在上一篇配置iis負載均衡中我們使用啦微軟的ARR,我在那篇文章也中提到了網站的高可用性,但是ARR只能做請求入口的消息分發服務,這樣如果我們的消息分發服務器給down掉啦

關於叢集、負載均衡、分散式的區別

1、Linux叢集主要分成三大類( 高可用叢集, 負載均衡叢集,科學計算叢集) 叢集是一個統稱,他分為好幾種,如高效能科學群集、負載均衡群集、高可用性群集等。 科學群集 、高效能叢集(High performance cluster,HPC)它是利用一個叢集中的多臺機器共同

linux核心排程演算法3--多核系統的負載均衡

多核CPU現在很常見,那麼問題來了,一個程式在執行時,只在一個CPU核上執行?還是交替在多個CPU核上執行呢?LINUX核心是如何在多核間排程程序的呢?又是核心又是CPU核,兩個核有點繞,下面稱CPU處理器來代替CPU核。 實際上,如果你沒有對你的程序做過特殊處理的話,L

Web開發來一發Nginx負載均衡演算法

參考:http://www.cnblogs.com/lvgg/p/6140584.html Nginx負載均衡演算法主要以下幾種方式: 1、輪詢(預設方式) 每個請求按時間順序逐一分配到不同的後端服務,如果後端某臺伺服器宕機,自動剔除故障系統,使使用者訪問不受影響。 2、weight

【Dubbo原始碼學習】負載均衡演算法1-隨機演算法

/** * random load balance. * */public class RandomLoadBalance extends AbstractLoadBalance { public static final String NAME = "random"; @Override

【Dubbo原始碼學習】負載均衡演算法2-輪詢演算法的實現

@Overrideprotected <T> Invoker<T> doSelect(List<Invoker<T>> invokers, URL url, Invocation invocation) { String key = invokers.ge

負載均衡的幾種演算法和快取的幾種淘汰策略

一、負載均衡演算法 1、輪詢法   將請求按順序輪流地分配到後端伺服器上,它均衡地對待後端的每一臺伺服器,而不關心伺服器實際的連線數和當前的系統負載。 2、隨機法 通過系統的隨機演算法,根據後端伺服器的列表大小值來隨機選取其中的一臺伺服器

負載均衡演算法1:簡單介紹

負載均衡(Load Balance)是分散式系統架構設計中必須考慮的因素之一,它通常是指,將請求/資料【均勻】分攤到多個操作單元上執行,負載均衡的關鍵在於【均勻】。常見網際網路分散式架構如上,分為客戶端層、反向代理nginx層、站點層、服務層、資料層。 什麼是負載均衡 負

CentOS7.4——構建LVS負載均衡群集—地址轉換模式LVS-NAT

LVS負載均衡—NAT模式LVS負載均衡群集—地址轉換模式(LVS-NAT)環境:調度服務器一臺:Linux—CentOS7.4IP地址:192.168.80.20(內網)192.168.90.20(外網)Web服務器兩臺:Linux—CentOS7.4IP地址:192.168.80.30(SERVER AA

CentOS7.4——LVS負載均衡群集—直接路由模式LVS-DR

CentOS7—LVS負載均衡—DR模式LVS負載均衡群集—直接路由模式(LVS-DR)環境:調度服務器一臺:Linux—CentOS7.4IP地址:192.168.80.20Web服務器兩臺:Linux—CentOS7.4IP地址:192.168.80.30(SERVER AA)IP地址:192.168.8

CentOS7上部署LVS負載均衡群集之LVS-NAT地址轉換模式

local 添加 fig iptable block rip 除了 處理 路由轉發 CentOS7中的LVS負載均衡群集之LVS-NAT(地址轉換模式) 簡介 在當今各種互聯網應用中,隨著站點對硬件性能、響應速度、服務穩定性、數據可靠性等的要求越來越高,單臺服務器將難以承擔

如何實現負載均衡,有哪些演算法可以實現?

【前言】 負載均衡技術對於中大型網站的效能提高有著很大的優勢,最近在學習《大型網站技術的架構》,其中對於負載均衡技術有一些介紹,將學習的經驗總結一下,分享下。多交流。 【協議層】http重定向協議實現負載均衡 原理:根據使用者的http請求計算出一個真實的web

Kafka中topic的Partition,Kafka為什麼這麼快,Consumer的負載均衡及consumerGroup的概念來自學習筆記

1.1. Kafka中topic的Partition  在Kafka檔案儲存中,同一個topic下有多個不同partition,每個partition為一個目錄,partiton命名規則為topic名稱+有序序號,第一個partiton序號從0開始,序號

負載均衡叢集、LVS演算法、搭建NAT模式LVS架構

負載均衡叢集介紹實現負載均衡叢集的軟體有:LVS、Keepalived、Nginx、haproxy等。其中LVS屬於四層(網路OSI模型);Nginx屬於七層;haproxy既可以認為是四層,也可以當做是七層使用。LVS、haproxy這種四層負載均衡可以分發除80埠以外的通

負載均衡的幾種演算法Java實現程式碼

package class2.zookeeper.loadbalance; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import jav

LVS | LVS 負載均衡之工作原理說明NAT模式

LVS-NAT模式:NAT用法本來是因為網路IP地址不足而把內部保留IP地址通過對映轉換成公網地址的一種上網方式(源地址NAT)。如果把NAT的過程稍微變化,就可以 成為負載均衡的一種方式。原理其