1. 大型網站架構演化發展歷程
1)初始階段的網站架構
應用程序、數據庫、文件等所有資源都在一台服務器上。Linux+PHP+Apache+MySQL。
2)應用服務和數據服務分離
使用三台服務器:應用服務器、文件服務器、數據庫服務器。
3)使用緩存改善網站性能
4)使用應用服務器集群改善網站的並發處理能力
5)數據庫讀寫分離
6)使用反向代理和CDN加速網站響應
7)使用分布式文件系統和分布式數據庫系統
8)使用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加速
緩存靜態資源。
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。
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. 關系數據庫集群的伸縮性設計
簡單伸縮:數據復制
數據分庫、分片:MyCat
B. NoSQL數據庫的伸縮性設計
放棄以關系代數為基礎的結構化查詢語言(SQL)和事務一致性保證(ACID),強化高可用性和可伸縮性。
7. 網站的可擴展架構
開閉原則(對擴展開放,對修改關閉),當系統增加新功能時,不需要對現有系統的結構和代碼進行修改。
1)構建可擴展的網站架構
網站可擴展架構的核心思想是模塊化,並在此基礎上,降低模塊間的耦合性,提高模塊的復用性。
2)利用分布式消息隊列降低系統耦合性
事件驅動架構(Event Driven Architecture)
3)利用分布式服務打造可復用的業務平台
分布式服務框架Dubbo
4)可擴展的數據結構
使用NoSQL
8. 網站的安全架構
1)網站應用攻擊和防御
A. XSS攻擊
跨站點腳本攻擊(Cross Site Script):黑客通過篡改網頁,注入惡意HTML腳本,在用戶瀏覽網頁時,控制用戶瀏覽器進行惡意操作的一種攻擊方式。
消毒是網站必備的XSS防攻擊手段,對某些html危險字符轉義,如“>”轉義為“>”,“<”轉義為“<”,可以防止大部分攻擊。
B. 注入攻擊
SQL注入攻擊:
防御:請求參數消毒(通過正則表達式匹配),使用預編譯手段綁定參數。
C. CSRF攻擊
跨站點請求偽造
防御手段:識別請求者身份。
方法:表單Token、驗證碼、Referer check。
2)信息加密技術及密鑰安全管理
A. 單向散列加密
單向散列算法:MD5、SHA。
B.對稱加密
對稱加密優點:算法簡單,加解密效率高,系統開銷小,適合對大量數據加密。
缺點:加解密使用同一個密鑰,遠程通信的情況下如何安全的交換密鑰是個難題。
常用對稱加密算法:DES算法、RC算法。
C. 非對稱加密算法
非對稱加密算法:RSA算法;
實際應用中,常常會混合使用對稱加密和非對稱加密,先使用非對稱加密技術對對稱密鑰進行安全傳輸,然后使用對稱加密技術進行信息加解密。
