一般來講,一個網站發展的演化過程,幾乎都會經歷單機架構、集群架構、分布式架構。伴隨業務系統架構一同演變的還有外圍系統和存儲系統,如關系型數據庫的分庫分表改造、從本地緩存過渡到分布式緩存等等。本文對其中單機系統與集群系統的特點做簡單總結。
單機系統
每一個網站創立初期肯定不可能擁有龐大的用戶流量和海量數據,而是一步步演變其自身架構,滿足自身業務,因為系統的做大往往與業務的做大呈正比的。對于一個剛上線的項目,我們往往會將Web服務器、文件服務器和數據庫全都部署在同一臺物理服務器上,最大好處是低成本。這樣的部署對于剛起步的小網站是非常實惠的,而當業務發展、用戶逐漸增多時,系統瓶頸便開始暴露出來,此時需對網站做出以下四點調整:
獨立部署,避免不同的系統之間相互爭奪共享資源(比如CPU、內存、磁盤等);
Web服務器集群,實現可伸縮性;
部署分布式緩存系統,使查詢操作盡可能在緩存命中;
數據庫實施讀寫分離,實現HA(High Availability)架構。
集群架構
在用戶開始增多這個階段,需要解決的主要問題是提升系統的并行處理能力,降低單機系統負載,一邊支撐更多的用戶訪問操作。集群技術可以將多臺獨立的服務器通過網絡相互連接組合起來,形成一個有效整體對外提供服務,使用集群的意義在于其目的收益高于所付出的實際成本和代價。互聯網業內有一個共同的認知,那就是當一臺服務器的處理能力接近或已超出其容量上限時,不要企圖更換一臺性能更強勁的服務器(scale up),通常的做法是采用集群技術(scale out),通過增加新的服務器來分散并發訪問流量,2臺不夠就擴到4臺,4臺不夠就擴到8臺,只要業務系統能夠隨意支持服務器的橫向擴容,那么從理論上來說就應該無懼任何挑戰,從而實現可伸縮性和高可用性架構。
如下圖所示,對于無狀態的 Web 節點來說,通過 Nginx 來實現負載均衡調度是個不錯的選擇,但是在生產環境中, Nginx 也應該具備高可用性,這可以依靠DNS 輪詢來實現。在集群環境中, Web 節點的數量越多,并行處理能力就越強,哪怕其中某些節點因為種種原因巖機,也不會使系統的整體服務不可用。
伴隨著 Web 集群改造的還有分布式緩存和數據庫,對于查詢操作我們應該盡可能在緩存命中,從而降低數據庫的負載壓力。盡管緩存技術可以解決數據庫的大部分查詢壓力,但是寫入操作和無法在緩存命中的數據仍然需要頻繁地對數據庫進行讀/寫操作,因此對數據庫實施讀/寫分離改造也非常重要。業務發展到一定階段后必然會變得更加復雜,用戶規模也會線性上升,此時可以對現有網站架構做出以下兩點調整:
利用CDN 加速系統響應;
業務垂直化,降低藕合,從而實現分而治之的管理。
中國的網絡環境復雜,不同網絡和地區的用戶訪問網站時,速度會有差別,當流量增大時,可以將系統的一些靜態資源數據緩存到CDN節點上,如下圖所示,用戶請求不會直接落到企業網站上,而是請求到離用戶最近的ISP(互聯網服務提供商)上,故大幅度提升系統整體的響應速度。
參考書目:*《人人都是架構師》,高翔龍著。