非常實用的大型網站技術架構總結

2018年9月12日10:22:53 发表评论 4 閱讀

早期的網站為了節省成本一般會設計成集中式系統,應用程式、資料庫等都部署在一台伺服器上。 但隨著業務的快速度發展,逐漸出現瓶頸,按一定原則**(應用拆分、服務拆分、資料拆分、應用解耦)**,向分散式系統轉型,涉及到以下環節改造。

非常實用的大型網站技術架構總結

非常实用的大型网站技术架构总结

主要環節

業務拆分:將整個網站業務拆分成不同的應用,每個應用獨立部署維護,應用之間通過RPC或訊息佇列通信。
集群化(應用伺服器;基於RPC的微服務應用等)
LVS負載均衡,負責將請求轉發給不同業務集群
反向代理伺服器,常用的如Nginx
應用伺服器,servlet容器,如tomcat
應用和資料服務分離,分別部署在不同的伺服器
後端應用合理分層,通常分為表現層或閘道層、業務邏輯層、資料持久層
緩存。分為兩種:本地緩存;分散式緩存
CDN化。靜態內容部署到CDN,就近獲取,加速網站響應。
資料庫讀寫分離。資料庫採用主從熱備,應用伺服器在寫資料時訪問主要資料庫,主要資料庫通過主從複製機制將資料更新同步到從資料庫。
分庫分表,引入分散式資料框架
引入NoSQL,支援海量資料存儲
借助elastics search等開源搜尋引擎
非同步化,系統解耦。
縮短業務流程,加快網站存取速度
消除併發訪問高峰
架構五要素:

高性能
可用性(Availability)
伸縮性(Scalability)
擴展性(Extensibility)
安全性
1、高性能

性能的測試指標主要有:

回應時間:指應用執行一個操作需要的時間
併發數:指系統能夠同時處理請求的數目
QPS:指單位時間內系統處理的請求量
系統效能計數器:描述伺服器或者作業系統性能的一些資料指標
性能優化,根據網站分層架構,可以分為三大類:

Web 前端性能優化
減少 http 請求
使用流覽器緩存
啟用壓縮
CSS 放在頁面最上面,JavaScript 放在頁面最下面
減少 Cookie 傳輸
應用伺服器性能優化:主要手段有 緩存、集群、非同步
多執行緒(設計為無狀態,使用局部物件,併發訪問資源使用鎖)
資源複用(單例,物件集區)
資料結構
非同步作業(訊息佇列,削峰作用)
多台應用伺服器組成一個集群共同對外服務,提高整體處理能力。
使用 CDN,將網站靜態內容分發至離使用者最近的網路服務商機房,使使用者通過最短訪問路徑獲取資料。可以在網站機房部署反向代理伺服器,緩存熱點檔,加快請求回應速度,減輕應用伺服器負載壓力
應用伺服器端,可以使用伺服器本地緩存和分散式緩存(網站性能優化第一定律:優化考慮使用緩存優化性能)
代碼層面,也可以通過使用多執行緒、改善記憶體管理等手段優化性能。
資料庫伺服器端,索引、緩存、SQL 優化等性能優化手段
NoSQL 資料庫通過優化資料模型、存儲結構、伸縮特性等
存儲伺服器性能優化
機械硬碟 vs. 固態硬碟
B+ 樹 vs. LSM 樹
RAID vs. HDFS
2、高可用

高可用的網站架構:目的是保證伺服器硬體故障時服務依然可用、資料依然保存並能夠被訪問,主要手段資料和服務的冗餘備份及失效轉移

高可用的應用:顯著特點是應用的無狀態性
通過負載均衡進行無狀態服務的失效轉移
應用伺服器集群的 Session 管理
高可用的服務:無狀態的服務,可使用類似負載均衡的失效轉移策略,此外還有如下策略
超時設置
非同步調用
服務降級
限流
高可用的資料:主要手段是資料備份和失效轉移機制
失效確認
訪問轉移
資料恢復
冷備:缺點是不能保證資料最終一致和資料可用性
熱備:分為非同步熱備和同步熱備
資料一致性(Consisitency)
資料可用性(Availibility)
分區耐受性(Partition Tolerance)
CAP 原理
資料備份
軟體品質保證
自動化測試
預發佈驗證
灰度發佈
網站即時監控
警報系統
自動優雅降級
使用者行為日誌採集(伺服器端和用戶端)
伺服器性能監控
監控資料獲取
監控管理
3、伸縮性

大型網站需要面對大量使用者的高併發訪問和存儲海量資料,不可能只用一台伺服器就處理全部使用者請求,存儲全部資料。網站通過集群的方式將多台伺服器組成一個整體共同提供服務。所謂伸縮性是指通過不斷向集群中加入伺服器的手段來緩解不斷上升的用戶併發訪問壓力和不斷增長的資料存儲需求。

衡量架構伸縮性的主要標準就是是否可以用多台伺服器構建集群,是否容易向集群中添加新的伺服器。加入新的伺服器後是否可以提供和原來的伺服器無差別的服務。集群中可容納的總的伺服器數量是否有限制。

對於應用伺服器集群,只要伺服器上不保存資料,所有伺服器都是對等的,通過使用合適的負載均衡設備就可以向集群中不斷加入伺服器。

對於緩存伺服器集群,加入新的伺服器可能會導致緩存路由失效,進而導致集群中大部分緩存資料都無法訪問。雖然緩存的資料可以通過資料庫重新預熱,但是如果應用已經嚴重依賴緩存,可能會導致整個網站崩潰。需要改進緩存路由演算法保證緩存資料的可訪問性。

關聯式資料庫雖然支援資料複製,主從熱備等機制,但是很難做到大規模集群的可伸縮性,因此關聯式資料庫的集群伸縮性方案必須在資料庫之外實現,通過路由分區等手段將部署有多個資料庫的伺服器組成一個集群。

至於大部分 NoSQL 資料庫產品,由於其先天就是為海量資料而生,因此其對伸縮性的支援通常都非常好,可以做到在較少運維參與的情況下實現集群規模的線性伸縮。

概括起來伸縮性的分為如下幾個方面:

應用伺服器集群的伸縮性設計
輪詢(Round Robin, RR)
加權輪詢(Weighted Round Robin, WRR)
隨機(Random)
最少連結(Least Connections)
源地址散列(Source Hashing)
DNS 功能變數名稱解析負載均衡
反向代理負載均衡(在 HTTP 協定層面,應用層負載均衡)
IP 負載均衡(在內核進程完成資料分發)
資料連結層負載均衡(資料連結層修改 mac 位址,三角傳輸模式,LVS)
分散式緩存集群的伸縮性設計
Memcached 用戶端(包括 API,路由演算法,伺服器清單,通信模組)
Memcached 伺服器集群
分散式緩存的一致性 Hash 演算法(一致性 Hash 環,虛擬層)
資料存儲服務集群的伸縮性設計
關聯式資料庫集群的伸縮性設計
NoSQL 資料庫的伸縮性設計
4、可擴展

系統架構設計層面的“開閉原則”,構建可擴展的網站架構

利用分散式訊息佇列降低耦合性
分散式訊息佇列
事件驅動架構(Event Driven Architecture)
利用分散式服務打造可複用的業務平臺
分散式服務框架設計(Thrift,Dubbo)
可擴展的資料結構(如 HBase的 ColumnFamily 設計)
利用開放平臺建設網站生態圈
5、網站的安全架構

XSS 攻擊和 SQL 注入攻擊是構成網站應用攻擊最主要的兩種手段,此外還包括 CSRF,Session 劫持等手段。

攻擊與防禦
對js轉義,使其失去執行功能,只作為純字串展示
防範:httpOnly;增加token校驗;通過Referer識別。
網站安全性漏洞掃描
CSRF 攻擊:跨網站請求偽造(Cross Site Request Forgery)
Error Code
表單 Token
驗證碼
jsonp請求的,Referer 校驗
SQL 注入
html 危險字元轉義
XSS 攻擊:跨網站腳本攻擊(Cross Site Script)
原文作者:穩穩地幸福y

原文地址:https://www.toutiao.com/i6479351089857561102/

hcyaobin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: