1、什麼是負載?
負載就是伺服器端的「資源」:主要就是cpu和io。
前者適宜於計算密集型的任務,後者則對應資料密集型的任務。
2、負載均衡的前提
就是負載(或者說cpu/io資源)可以切分,劃分到不同的計算機(或者cpu核)上去。
要做到這一點,首先底層的運算應該是可以中斷並排程的,io是可以多路擴散的。否則乙個簡單的cpu死迴圈指令this: jmp this(跳回自己)就會讓計算機什麼也幹不了,而io嘛,io要是不停地中斷阻塞了匯流排,計算機也會一樣啥也幹不了(不過正常情況下io匯流排沒cpu內部匯流排快)
3、負載均衡的本質
負載既然可以切分到不同的計算機上去(分布式系統,這些計算機之間的一致性怎麼維護、事務acid性質怎麼保持、怎麼提高可用性、cap/base是另外的話題),那麼剩下來的關鍵是對外部的大規模併發請求做路由了。
首先假設每個請求對應伺服器端的一台計算機處理,如果能夠將外部請求對應的負載比較均勻地分布到各個計算機節點上去,則負載均衡無疑會做得比較成功。
不考慮分布式資料庫的後端技術,則負載均衡的核心就在於路由。這個路由,其實就是乙個hash函式。
輸出是什麼呢?假設最終處理請求的計算機編號為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函式,使得對於此應用特定的資料而且,能夠做到均勻地分發到後端處理節點上。
伺服器端負載均衡和客戶端負載均衡的區別?
伺服器端負載均衡 例如nginx,通過nginx進行負載均衡,先傳送請求,然後通過負載均衡演算法,在多個伺服器之間選擇乙個進行訪問 客戶端負載均衡 例如spring cloud中的ribbon,客戶端會有乙個伺服器位址列表,在傳送請求前通過負載均衡演算法選擇乙個伺服器,然後進行訪問,這是客戶端負載均...
session會話技術 伺服器端
1.概念 伺服器端會話技術,在一次會話的多次請求間共享資料,將資料儲存在伺服器端的物件中。httpsession 2.快速入門 1.獲取httpsession物件 2.使用httpsession物件 object getattribute string name void setattribute ...
socket伺服器端
伺服器 include winsock2.h include string.h include stdio.h include time.h include stdarg.h include stdlib.h pragma comment lib,ws2 32 void errexit const ...