架構:負載均衡

業務增長到一定量級,單純的增加增加服務器的配置已經不能滿足業務需求,這個時候集群模式就是出現了。在集群模式中,負載均衡是迴避不了的。負載均衡就是將請求“均勻”的分攤給不同的服務器。

架構:負載均衡

負載均衡

瀏覽器(客戶端)負載均衡

通過DNS來實現負載均衡。DNS是域名解析服務器,可以將域名轉換成IP。服務器可以將多個IP註冊到DNS,這樣DNS在解析的時候,可以以輪詢的方式返回這些IP中的一個,從而實現負載均衡。

這種實現方式的特點是,簡單。另外,這種方式還能夠根據客戶端的地理位置返回離客戶端較近的服務器的IP,加快與客戶端的交互。這種方式的弊端也非常明顯:1.小公司沒有能力構建自己的DNS;2.DNS無法感知後端服務器的負載,只能實現簡單的輪詢處理;3.DNS的更新較慢。我們知道,域名會被緩存在本地和各級DNS中。當域名對應的IP更新的時候,客戶端要等到緩存過期才能使用新的IP。

LVS+nginx

LVS是四層負載均衡器,工作在內核態。nginx是七層負載均衡器,當然現在nginx也推出了四層負載均衡器,但是是收費功能。什麼是四層負載均衡器和七層負載均衡器呢?四層和七層是指負載均衡器工作在網絡協議的哪個層次。四層是IP層(網絡協議層),在這一層面的負載均衡器可以感知IP協議,也就是能夠知道客戶端的IP,可以根據客戶端的IP選擇將請求分發到哪個服務器上。請求的分發是通過修改目的IP的方式實現的,即將目的IP修改成後端服務器的IP。七層負載均衡器工作在應用層,對於http請求,負載均衡器可以知道請求的URL、session等。一般情況下,四層負載均衡器的性能要高於七層負載均衡器。

對於nginx來說,配置簡單,通過可以實現輪詢、隨機、加權輪詢和基於連接數的負載均衡等。

為了提高LVS的可用性,我們使用雙機對外提供服務。可以使用keepalived+VIP的方式實現雙機。雙機中,一臺機器是主機,對外提供服務,另一臺為備機,不對外提供服務。二者通過keepalived軟件來判斷主機是否故障,自動完成VIP從主機切換到備機。主備機的切換對客戶端是無感知的。

服務層負載均衡

這一層一般使用RPC框架來實現,如DUBBO、SpringCloud等。

數據存儲層

對於數據庫,有如下兩種常用的負載均衡方式:

1.讀寫分離。數據庫是一主多從,即一臺主服務器負責數據的寫操作,從庫對外提供讀服務,主庫完成寫操作後,將更新同步到從庫或者從庫監控主庫的寫LOG,將寫LOG同步到從庫。這種模式很適合寫少讀多的情況。

2.分庫。當數據庫表大到一定規模後,就要考慮分庫了,即將一張表拆分到兩個數據庫中。常見的拆分規則有:

1)按照範圍拆分。比如對於用戶的ID,可以將小於5000的拆分到一個庫中,大於5000的拆分到另外一個庫。這種拆分比較簡單,但是可能會出現活躍的用戶僅在某一個段內,導致負載均衡效果不是很理想。

2)hash。比如根據用戶ID計算哈希值,然後對數據庫服務器個數取模,得到這個用戶應該存儲在哪個數據庫。這種方式可以很好的實現負載均衡,但是在增加服務器的情況下,數據的重新分佈比較慢,而且可能移動的數據比較多。現在一般使用一致性hash,更好的實現負載均衡並較少服務器變化時數據移動的數量。


分享到:


相關文章: