第2章 大型網站架構模式
2.1 網站架構模式
為了解決大型網站面臨的高并發訪問,海量數據處理,高可靠運行等一系列問題與挑戰,大型互聯網公司在實踐中提出了許多解決方案,以實現網站高性能,高可用,易伸縮,可擴展,安全等各種技術架構目標。這些解決方案又被更多網站重復使用,從而逐漸形成大型網站架構模式。
2.1.1 分層
分層是企業應用系統中最常見的一種架構模式,將系統在橫向維度上切分成幾個部分,每個部分負責一部分相對比較單一的職責,然后通過上層對下層的依賴和調用組成一個完整的系統。
分層結構在計算機世界中無處不在,網絡的7層通信協議是一種分層結構;計算機硬件,操作系統,應用軟件也可以看作是一種分層結構。在大型網站中也采用分層結構,將網站軟件系統分為應用層,服務層,數據層,如下:
應用層:負責具體業務和視圖展示,如網站首頁及搜索輸入和結果展示;
服務層:為應用層提供服務支持,如用戶管理服務,購物車服務等;
數據層:提供數據存儲訪問服務,如數據庫,緩存,文件,搜索引擎等;
通過分層,可以更好地將一個龐大的軟件系統切分成不同的部分,便于分工合作開發和維護;各層之間具有一定的獨立性,只要維持調用接口不變,各層可以根據具體問題獨立演化發展而不需要其他層必須做出相應調整。
但是分層架構也有一些挑戰,就是必須合理規劃層次邊界和接口,在開發過程中,嚴格遵循分層架構的約束,禁止跨層次的調用(應用層直接調用數據層)及逆向調用(數據層調用服務層,或者服務層調用應用層)。
分層的架構是邏輯上的,在物理部署上,三層結構可以部署在同一個物理機器上,但是隨著網站業務的發展,必須需要對已經分層的模塊分離部署,即三層結構分別部署在不同的服務器上,使網站擁有更多的計算資源以應對越來越多的用戶訪問。
2.1.2 分割
如果說分層是將軟件在橫向方面進行切分,那么分割就是在縱向方面對軟件進行切分。
網站越大,功能越復雜,服務和數據處理的種類也越多,將這些不同的功能和服務分割開來,包裝成高內聚低耦合的模塊單元,一方面有助于軟件的開發和維護;另一方面,便于不同模塊的分布式部署,提高網站的并發處理能力和功能擴展能力。
大型網站分割的粒度可能會很小。比如:在應用層,將不同業務進行分割,如:購物,論壇,搜索,廣告分割成不同的應用,由獨立的團隊負責,部署在不同的服務器上;
2.1.3 分布式
對于大型網站,分層和分割的一個主要目的是為了切分后的模塊便于分布式部署,即將不同模塊部署在不同的服務器上,通過遠程調用協調工作。分布式意味著可以使用更多的計算機完成同樣的功能,計算機越多,CPU,內存,存儲資源也就越多,能夠處理的并發訪問和數據量就越大,進而能夠為更多的用戶提供服務。
但分布式在解決網站高并發問題的同時也帶來了其他問題。如下:
(1)分布式意味著服務調用必須通過網絡,這可能會對性能造成比較嚴重的影響;
(2)服務器越多,服務宕機的概率也就越大,一臺服務器宕機造成的服務不可用可能會導致很多應用不可訪問,使網站可用性降低;
(3)數據在分布式的環境中保持數據一致性也非常困難,分布式事務也難以保證,這對網站業務正確性和業務流程有可能造成很大影響;
(4)分布式還導致網站依賴錯綜復雜,開發管理維護困難;
在網站應用中,常用的分布式方案有以下幾種:
分布式應用和服務:將分層和分割后的應用和服務模塊分布式部署,除了可以改善網站性能和并發性,加快開發和發布速度,減少數據庫連接資源消耗外;還可以使不同應用復用共同的服務,便于業務功能擴展。
分布式靜態資源:網站的靜態資源如JS,CSS,Logo圖片等資源獨立部署,并采用獨立的域名,即人們常說的動靜分離。靜態資源分布式部署可以減輕應用服務器的負載壓力;通過使用獨立域名加快瀏覽器并發加載的速度;由負責用戶體驗的團隊進行開發維護有利于網站分工合作,使不同技術工種術業有專攻。
分布式數據和存儲:大型網站需要處理以P為單位的海量數據,單臺計算機無法提供如此大的存儲空間,這些數據需要分布式部署。除了對傳統的關系數據庫進行分布式部署外,為網站應用而生的各種NoSQL產品幾乎都是分布式的。
分布式計算:嚴格說來,應用,服務,實時數據處理都是計算,網站除了要處理這些在線業務,還有很大一部分用戶沒有直觀感受的后臺業務要處理,包括搜索 引擎的索引構建,數據倉庫的數據分析統計等。這些業務的計算規模非常龐大,目前網站普遍使用Hadoop及其MapReduce分布式計算框架進行此類批處理計算,其特點是移動計算而不是移動數據,將計算程序分發到數據所在的位置以加速計算和分布式計算。
此外,還有可以支持網站線上服務器配置實時更新的分布式配置;分布式環境下實現并發和協同的分布式鎖;支持云存儲的分布式文件系統等。
2.1.4 集群
多臺服務器部署相同應用構成一個集群,通過負載均衡設備共同對外提供服務。
因為服務器集群有更多服務器提供相同服務,因此可以提供更好的并發特性,當有更多用戶訪問的時候,只需要向集群中加入新的機器即可。同是因為一個應用由多臺服務器提供,當某臺服務器發生故障時,負載均衡設備或者系統的失效轉移機制會將請求轉發到集群中其他服務器上,使服務器故障不影響用戶使用。所以在網站應用中,即使是訪問量很小的分布式應用和服務,也至少要部署兩臺服務器構成一個小的集群,目的就是提高系統的可用性。