早期的網站爲了節省成本通常會設計成集中式系統,應用程序、數據庫等都部署在一臺服務器上。 但隨着業務的快速度發展,逐漸出現瓶頸,按必定原則**(應用拆分、服務拆分、數據拆分、應用解耦)**,向分佈式系統轉型,涉及到如下環節改造。html
主要環節前端
- 業務拆分:將整個網站業務拆分紅不一樣的應用,每一個應用獨立部署維護,應用之間經過RPC或消息隊列通訊。
- 集羣化(應用服務器;基於RPC的微服務應用等)
- LVS負載均衡,負責將請求轉發給不一樣業務集羣
- 反向代理服務器,經常使用的如Nginx
- 應用服務器,servlet容器,如tomcat
- 應用和數據服務分離,分別部署在不一樣的服務器
- 後端應用合理分層,一般分爲表現層或網關層、業務邏輯層、數據持久層
- 緩存。分爲兩種:本地緩存;分佈式緩存
- CDN化。靜態內容部署到CDN,就近獲取,加速網站響應。
- 數據庫讀寫分離。數據庫採用主從熱備,應用服務器在寫數據時訪問主數據庫,主數據庫經過主從複製機制將數據更新同步到從數據庫。
- 分庫分表,引入分佈式數據框架
- 引入NoSQL,支持海量數據存儲
- 藉助elastics search等開源搜索引擎
- 異步化,系統解耦。
- 縮短業務流程,加快網站訪問速度
- 消除併發訪問高峯
架構五要素:算法
- 高性能
- 可用性(Availability)
- 伸縮性(Scalability)
- 擴展性(Extensibility)
- 安全性
一、高性能數據庫
性能的測試指標主要有:json
- 響應時間:指應用執行一個操做須要的時間
- 併發數:指系統可以同時處理請求的數目
- QPS:指單位時間內系統處理的請求量
- 系統性能計數器:描述服務器或者操做系統性能的一些數據指標
性能優化,根據網站分層架構,能夠分爲三大類:後端
- Web 前端性能優化
- 減小 http 請求
- 使用瀏覽器緩存
- 啓用壓縮
- CSS 放在頁面最上面,JavaScript 放在頁面最下面
- 減小 Cookie 傳輸
- 應用服務器性能優化:主要手段有 緩存、集羣、異步
- 多線程(設計爲無狀態,使用局部對象,併發訪問資源使用鎖)
- 資源複用(單例,對象池)
- 數據結構
- 異步操做(消息隊列,削峯做用)
- 多臺應用服務器組成一個集羣共同對外服務,提升總體處理能力。
- 使用 CDN,將網站靜態內容分發至離用戶最近的網絡服務商機房,使用戶經過最短訪問路徑獲取數據。能夠在網站機房部署反向代理服務器,緩存熱點文件,加快請求響應速度,減輕應用服務器負載壓力
- 應用服務器端,可使用服務器本地緩存和分佈式緩存(網站性能優化第必定律:優化考慮使用緩存優化性能)
- 代碼層面,也能夠經過使用多線程、改善內存管理等手段優化性能。
- 數據庫服務器端,索引、緩存、SQL 優化等性能優化手段
- NoSQL 數據庫經過優化數據模型、存儲結構、伸縮特性等
- 存儲服務器性能優化
- 機械硬盤 vs. 固態硬盤
- B+ 樹 vs. LSM 樹
- RAID vs. HDFS
二、高可用瀏覽器
高可用的網站架構:目的是保證服務器硬件故障時服務依然可用、數據依然保存並可以被訪問,主要手段數據和服務的冗餘備份及失效轉移緩存
- 高可用的應用:顯著特色是應用的無狀態性
- 經過負載均衡進行無狀態服務的失效轉移
- 應用服務器集羣的 Session 管理
- 高可用的服務:無狀態的服務,可以使用相似負載均衡的失效轉移策略,此外還有以下策略
- 超時設置
- 異步調用
- 服務降級
- 限流
- 高可用的數據:主要手段是數據備份和失效轉移機制
- 失效確認
- 訪問轉移
- 數據恢復
- 冷備:缺點是不能保證數據最終一致和數據可用性
- 熱備:分爲異步熱備和同步熱備
- 數據一致性(Consisitency)
- 數據可用性(Availibility)
- 分區耐受性(Partition Tolerance)
- CAP 原理
- 數據備份
- 軟件質量保證
- 自動化測試
- 預發佈驗證
- 灰度發佈
- 網站實時監控
- 警報系統
- 自動優雅降級
- 用戶行爲日誌採集(服務器端和客戶端)
- 服務器性能監控
- 監控數據採集
- 監控管理
三、伸縮性tomcat
大型網站須要面對大量用戶的高併發訪問和存儲海量數據,不可能只用一臺服務器就處理所有用戶請求,存儲所有數據。網站經過集羣的方式將多臺服務器組成一個總體共同提供服務。所謂伸縮性是指經過不斷向集羣中加入服務器的手段來緩解不斷上升的用戶併發訪問壓力和不斷增加的數據存儲需求。安全
衡量架構伸縮性的主要標準就是是否能夠用多臺服務器構建集羣,是否容易向集羣中添加新的服務器。加入新的服務器後是否能夠提供和原來的服務器無差異的服務。集羣中可容納的總的服務器數量是否有限制。
對於應用服務器集羣,只要服務器上不保存數據,全部服務器都是對等的,經過使用合適的負載均衡設備就能夠向集羣中不斷加入服務器。
對於緩存服務器集羣,加入新的服務器可能會致使緩存路由失效,進而致使集羣中大部分緩存數據都沒法訪問。雖然緩存的數據能夠經過數據庫從新預熱,可是若是應用已經嚴重依賴緩存,可能會致使整個網站崩潰。須要改進緩存路由算法保證緩存數據的可訪問性。
關係數據庫雖然支持數據複製,主從熱備等機制,可是很難作到大規模集羣的可伸縮性,所以關係數據庫的集羣伸縮性方案必須在數據庫以外實現,經過路由分區等手段將部署有多個數據庫的服務器組成一個集羣。
至於大部分 NoSQL 數據庫產品,因爲其先天就是爲海量數據而生,所以其對伸縮性的支持一般都很是好,能夠作到在較少運維參與的狀況下實現集羣規模的線性伸縮。
歸納起來伸縮性的分爲以下幾個方面:
- 應用服務器集羣的伸縮性設計
- 輪詢(Round Robin, RR)
- 加權輪詢(Weighted Round Robin, WRR)
- 隨機(Random)
- 最少連接(Least Connections)
- 源地址散列(Source Hashing)
- DNS 域名解析負載均衡
- 反向代理負載均衡(在 HTTP 協議層面,應用層負載均衡)
- IP 負載均衡(在內核進程完成數據分發)
- 數據鏈路層負載均衡(數據鏈路層修改 mac 地址,三角傳輸模式,LVS)
- 分佈式緩存集羣的伸縮性設計
- Memcached 客戶端(包括 API,路由算法,服務器列表,通訊模塊)
- Memcached 服務器集羣
- 分佈式緩存的一致性 Hash 算法(一致性 Hash 環,虛擬層)
- 數據存儲服務集羣的伸縮性設計
- 關係數據庫集羣的伸縮性設計
- NoSQL 數據庫的伸縮性設計
四、可擴展
系統架構設計層面的「開閉原則」,構建可擴展的網站架構
- 利用分佈式消息隊列下降耦合性
- 分佈式消息隊列
- 事件驅動架構(Event Driven Architecture)
- 利用分佈式服務打造可複用的業務平臺
- 分佈式服務框架設計(Thrift,Dubbo)
- 可擴展的數據結構(如 HBase的 ColumnFamily 設計)
- 利用開放平臺建設網站生態圈
五、網站的安全架構
XSS 攻擊和 SQL 注入攻擊是構成網站應用攻擊最主要的兩種手段,此外還包括 CSRF,Session 劫持等手段。
- 攻擊與防護
- Error Code
- 表單 Token
- 驗證碼
- jsonp請求的,Referer 校驗
- SQL 注入
- html 危險字符轉義
- XSS 攻擊:跨站點腳本攻擊(Cross Site Script)
對js轉義,使其失去執行功能,只做爲純字符串展現
- CSRF 攻擊:跨站點請求僞造(Cross Site Request Forgery)
防範:httpOnly;增長token校驗;經過Referer識別。