大型網(wǎng)站技術(shù)架構(gòu)
時(shí)間:2023-04-18 22:50:01 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2023-04-18 22:50:01 來(lái)源:網(wǎng)站運(yùn)營(yíng)
大型網(wǎng)站技術(shù)架構(gòu):早期的網(wǎng)站為了節(jié)省成本一般會(huì)設(shè)計(jì)成集中式系統(tǒng),應(yīng)用程序、數(shù)據(jù)庫(kù)等都部署在一臺(tái)服務(wù)器上。 但隨著業(yè)務(wù)的快速度發(fā)展,逐漸出現(xiàn)瓶頸,按一定原則**(應(yīng)用拆分、服務(wù)拆分、數(shù)據(jù)拆分、應(yīng)用解耦)**,向分布式系統(tǒng)轉(zhuǎn)型,涉及到以下環(huán)節(jié)改造。
主要環(huán)節(jié)
- 業(yè)務(wù)拆分:將整個(gè)網(wǎng)站業(yè)務(wù)拆分成不同的應(yīng)用,每個(gè)應(yīng)用獨(dú)立部署維護(hù),應(yīng)用之間通過(guò)RPC或消息隊(duì)列通信。
- 集群化(應(yīng)用服務(wù)器;基于RPC的微服務(wù)應(yīng)用等)
- LVS負(fù)載均衡,負(fù)責(zé)將請(qǐng)求轉(zhuǎn)發(fā)給不同業(yè)務(wù)集群
- 反向代理服務(wù)器,常用的如Nginx
- 應(yīng)用服務(wù)器,servlet容器,如tomcat
- 應(yīng)用和數(shù)據(jù)服務(wù)分離,分別部署在不同的服務(wù)器
- 后端應(yīng)用合理分層,通常分為表現(xiàn)層或網(wǎng)關(guān)層、業(yè)務(wù)邏輯層、數(shù)據(jù)持久層
- 緩存。分為兩種:本地緩存;分布式緩存
- CDN化。靜態(tài)內(nèi)容部署到CDN,就近獲取,加速網(wǎng)站響應(yīng)。
- 數(shù)據(jù)庫(kù)讀寫分離。數(shù)據(jù)庫(kù)采用主從熱備,應(yīng)用服務(wù)器在寫數(shù)據(jù)時(shí)訪問(wèn)主數(shù)據(jù)庫(kù),主數(shù)據(jù)庫(kù)通過(guò)主從復(fù)制機(jī)制將數(shù)據(jù)更新同步到從數(shù)據(jù)庫(kù)。
- 分庫(kù)分表,引入分布式數(shù)據(jù)框架
- 引入NoSQL,支持海量數(shù)據(jù)存儲(chǔ)
- 借助elastics search等開(kāi)源搜索引擎
- 異步化,系統(tǒng)解耦。
- 縮短業(yè)務(wù)流程,加快網(wǎng)站訪問(wèn)速度
- 消除并發(fā)訪問(wèn)高峰
架構(gòu)五要素:
- 高性能
- 可用性(Availability)
- 伸縮性(Scalability)
- 擴(kuò)展性(Extensibility)
- 安全性
1、高性能
性能的測(cè)試指標(biāo)主要有:
- 響應(yīng)時(shí)間:指應(yīng)用執(zhí)行一個(gè)操作需要的時(shí)間
- 并發(fā)數(shù):指系統(tǒng)能夠同時(shí)處理請(qǐng)求的數(shù)目
- QPS:指單位時(shí)間內(nèi)系統(tǒng)處理的請(qǐng)求量
- 系統(tǒng)性能計(jì)數(shù)器:描述服務(wù)器或者操作系統(tǒng)性能的一些數(shù)據(jù)指標(biāo)
性能優(yōu)化,根據(jù)網(wǎng)站分層架構(gòu),可以分為三大類:
- Web 前端性能優(yōu)化
- 減少 http 請(qǐng)求
- 使用瀏覽器緩存
- 啟用壓縮
- CSS 放在頁(yè)面最上面,JavaScript 放在頁(yè)面最下面
- 減少 Cookie 傳輸
- 應(yīng)用服務(wù)器性能優(yōu)化:主要手段有 緩存、集群、異步
- 多線程(設(shè)計(jì)為無(wú)狀態(tài),使用局部對(duì)象,并發(fā)訪問(wèn)資源使用鎖)
- 資源復(fù)用(單例,對(duì)象池)
- 數(shù)據(jù)結(jié)構(gòu)
- 異步操作(消息隊(duì)列,削峰作用)
- 多臺(tái)應(yīng)用服務(wù)器組成一個(gè)集群共同對(duì)外服務(wù),提高整體處理能力。
- 使用 CDN,將網(wǎng)站靜態(tài)內(nèi)容分發(fā)至離用戶最近的網(wǎng)絡(luò)服務(wù)商機(jī)房,使用戶通過(guò)最短訪問(wèn)路徑獲取數(shù)據(jù)??梢栽诰W(wǎng)站機(jī)房部署反向代理服務(wù)器,緩存熱點(diǎn)文件,加快請(qǐng)求響應(yīng)速度,減輕應(yīng)用服務(wù)器負(fù)載壓力
- 應(yīng)用服務(wù)器端,可以使用服務(wù)器本地緩存和分布式緩存(網(wǎng)站性能優(yōu)化第一定律:優(yōu)化考慮使用緩存優(yōu)化性能)
- 代碼層面,也可以通過(guò)使用多線程、改善內(nèi)存管理等手段優(yōu)化性能。
- 數(shù)據(jù)庫(kù)服務(wù)器端,索引、緩存、SQL 優(yōu)化等性能優(yōu)化手段
- NoSQL 數(shù)據(jù)庫(kù)通過(guò)優(yōu)化數(shù)據(jù)模型、存儲(chǔ)結(jié)構(gòu)、伸縮特性等
- 存儲(chǔ)服務(wù)器性能優(yōu)化
- 機(jī)械硬盤 vs. 固態(tài)硬盤
- B+ 樹(shù) vs. LSM 樹(shù)
- RAID vs. HDFS
2、高可用
高可用的網(wǎng)站架構(gòu):目的是保證服務(wù)器硬件故障時(shí)服務(wù)依然可用、數(shù)據(jù)依然保存并能夠被訪問(wèn),主要手段數(shù)據(jù)和服務(wù)的冗余備份及失效轉(zhuǎn)移
- 高可用的應(yīng)用:顯著特點(diǎn)是應(yīng)用的無(wú)狀態(tài)性
- 通過(guò)負(fù)載均衡進(jìn)行無(wú)狀態(tài)服務(wù)的失效轉(zhuǎn)移
- 應(yīng)用服務(wù)器集群的 Session 管理
- 高可用的服務(wù):無(wú)狀態(tài)的服務(wù),可使用類似負(fù)載均衡的失效轉(zhuǎn)移策略,此外還有如下策略
- 超時(shí)設(shè)置
- 異步調(diào)用
- 服務(wù)降級(jí)
- 限流
- 高可用的數(shù)據(jù):主要手段是數(shù)據(jù)備份和失效轉(zhuǎn)移機(jī)制
- 失效確認(rèn)
- 訪問(wèn)轉(zhuǎn)移
- 數(shù)據(jù)恢復(fù)
- 冷備:缺點(diǎn)是不能保證數(shù)據(jù)最終一致和數(shù)據(jù)可用性
- 熱備:分為異步熱備和同步熱備
- 數(shù)據(jù)一致性(Consisitency)
- 數(shù)據(jù)可用性(Availibility)
- 分區(qū)耐受性(Partition Tolerance)
- CAP 原理
- 數(shù)據(jù)備份
- 軟件質(zhì)量保證
- 自動(dòng)化測(cè)試
- 預(yù)發(fā)布驗(yàn)證
- 灰度發(fā)布
- 網(wǎng)站實(shí)時(shí)監(jiān)控
- 警報(bào)系統(tǒng)
- 自動(dòng)優(yōu)雅降級(jí)
- 用戶行為日志采集(服務(wù)器端和客戶端)
- 服務(wù)器性能監(jiān)控
- 監(jiān)控?cái)?shù)據(jù)采集
- 監(jiān)控管理
3、伸縮性
大型網(wǎng)站需要面對(duì)大量用戶的高并發(fā)訪問(wèn)和存儲(chǔ)海量數(shù)據(jù),不可能只用一臺(tái)服務(wù)器就處理全部用戶請(qǐng)求,存儲(chǔ)全部數(shù)據(jù)。網(wǎng)站通過(guò)集群的方式將多臺(tái)服務(wù)器組成一個(gè)整體共同提供服務(wù)。所謂伸縮性是指通過(guò)不斷向集群中加入服務(wù)器的手段來(lái)緩解不斷上升的用戶并發(fā)訪問(wèn)壓力和不斷增長(zhǎng)的數(shù)據(jù)存儲(chǔ)需求。
衡量架構(gòu)伸縮性的主要標(biāo)準(zhǔn)就是是否可以用多臺(tái)服務(wù)器構(gòu)建集群,是否容易向集群中添加新的服務(wù)器。加入新的服務(wù)器后是否可以提供和原來(lái)的服務(wù)器無(wú)差別的服務(wù)。集群中可容納的總的服務(wù)器數(shù)量是否有限制。
對(duì)于應(yīng)用服務(wù)器集群,只要服務(wù)器上不保存數(shù)據(jù),所有服務(wù)器都是對(duì)等的,通過(guò)使用合適的負(fù)載均衡設(shè)備就可以向集群中不斷加入服務(wù)器。
對(duì)于緩存服務(wù)器集群,加入新的服務(wù)器可能會(huì)導(dǎo)致緩存路由失效,進(jìn)而導(dǎo)致集群中大部分緩存數(shù)據(jù)都無(wú)法訪問(wèn)。雖然緩存的數(shù)據(jù)可以通過(guò)數(shù)據(jù)庫(kù)重新預(yù)熱,但是如果應(yīng)用已經(jīng)嚴(yán)重依賴緩存,可能會(huì)導(dǎo)致整個(gè)網(wǎng)站崩潰。需要改進(jìn)緩存路由算法保證緩存數(shù)據(jù)的可訪問(wèn)性。
關(guān)系數(shù)據(jù)庫(kù)雖然支持?jǐn)?shù)據(jù)復(fù)制,主從熱備等機(jī)制,但是很難做到大規(guī)模集群的可伸縮性,因此關(guān)系數(shù)據(jù)庫(kù)的集群伸縮性方案必須在數(shù)據(jù)庫(kù)之外實(shí)現(xiàn),通過(guò)路由分區(qū)等手段將部署有多個(gè)數(shù)據(jù)庫(kù)的服務(wù)器組成一個(gè)集群。
至于大部分 NoSQL 數(shù)據(jù)庫(kù)產(chǎn)品,由于其先天就是為海量數(shù)據(jù)而生,因此其對(duì)伸縮性的支持通常都非常好,可以做到在較少運(yùn)維參與的情況下實(shí)現(xiàn)集群規(guī)模的線性伸縮。
概括起來(lái)伸縮性的分為如下幾個(gè)方面:
- 應(yīng)用服務(wù)器集群的伸縮性設(shè)計(jì)
- 輪詢(Round Robin, RR)
- 加權(quán)輪詢(Weighted Round Robin, WRR)
- 隨機(jī)(Random)
- 最少鏈接(Least Connections)
- 源地址散列(Source Hashing)
- DNS 域名解析負(fù)載均衡
- 反向代理負(fù)載均衡(在 HTTP 協(xié)議層面,應(yīng)用層負(fù)載均衡)
- IP 負(fù)載均衡(在內(nèi)核進(jìn)程完成數(shù)據(jù)分發(fā))
- 數(shù)據(jù)鏈路層負(fù)載均衡(數(shù)據(jù)鏈路層修改 mac 地址,三角傳輸模式,LVS)
- 分布式緩存集群的伸縮性設(shè)計(jì)
- Memcached 客戶端(包括 API,路由算法,服務(wù)器列表,通信模塊)
- Memcached 服務(wù)器集群
- 分布式緩存的一致性 Hash 算法(一致性 Hash 環(huán),虛擬層)
- 數(shù)據(jù)存儲(chǔ)服務(wù)集群的伸縮性設(shè)計(jì)
- 關(guān)系數(shù)據(jù)庫(kù)集群的伸縮性設(shè)計(jì)
- NoSQL 數(shù)據(jù)庫(kù)的伸縮性設(shè)計(jì)
4、可擴(kuò)展
系統(tǒng)架構(gòu)設(shè)計(jì)層面的“開(kāi)閉原則”,構(gòu)建可擴(kuò)展的網(wǎng)站架構(gòu)
- 利用分布式消息隊(duì)列降低耦合性
- 分布式消息隊(duì)列
- 事件驅(qū)動(dòng)架構(gòu)(Event Driven Architecture)
- 利用分布式服務(wù)打造可復(fù)用的業(yè)務(wù)平臺(tái)
- 分布式服務(wù)框架設(shè)計(jì)(Thrift,Dubbo)
- 可擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)(如 HBase的 ColumnFamily 設(shè)計(jì))
- 利用開(kāi)放平臺(tái)建設(shè)網(wǎng)站生態(tài)圈
5、網(wǎng)站的安全架構(gòu)
XSS 攻擊和 SQL 注入攻擊是構(gòu)成網(wǎng)站應(yīng)用攻擊最主要的兩種手段,此外還包括 CSRF,Session 劫持等手段。
對(duì)js轉(zhuǎn)義,使其失去執(zhí)行功能,只作為純字符串展示
防范:httpOnly;增加token校驗(yàn);通過(guò)Referer識(shí)別。
- 網(wǎng)站安全漏洞掃描
- CSRF 攻擊:跨站點(diǎn)請(qǐng)求偽造(Cross Site Request Forgery)
- Error Code
- 表單 Token
- 驗(yàn)證碼
- jsonp請(qǐng)求的,Referer 校驗(yàn)
- SQL 注入
- html 危險(xiǎn)字符轉(zhuǎn)義
- XSS 攻擊:跨站點(diǎn)腳本攻擊(Cross Site Script)
1、零基礎(chǔ)(沒(méi)有任何編程經(jīng)驗(yàn))
2、有前端基礎(chǔ)(HTML+CSS+JAVASCRIPT),沒(méi)有JAVA基礎(chǔ)
3、有前端基礎(chǔ)(HTML+CSS+JAVASCRIPT),有JAVA基礎(chǔ)(沒(méi)有相關(guān)工作經(jīng)驗(yàn))
4、有前端基礎(chǔ)(HTML+CSS+JAVASCRIPT),有JAVA工作經(jīng)驗(yàn)
5、沒(méi)有前端基礎(chǔ),有JAVA基礎(chǔ)(沒(méi)有相關(guān)工作經(jīng)驗(yàn)).群號(hào):433411063
6、沒(méi)有前端基礎(chǔ),有JAVA工作經(jīng)驗(yàn)