那些負載均衡的面試題
簡單說一下什麼是負載均衡?很多人最怕這種概念性問題
你們公司負載均衡用的什麼?
為什麼用這種?
它的優缺點
有更好的選擇嗎?
你說這5聯問,誰受得了啊,叢淺到深,一環扣一環,簡直不要了,別怕,仔細閱讀本文,這些問題都會迎刃而解。
什麼是負載均衡?
軟硬體負載均衡詳解
目前負載均衡總的來說分為三大類:1 硬體裝置負載均衡,2 軟體演算法負載均衡,3 基於dns的負載均衡 分別介紹一下這三大類的不同和優缺點。
硬體負載均衡解決方案是直接在伺服器和外部網路間安裝負載均衡裝置,這種裝置通常稱之為負載均衡器,由於專門的裝置完成專門的任務,獨立於作業系統,整體效能得到大量提高,加上多樣化的負載均衡策略,智慧型化的流量管理,可達到最佳的負載均衡需求,其主要應用在大型伺服器集群中,比如f5負載均衡器。
軟體負載均衡指的是在伺服器的作業系統上安裝負載均衡軟體,從此伺服器發出的請求經軟體負載均衡演算法路由到後端集群的某一台機器上。
dns負載均衡一般用於地理位置上的負載均衡,比如你的**在全國範圍內都有海量使用者,那麼當不同使用者訪問**網域名稱時經過dns判斷返回給不同地理位置的使用者的不同ip,從而達到就近訪問,流量分擔,提公升使用者體驗。
他們的優缺點是什麼呢?
硬體負載均衡一般只是關注網路流量的負載,至於後端伺服器的狀態等他不操心,而且成本貴,往往也是單點,但它也有優點,就是效能好,處理能力強,與作業系統無關性。
軟體負載均衡比較靈活,可調整性大,與軟體演算法實現有關係,能夠關注應用伺服器的狀態做彙**計試別的能力,價效比較高,但受軟體安裝的伺服器效能影響,同時也沒硬體的效能好,dns負載均衡也屬於軟體負載均衡的一種。
本文主要分析的也是軟體負載均衡。
常用的負載均衡演算法和實現原理
我們主要分析下這些中介軟體負載均衡策略是怎麼實現的?用的什麼演算法,重點來了
random 隨機
round robin 輪詢
weighted round robin 加權輪詢
least connections 最少連線
latency-aware 延遲感知(最小延遲,也就是說那台機器效能最好,就用那台)
source hashing 源位址雜湊
consistency hash 一致性雜湊(一般在分布式快取中比較常見 )
隨機策略指的是在後端集群機器的ip列表中根據隨機數選擇乙個ip作為此次請求的應答者,當隨機演算法足夠好,足夠公平時,在海量請求下,最終後端集群各個機器承載的流量是均衡, 隨機策略會導致配置較低的機器down機,從而可能引起雪崩,一般採用隨機演算法時建議後端集群機器配置最好同等的,隨機策略的效能取決與隨機演算法的效能。
輪詢策略指的是在集群中對所有機器編號,假設10臺機器,從0-9,請求來臨時從0號機器開始,後續每來一次請求對編號加1,這樣一直迴圈,上面的隨機策略其實最後就變成輪詢了,這兩種策略都不關心機器的負載和運**況,而且對變數操作會引入鎖操作,效能也會下會下降。
加權輪詢策略指的是回給後端集群每台機器都分配乙個權重,權重高得會承擔更多的流量,相反權重低的分配的流量也會少,這種策略允許後端集群機器配置差異化,假設有3臺機器(a,b,c),他們的權重分別是(7,2,1),那麼10次請求a機器承擔7次,b機器承擔2次,c機器承擔1次,但是這種承擔法到底怎麼分配呢?有兩種情況如下,我們可以看到第一種請求在a的時候,bc完全空閒,而第二種情況相對均勻一些,nginx的加權輪詢策略採用的就是第二種情況
(aaaaaaa,bb,c)
(aabaabaaca)
延遲感知策略和最少連線是一樣的思想,延遲感知追求極致的效能或者說使用者體驗,總是挑選能夠最快的返回執行結果的機器來訪問,但壞處是當都所有客戶端都認為某台伺服器最快時,那麼所有請求都傳送這台服務反而可能造成服務壓力過大,效能降低。
源位址雜湊策略能夠讓同一客戶端的請求或者同一使用者的請求總是請求在後端同一臺機器上,這種演算法根據客戶端ip求出hash值然後對端集群總數求餘得到值就是伺服器集合的下標,一般這種演算法用於快取命中,或者同一會話請求等,但這種演算法也有一定的缺點,某一使用者訪問量(黑產)非常高時可能造成服務端壓力過大或者後端服務down掉,那麼客戶端就會無法訪問,所以也需要一定的降級策略。
一致性雜湊是在源位址雜湊的基礎上發展得來的,什麼意思呢?後端集群有是個3臺機器(a,b,c),客戶端經過雜湊對伺服器總數取餘後總是請求到a機器,那麼當後端集群新增或者減少一台機器時,客戶端雜湊後對伺服器總數取餘後就不再是原來的那台機器了,這樣原來所有的請求雜湊後對應的後台機器都發生了變化,一致性雜湊就是解決這種問題的.
實現乙個負載均衡演算法
我們挑選上面一種策略用**來實現一下,以便讓大家更深入的理解,選擇乙個面試常問的策略,1、加權輪詢演算法,這個也比較多,nginx中預設的演算法
加權輪詢演算法每台伺服器有三個權重:初始配置的權重,當前權重,有效權重,其中初始配置權重和有效權重是不變的,預設情況有效權重等於初始配置權重,當配置檔案的初始配置權重改變時,會觸發有效權重改變,只有當前權重是動態變化的。
每次請求到來時都從伺服器列表中選擇乙個當前權重最高的,之後將選擇出來的伺服器當前權重減去所有伺服器權重的和重新賦值給該伺服器當前權重,這總算法通過不斷遞減當前權重使得所有伺服器都有機會服務請求,比較平滑,**實現如下
首先定義乙個結構體,加權輪詢演算法的核心要素必須有伺服器初始配置權重,當前權重(權重在實際執行時可能發生變化)
type severweight struct
//加權輪詢演算法
type weightedroundrobin struct
根據配置資訊建立負責均衡物件,初始化各個欄位的值
//初始化加權輪詢物件
func newweightedroundrobin(iwc map[string]int) *weightedroundrobin
swslice := make(*severweight, 0)
for k, v := range iwc
}return &weightedroundrobin
}
這個方法是核心,呼叫這個方法來決定選擇哪個伺服器提供服務,方法的核心邏輯是選擇當前權重最大的伺服器提供服務,當前權重不斷在變化,每次當前權重的值都等於當前值加上有效值減去所有伺服器的有效權重和(這個演算法就是不斷遞減當前伺服器的當前權重值,使得按照均勻的變化讓所有伺服器都能提供服務)
func (wrr *weightedroundrobin) select() (sw *severweight)
//把權重最大的賦值給sw(sw是需要返回的物件)
if sw == nil || v.currentweight > sw.currentweight
}//當前返回物件的權重-所有伺服器權重和
sw.currentweight = sw.currentweight - total
return sw
}
我們再來看一下執行的測試結果,根據測試結果相信大家就能夠明白了,根據下面結果我們確實能夠看到返回的伺服器ip是均勻的,比較平滑,不會讓權重低的伺服器一直等待。
func testnewweightedroundrobin(t *testing.t)
wrr := newweightedroundrobin(config)
//傳送10次請求
for i := 0; i < 10; i++
}//結果:[10.1,10.1,10.2,10.1,10.1,10.3,10.1,10.1,10.2,10.1]
如何做映象伺服器
問題 因為現在電信和網通的原因,很多網通的朋友總是反應速度慢,鬱悶啊,我看到有的站可以自行選擇是網通還是電信的,不知道,這個功能是怎麼是實現的?答案 然後在你每個空間的根目錄放 1個較大 1.gif 最好 30 kb左右 答案 第一次執行網路傳神的時候,它會讓你選擇 完全模式 和 啟動模式 要使用 ...
企業生產場景中伺服器硬碟如何分割槽?
企業生產場景中伺服器硬碟如何分割槽?分割槽 比喻,一套房子,分成幾居室,這就是分割槽的比喻。boot 引導分割槽 256m swap 交換分割槽 記憶體大於8g,給8g。記憶體小於8g,給到1.5倍的記憶體。給所有空間 boot 引導分割槽 256m swap 交換分割槽 記憶體大於8g,給8g。記...
如何做伺服器安全維護?
伺服器的維護就好比 守天下 稍亂分寸即會使整個網路陷入癱瘓,作為網路管理的一員,筆者在實際維護工作中碰到過不少問題,也因此稍有些經歷。維護可以分為硬體維護和軟體維護兩種,而同時,維護伺服器又需要對伺服器的硬體系統 作業系統 應用軟體系統有比較深入的認識。硬體維護篇 硬體維護跟軟體具有同等重要的地位。...