伺服器端負載均衡技術的本質原理

志_祥發表於2014-11-06

1、什麼是負載?

負載就是伺服器端的“資源”:主要就是CPU和IO。

前者適宜於計算密集型的任務,後者則對應資料密集型的任務。


2、負載均衡的前提

就是負載(或者說CPU/IO資源)可以切分,劃分到不同的計算機(或者CPU核)上去。

要做到這一點,首先底層的運算應該是可以中斷並排程的,IO是可以多路擴散的。否則一個簡單的CPU死迴圈指令this: jmp this(跳回自己)就會讓計算機什麼也幹不了,而IO嘛,IO要是不停地中斷阻塞了匯流排,計算機也會一樣啥也幹不了(不過正常情況下IO匯流排沒CPU內部匯流排快)


3、負載均衡的本質

負載既然可以切分到不同的計算機上去(分散式系統,這些計算機之間的一致性怎麼維護、事務ACID性質怎麼保持、怎麼提高可用性、CAP/BASE是另外的話題),那麼剩下來的關鍵是對外部的大規模併發請求路由了。

首先假設每個請求對應伺服器端的一臺計算機處理,如果能夠將外部請求對應的負載比較均勻地分佈到各個計算機節點上去,則負載均衡無疑會做得比較成功。

不考慮分散式資料庫的後端技術,則負載均衡的核心就在於路由。這個路由,其實就是一個Hash函式。

函式的輸入是什麼呢?所有可供區分的外部使用者請求引數,比如:使用者ID、會話ID、請求引數、網路層地址,等等。

輸出是什麼呢?假設最終處理請求的計算機編號為1到N,則路由Hash函式的輸出就是[1..N]之間的一個整數。


很顯然,如果輸入均勻(隨機),Hash函式可以採取線性Hash運算,就可以確保負載均衡地落在這N個處理節點上。無疑是,輸入有時候可能並不均勻,往往落在某個區域性區間的請求過多,這往往會導致熱點/瓶頸,假如這部分不均勻輸入樣本的總數相比總的輸入空間來說不是很大的話,理論上,還是可以找到一個能夠用的非線性Hash演算法(比如說SHA1/256之類),使得輸入仍然能夠均勻地落在區間[1..N]上。


4、多層次路由

實際應用中,前述路由Hash運算不是隻在一個點上執行,而是可能在多個層次上做,比如說:網路層LB技術LVS(Linux Virtual Server)、前端代理(帶Round Robin輪詢的HTTP反向代理、資料庫連線驅動代理)、DNS分派

這很容易讓人聯想到神經網路裡的多層前向/反饋網路(那個深度學習不就是增加中間節點的層次深度嗎),不管怎麼說,多層次的路由其實就是數學上的非線性Hash對映。


負載均衡的本質差不多就是這樣。對於實際應用來說,關鍵就在於設計一個Hash函式,使得對於此應用特定的資料而且,能夠做到均勻地分發到後端處理節點上。

相關文章