面試官總愛問一些負載平衡的問題,不知道是他們真的遇到了還是自己意淫的。我只想說,在你否定別人的想法時,是否是真的認真考慮過別人的想法是不是比你的好。
大概意思就是說多個使用者請求服務,伺服器是一個叢集,在客戶與伺服器之間加了一層負載平衡,使得每個使用者能夠正常請求服務,而且負載平衡機構可以把使用者的請求分到一個合適的伺服器上。這樣就能夠使伺服器能夠達到最佳的工作狀態。
不過對於這種問題,大多數人給出的解決方案都是基於socket和Epool的,但是這種方案下,一台機器也就處理200-300Mbps的流量的負載。下面給出另一個解決方案。基於網路資料包捕獲的解決方案。
平台:Linux + 曙光零拷貝網卡
曙光零拷貝推出了千兆網卡和萬兆網卡,說白了就是捕包速度為1000Mbps和10000Mbps。
_______ _________ ________| | | | | ||Clients| ----->|Balancer |------------->|Servers ||_______| |_________| |________|
可以通過修改資料包來進行負載平衡。例如Client請求Balancer,Balancer根據多個Server的情況,選擇一個合適Server進行處理,之後把這個資料包的目的IP改成選定的Server的IP,目的MAC改成Server的MAC,源MAC改成Balancer自身的MAC。那麼可以再通過網卡把修改過的包發出去。這個包就會被相應的Server處理。Server返回來的資料包,我們把其源IP改成Balancer的IP,源MAC改成Balancer的MAC,目的MAC改成用戶端的MAC,之後通過網卡發送出去。這樣就實現了Balancer的準系統。需要注意的是,我們必須維護一個Client-Server的對應關係。這個對應關係很容易維護,而且能夠做到非常高效。並且修改資料包的MAC和IP簡直是不用什麼開銷。
現在看一下這個方案相比前面的方案的優點。
因為Balancer雙向收發包,那麼處理的峰值流量需打個對摺。如果使用10000Mbps的網卡,那麼能雙向處理5000Mbps。(能捕獲10000Mbps流量的網卡並不是我瞎說的,我們當年用這個網卡處理過7Gb/s的流量,因為我們實在是擷取不到更大的流量了。)也就是說這樣一個Balancer敵得過socket方式的20個Balancer。再進一步算個帳,如果原來有100個Balancer,那麼現在只需要5個Balancer,那麼那省下的95台伺服器是一筆不小的開銷,但是還省下了95台伺服器的電費,維護費。