大型網站技術架構

1. 大型網站架構演化發展歷程

1)初始階段的網站架構

應用程序、數據庫、文件等全部資源都在一臺服務器上。Linux+PHP+Apache+MySQL。html


初始階段的網站架構

2)應用服務和數據服務分離

使用三臺服務器:應用服務器、文件服務器、數據庫服務器。前端

 


應用服務和數據服務分離

3)使用緩存改善網站性能

 


網站使用緩存

4)使用應用服務器集羣改善網站的併發處理能力

 


應用服務器集羣部署

5)數據庫讀寫分離

 


數據庫讀寫分離

6)使用反向代理和CDN加速網站響應

 


網站使用反向代理和CDN加速訪問

7)使用分佈式文件系統和分佈式數據庫系統

 


使用分佈式文件和分佈式數據庫系統

8)使用NoSQL和搜索引擎

 


使用NoSQL和搜索引擎

9)業務拆分

垂直拆分,分而治之,按業務拆分紅不一樣的應用。正則表達式


業務拆分

10)分佈式服務

水平拆分,提取公共組件,中臺戰略。算法


分佈式服務

 

2. 大型網站架構模式

1)分層

水平切分:應用層、服務層、數據層。數據庫

2)分割

垂直切分:按業務切分。後端

3)分佈式

分佈式應用和服務、分佈式數據和存儲、分佈式計算、分佈式鎖、分佈式文件系統。瀏覽器

4)集羣

5)緩存

6)異步

7)冗餘

8)自動化

9)安全

 

3. 大型網站核心架構要素

軟件架構:系統的各個重要組成部分及其關係構成了系統的架構,這些組成部分能夠是具體的功能模塊,也能夠是非功能的設計與決策,他們相互關係組成一個總體,共同構成了軟件系統的架構。緩存

1)性能

性能優化,前端:瀏覽器緩存、頁面壓縮、CDN緩存、反向代理緩存。安全

後端 :緩存、異步、集羣、多線程、改善內存管理、數據庫索引、SQL優化。性能優化

2)可用性

高可用的手段:冗餘、負載均衡集羣。

3)伸縮性

關注點:非功能性需求(技術需求)。

衡量架構伸縮性的主要標準:是否能夠用多臺服務器構建集羣,是否容易向集羣中添加新的服務器,新服務器是否能夠提供和原服務器無差異的服務,集羣可容納的總的服務器數量是否有限制。

4)擴展性

關注點:功能需求。

衡量架構擴展性的主要標準:增長新的業務產品時,是否能夠實現對現有產品透明無影響,不須要改動或者不多改動既有業務功能就能夠上線新產品,不一樣產品之間是否不多耦合,一個產品改動對其餘產品功能無影響。

可擴展的主要手段:事件驅動架構(消息隊列)、分佈式服務(將業務和可複用服務分離開,經過分佈式服務框架調用)。

5)安全性

 

4. 網站的高性能架構

1)性能測試

性能測試是性能優化的前提和基礎,也是性能優化結果的檢查和度量標準。

A. 性能測試的主要指標:響應時間、併發數、吞吐量、性能計數器

響應時間:指應用執行一個操做須要的時間,包括從發出請求開始到收到最後響應數據所須要的時間。

併發數:同時提交請求的數量。

吞吐量:單位時間內系統處理的請求數量。TPS(每秒事務數)、QPS(每秒查詢數)。

吞吐量QPS(TPS)= 併發數/平均響應時間

當併發數到必定數量時,吞吐量反而會降低,緣由是系統超負荷工做,上下文切換、內存等等其它消耗致使系統性能降低。

性能計數器:描述服務器或操做系統性能的一些數據指標。系統負載System Load:當前正在被CPU執行和等待被CPU執行的進程數目總和,是反映系統忙閒程度的重要指標。內存使用、CPU使用、磁盤與網絡I/O。

B. 性能測試方法:性能測試、負載測試、壓力測試、穩定性測試

 


性能測試曲線

 

 


併發用戶訪問響應時間曲線

 

 


性能測試結果報告

 

2)Web前端性能優化

A. 瀏覽器訪問優化

減小http請求:合併CSS、合併JavaScript、合併圖片。

使用瀏覽器緩存靜態資源文件:設置http頭中的Cache-Control和Expires屬性;靜態資源文件變化須要及時應用到客戶端瀏覽器時,可經過改變文件名實現,生成一個新的JS文件並更新HTML文件中的引用;須要批量更新時,不要一次所有更新,應該一個文件一個文件更新,並有必定的隨機間隔時間,以避免用戶瀏覽器忽然大量緩存失效,集中更新緩存,形成服務器負載驟增、網絡堵塞的狀況。

啓用壓縮:HTML、CSS、JavaScript文件啓用GZip壓縮,在服務器端對文件進行壓縮,在瀏覽器端對文件解壓縮。

B. CDN加速

緩存靜態資源。

 


利用CDN的網站架構

C. 反向代理

安全功能,緩存靜態內容、動態內容,負載均衡。


利用反向代理的網站架構

3)應用服務器性能優化

A. 分佈式緩存

網站性能優化第必定律:優先考慮使用緩存優化性能。

緩存適用:讀寫比很高,不多變化的數據。

緩存預熱:最好在緩存系統啓動時就把熱點數據加載好,這個緩存預加載手段叫做緩存預熱(warm up)。

緩存穿透:對策是將不存在的數據也緩存起來(其value值爲null)。

B. 異步操做

使用消息隊列縮短響應時間。

 


 

使用消息隊列進行消峯。

 


使用消息隊列消除併發訪問高峯

C. 使用集羣

 


利用負載均衡改善性能

D. 代碼優化

多線程:使用多線程的緣由主要是IO阻塞和多CPU。

啓動線程數=[任務執行時間/(任務執行時間-IO等待時間)] * CPU內核數

最佳啓動線程數和CPU內核數量成正比,和IO阻塞時間成反比。

解決線程安全的主要手段:將對象設計成無狀態對象(對象無成員變量或成員變量也是無狀態對象),使用局部對象(在方法內部建立對象),併發訪問資源時使用鎖。

資源複用:單例和對象池。

4)存儲性能優化

5. 網站的高可用架構

1)網站可用性度量

網站年度可用性指標=(1-網站不可用時間/年度總時間)*100%

2個9是基本可用,網站年度不可用時間小於88小時;3個9是較高可用,網站年度不可用時間小於9小時;4個9是具備自動恢復能力的高可用,網站年度不可用時間小於53分鐘;QQ服務99.99%可用;5個9是極高可用性,網站年度不可用時間小於5分鐘。

2)高可用的網站架構

網站的高可用架構設計的主要目的:保證服務器硬件故障時,服務依然可用,數據依然保存並可以被訪問。

實現高可用架構的主要手段:數據和服務的冗餘備份及失效轉移。

分層架構的可用性:應用層的服務器、服務層的服務器、數據層的服務器。

3)高可用的應用

應用層主要處理網站應用的業務邏輯,也稱業務邏輯層。

經過負載均衡進行無狀態服務的失效轉移。


利用負載均衡服務器實現高可用的應用服務

應用服務器集羣的Session管理。

一般採用獨立部署的Session服務器(集羣)統一管理Session。

 


利用Session服務器共享Session

4)高可用的服務

可複用的服務模塊爲業務產品提供基礎公共服務。

也能夠經過負載均衡進行高可用服務的失效轉移。

實現高可用服務的幾個手段:分級管理(高優先級、低優先級)、超時設置、異步調用、服務降級、冪等性設計。

5)高可用的數據

保證數據高可用的手段主要是:數據備份、失效轉移機制。

數據備份是保證數據有多個副本,任意副本的失效都不會致使數據的永久丟失。

失效轉移機制保證當一個數據副本不可訪問時,能夠快速切換訪問數據的其餘副本,保證系統可用。

CAP原理:一個提供數據服務的存儲系統沒法同時知足數據一致性(Consistency)、數據可用性(Availibility)、分區容忍性(Partition Tolerance,系統具備跨網絡分區的伸縮性)這三個條件。

在大型網站中,一般會選擇強化分佈式存儲系統的可用性(A)和伸縮性(P),而在某種程度上放棄一致性(C)。只要求最終一致性。

6. 網站的伸縮性架構

網站的伸縮性是指不須要改變網站的軟硬件設計,僅僅經過改變部署的服務器數量就能夠擴大或者縮小網站的服務處理能力。

1)網站架構的伸縮性設計

怎樣設計網站,使它具備伸縮性?

A. 不一樣功能進行物理分離實現伸縮

 


經過物理分離實現服務器伸縮

 


經過分層後分離部署實現系統伸縮性

 


經過業務分割後分離部署實現伸縮性

B. 單一功能經過集羣實現伸縮

當一頭牛拉不動車的時候,不要去尋找一頭更強壯的牛,而是用兩頭牛來拉車。

集羣伸縮性分爲:應用服務器集羣伸縮性和數據服務器集羣伸縮性。

2)應用服務器集羣的伸縮性設計

經過負載均衡實現應用服務器伸縮性。

負載均衡算法:輪詢(Round Robin,RR)、加權輪詢(Weighted Round Robin,WRR)、隨機(Random)、最少鏈接(Least Connections)、源地址散列(Source Hashing)。

3)分佈式緩存集羣的伸縮性設計

分佈式緩存集羣中不一樣服務器緩存的數據各不相同,緩存訪問請求必需要先找到緩存對應的服務器,才能訪問。伸縮性設計的主要目標:新加入緩存服務器後,整個緩存服務器集羣中已經緩存的數據儘量還被訪問到。

目前比較好的算法是一致性Hash算法。

計算機的任何問題均可以經過增長一個虛擬層來解決。

4)數據存儲服務器集羣的伸縮性設計

A. 關係數據庫集羣的伸縮性設計

簡單伸縮:數據複製

 


使用數據複製的MySQL集羣伸縮方案

數據分庫、分片:MyCat

B. NoSQL數據庫的伸縮性設計

放棄以關係代數爲基礎的結構化查詢語言(SQL)和事務一致性保證(ACID),強化高可用性和可伸縮性。

 

7. 網站的可擴展架構

開閉原則(對擴展開放,對修改關閉),當系統增長新功能時,不須要對現有系統的結構和代碼進行修改。

1)構建可擴展的網站架構

網站可擴展架構的核心思想是模塊化,並在此基礎上,下降模塊間的耦合性,提升模塊的複用性。

2)利用分佈式消息隊列下降系統耦合性

事件驅動架構(Event Driven Architecture)

3)利用分佈式服務打造可複用的業務平臺

分佈式服務框架Dubbo


Dubbo架構原理

4)可擴展的數據結構

使用NoSQL

 

8. 網站的安全架構

1)網站應用攻擊和防護

A. XSS攻擊

跨站點腳本攻擊(Cross Site Script):黑客經過篡改網頁,注入惡意HTML腳本,在用戶瀏覽網頁時,控制用戶瀏覽器進行惡意操做的一種攻擊方式。

 


反射型XSS攻擊

 


持久型XSS攻擊

消毒是網站必備的XSS防攻擊手段,對某些html危險字符轉義,如「>」轉義爲「&gt」,「<」轉義爲「&lt」,能夠防止大部分攻擊。

B. 注入攻擊

SQL注入攻擊:

 


SQL注入攻擊

防護:請求參數消毒(經過正則表達式匹配),使用預編譯手段綁定參數。

C. CSRF攻擊

跨站點請求僞造

 


CSRF攻擊

防護手段:識別請求者身份。

方法:表單Token、驗證碼、Referer check。

2)信息加密技術及密鑰安全管理

A. 單向散列加密

單向散列算法:MD五、SHA。


單向散列加密

B.對稱加密

對稱加密優勢:算法簡單,加解密效率高,系統開銷小,適合對大量數據加密。

缺點:加解密使用同一個密鑰,遠程通訊的狀況下如何安全的交換密鑰是個難題。

經常使用對稱加密算法:DES算法、RC算法。

C. 非對稱加密算法


非對稱加密

非對稱加密算法:RSA算法;

實際應用中,經常會混合使用對稱加密和非對稱加密,先使用非對稱加密技術對對稱密鑰進行安全傳輸,而後使用對稱加密技術進行信息加解密。

相關文章
相關標籤/搜索