說到高並發,往往離不開分布式系統。人們往往將二者聯系在一起的,因為高並發是分布式系統架構設計必須要考慮的因素之一。目前,很多社交網路和游戲后台都是分布式系統。下面具體看看分布式系統是如何演變而來的。
初始階段的網絡架構
在互聯網的初始階段,網站基本都是小型的網站,用戶量小,通常將應用程序,文件,數據庫存放在同一個服務器上,因為這樣已經能滿足當時的需求。
應用服務和數據分離
隨着用戶量的不斷增加,服務器的壓力越來越大,用戶的訪問速度越來越慢,而且數量存儲空間也不足,這時候原來的單服務器架構已經不滿足原來的需求了。**這時候需要將Web應用和數據分離,分別存放到不同的服務器。這個時候服務器就分為:應用服務器,數據庫服務器,文件服務器。這樣不僅提高了單台機器的服務器的負載能力,也提高了容災能力。
使用緩存改善網站性能
隨着用戶的不斷增加,數據庫的壓力有再次的增加,不再能滿足市場的需求。其實大部分的網站80%的業務訪問都是在訪問20%的數據。所以就出現這樣的系統,直接先將這常見的數據緩存到內存中,這樣就不需要每次都去訪問數據庫提取數據,這樣就大大減少了數據庫的壓力,而且速度更加快。
緩存又分為本地緩存和分布式緩存服務器,前者速度更快,但是容量有限,后者理論上容量沒有限制,
使用集群改善並發處理能力
使用緩存后,數據庫服務器的壓力就大大下降了,但是單個應用服務器的處理的鏈接數並沒有提高,所以當大量用戶進行訪問的時候,應用服務器就成為整個網站的瓶頸。因此使用負載均衡處理器是必然的結果。使用負載均衡處理器后,當用戶訪問,它可以把任務分配給任何一個集群的應用服務器。使用集群還有一個好處,就是應用程序的更新可以做到用戶無感知。
大部分負載均衡都是通過軟件來實現的,常用的就是Nginx
數據庫讀寫分離
當用戶的規模達到一定的規模后,數據庫服務器壓力也會大大增加,雖然前面已經提到利用緩存可以讓數據庫的查詢壓力減小,但是還是有很多的操作需要數據庫來完成,所以單個服務器處理能力也會達到一個瓶頸。因此現在很多的數據庫都提供了主從熱備功能。因此通過配置兩台數據庫服務器,設置好主從關系,可以實現將一台服務器上的數據更新到另外一台服務器。利用這一功能可以實現數據庫的讀寫分離。
當應用程序需要寫數據的時候訪問主數據庫,然后主數據庫通過主從復制機制,將數據更新到從數據庫,然后當應用程序需要讀數據時候,訪問的是從數據庫。為了方便應用程序訪問讀寫分離后的數據庫,通常在應用程序服務器使用專用的數據訪問模塊,使數據庫讀寫分離對應用程序透明。
反向代理CDN加速
隨着網站名氣越多越大,用戶規模越來越大,網站業務也隨着繼續壯大。為了滿足不同地區的用戶快速訪問網站的需求,需要提高網站的訪問速度。主要手段有使用 CDN 和反向代理。
同時 Ajax 技術的出現,Web 應用會將數據(內容和圖片)和頁面框架(指 HTML 文件以及其中的標簽)。頁面框架內容存放到 CDN 服務器上,數據存放到數據庫服務器上。當用戶使用瀏覽器訪問網站,會顯示頁面框架,然后頁面框架發起 HTTP 請求加載數據。
而反向代理是部署在網站的中心機房,當用戶請求到達中心機房后,首先訪問的反向代理,如果反向代理緩存着用戶請求的資源,則直接返回給用戶。
CDN 和反向代理的基本原理都是緩存。
使用分布式文件系統和分布式數據庫系統
任何強大的單一服務器都滿足不了大型網站持續增長的業務需求。
分布式數據庫時網站數據庫拆分的最后手段,只用在單表數據規模非常大的時候才使用。不到不得已時,網站更常用的數據庫拆分手段是業務拆分,將不同業務的數據部署在不同的物理服務器上。
使用NoSQL和搜索引擎
隨着網站業務越來越復雜,對數據存儲和檢索的需求也越來越復雜。網站需要采用一些非關系數據庫技術如 NoSQL 數據庫和非數據庫查詢技術如搜索引擎。而常見的 NoSQL 數據庫有 Mongodb、HBase等。
業務拆分
大型網站為了應對日益復雜的業務場景,通過使用分而治之的手段將真個網站業務拆分成不同的產品線。如大型購物交易網站都會將首頁、商鋪、訂單、買家、賣家等拆分成不同的產品線,分歸不同的業務團隊負責。
分布式系統
隨着業務拆分越來越小,存儲系統越來越龐大,應用系統的整體復雜度呈指數級增加,部署維護越來越困難。
既然每一個應用系統都需要執行許多相同的業務操作,比如用戶管理、商品管理等,那么可以將這些共用的業務提取出來,獨立部署。由這些可復用的業務連接數據庫,提供共用業務服務,而應用系統只需要管理用戶界面,通過分布式服務調用共用業務服務完成具體業務操作。