從單服務器模式到負載均衡設計
作者:Grey
原文地址:
單服務器模型是最簡單的一種架構,參考如下圖
用戶訪問一個 URL,URL 會先到 DNS 服務器進行域名解析,然後返回給客戶端一個 IP 地址,客戶端會通過這個 IP 地址訪問到真正的服務,服務接收到客戶端請求以後,返回對應的 HTML 頁面,就完成了整個過程。
當然,以上是靜態頁面,相對複雜的應用會配置數據庫,架構如下
在選擇數據庫的時候,會涉及數據庫選型問題,有兩類比較主流的數據庫可以選擇,即關係型數據庫和非關係型數據庫。
關係型數據庫也被稱爲關係型數據庫管理系統(RDBMS),關係型數據庫以表和行來表示和存儲數據。其優勢是你可以使用 SQL 語句在不同的數據庫表中執行連接操作。
非關係型數據庫也被稱爲 NoSQL 數據庫。 一般被歸納爲四類:鍵值存儲、圖形存儲、列存儲和文檔存儲。非關係型數據庫一般不支持連接操作。
對於大多數開發者來說,關係型數據庫是最好的選擇,因爲它們已經存在了40多年且一直運行良好;然而,如果關係型數據庫不適合你的特定用例,
比如
-
應用需要超低的延遲。
-
數據是非結構化的,或者你沒有任何關係型數據。
-
只需要對數據進行序列化和反序列化(JSON、XML、YAML等)。
-
需要存儲大量的數據
則非關係型數據庫可能是正確的選擇。
關係型和非關係型數據庫的選型可以參考這個網站:DB-Engines Ranking
隨着用戶數量增多,單服務架構的設計可能會導致一些問題,比如:
用戶是直接連接到網絡服務器的。如果網絡服務器離線,用戶將無法訪問網站,在另一種情況下,如果許多用戶同時訪問網絡服務器,並達到網絡服務器的負載極限,用戶一般會遇到較慢的響應或無法連接到服務器。
針對這些問題,有兩種主要的思路,分別是:水平擴展和垂直擴展。
垂直擴展,簡言之就是在你的服務器上增加更多的配置,比如 CPU、內存 等資源。
水平擴展,簡言之就是增加更多的服務實例來擴展的服務能力。
當流量較低時,垂直擴展是一個很好的選擇,簡單直接。但是垂直擴展也有嚴重的侷限性,因爲
-
不可能在一臺服務器上增加無限的 CPU 和內存。
-
垂直擴展不具備故障轉移和冗餘功能。如果一臺服務器癱瘓了,整個網站/應用程序就會完全癱瘓。
由於垂直擴展的侷限性,水平擴展對於大規模的應用來說是比較理想的。
水平擴展的一個技術就是負載均衡。可以比較好的解決這個問題。架構如下
如圖所示,用戶直接連接到負載均衡器的公共 IP。在這種設置下,網絡服務器已經無法被客戶直接訪問。爲了提高安全性,服務器之間的通信使用了私有 IP。私有 IP 是一個只能在同一網絡中的服務器之間到達的 IP 地址;但是,它在互聯網上是無法到達的。負載均衡器通過私有 IP 與網絡服務器進行通信。
在圖中,在添加了一個負載均衡服務器和第二個 Web 服務器後,我們成功地解決了沒有故障轉移的問題,並提高了Web層的可用性。
-
如果服務器1離線,所有的流量將被路由到服務器2。這可以防止網站脫機。我們還將在服務器池中添加一個新的健康的Web服務器,以平衡負載。
-
如果網站流量迅速增長,而兩臺服務器不足以處理這些流量,負載均衡器可以優雅地處理這個問題。你只需要向網絡服務器池添加更多的服務器,負載平衡器就會自動開始向它們發送請求。