什么是軟件架構(gòu)
維基百科定義: 軟件架構(gòu)是指有關(guān)軟件整體結(jié)構(gòu)與組件的抽象描述,用于指導(dǎo)大型軟件系統(tǒng)各個(gè)方面的設(shè)計(jì) 。
軟件架構(gòu)5大要素:

- 性能
- 可用性
- 伸縮性
- 擴(kuò)展性
- 安全性
可以通過(guò)考察這5大要素來(lái)衡量一個(gè)軟件架構(gòu)設(shè)計(jì)的優(yōu)劣。
高性能
網(wǎng)站性能是客觀的指標(biāo),具體體現(xiàn)到 響應(yīng)時(shí)間 、 吞吐量 等技術(shù)指標(biāo)。
性能優(yōu)化的最終目的: 改善用戶體驗(yàn) 。
網(wǎng)站性能測(cè)試是性能優(yōu)化的前提和基礎(chǔ),也是性能優(yōu)化結(jié)果的檢查和度量標(biāo)準(zhǔn)。
下面從三個(gè)視角來(lái)看看網(wǎng)站性能的不同標(biāo)準(zhǔn):
用戶視角
網(wǎng)站響應(yīng)速度快慢(通信時(shí)間,處理時(shí)間、解析響應(yīng)數(shù)據(jù)的時(shí)間)。
開(kāi)發(fā)人員視角
關(guān)注程序本身及其相關(guān)子系統(tǒng)的性能,包括響應(yīng)延遲、系統(tǒng)吞吐量、并發(fā)處理能力、系統(tǒng)穩(wěn)定性等技術(shù)指標(biāo)。
運(yùn)維人員視角
關(guān)注基礎(chǔ)設(shè)施性能和資源利用率,如網(wǎng)絡(luò)運(yùn)營(yíng)商的帶寬能力、服務(wù)器硬件配置、數(shù)據(jù)中心網(wǎng)絡(luò)架構(gòu)、服務(wù)器和網(wǎng)路帶寬的資源利用率等。
性能測(cè)試指標(biāo)
網(wǎng)站性能測(cè)試的主要指標(biāo)主要有:
- 響應(yīng)時(shí)間:應(yīng)用執(zhí)行一個(gè)操作需要的時(shí)間(從發(fā)出請(qǐng)求開(kāi)始到收到最后響應(yīng)數(shù)據(jù)所需要的時(shí)間)。
- 并發(fā)數(shù):系統(tǒng)能夠同時(shí)處理請(qǐng)求的數(shù)目,反映了系統(tǒng)的負(fù)載特性。。
- 吞吐量:?jiǎn)挝粫r(shí)間內(nèi)系統(tǒng)處理的請(qǐng)求數(shù)量,體現(xiàn)系統(tǒng)的整體處理能力。存在一個(gè)極限值。
- TPS:每秒事務(wù)數(shù)
- HPS:每秒HTTP請(qǐng)求數(shù)
- QPS:每秒查詢數(shù)
- 性能計(jì)數(shù)器:描述服務(wù)器或操作系統(tǒng)的一些數(shù)據(jù)指標(biāo)。主要包括:
- System Load:系統(tǒng)負(fù)載,指當(dāng)前正在被CPU執(zhí)行和等待被CPU執(zhí)行的進(jìn)程數(shù)目總和(反映系統(tǒng)忙閑程度的重要指標(biāo))。
- 對(duì)象與線程數(shù)
- 內(nèi)存使用
- CPU使用
- 磁盤與網(wǎng)絡(luò)I/O
性能測(cè)試方法
性能測(cè)試是一個(gè)不斷對(duì)系統(tǒng)增加訪問(wèn)壓力,以 獲得系統(tǒng)性能指標(biāo)、最大負(fù)載能力、最大壓力承受能力的過(guò)程。性能測(cè)試主要包括以下幾種方法:
- 性能測(cè)試:對(duì)系統(tǒng)不斷施壓,驗(yàn)證系統(tǒng)在資源可以接受范圍內(nèi),是否能達(dá)到預(yù)期。
- 負(fù)載測(cè)試:對(duì)系統(tǒng)不斷增加并發(fā)請(qǐng)求,直到系統(tǒng)的某項(xiàng)或多項(xiàng)性能指標(biāo)達(dá)到安全臨界值。
- 壓力測(cè)試:在超過(guò)安全負(fù)載的情況下,對(duì)系統(tǒng)繼續(xù)施壓,直到系統(tǒng)崩潰或不能再處理請(qǐng)求,已獲得系統(tǒng)最大承受能力。
- 穩(wěn)定性測(cè)試:系統(tǒng)在特定的硬件、軟件、網(wǎng)路環(huán)境條件下,給系統(tǒng)加載一定壓力,使系統(tǒng)運(yùn)行一段較長(zhǎng)時(shí)間,以檢查系統(tǒng)是否穩(wěn)定。
性能分析與優(yōu)化
排查網(wǎng)站的性能瓶頸的方法:檢查請(qǐng)求處理的各個(gè)環(huán)節(jié)的日志,分析哪個(gè)環(huán)節(jié)響應(yīng)時(shí)間不合理、超過(guò)預(yù)期;然后檢查監(jiān)控?cái)?shù)據(jù),分析影響性能的主要因素是內(nèi)存、磁盤、網(wǎng)絡(luò)還是 CPU,時(shí)代嗎問(wèn)題還是架構(gòu)設(shè)置不合理,或者系統(tǒng)資源確實(shí)不足。
定位到了性能具體問(wèn)題后,然后根據(jù)性能產(chǎn)生的原因進(jìn)行性能優(yōu)化。性能優(yōu)化主要從三個(gè)方面進(jìn)行優(yōu)化:
- Web前端性能優(yōu)化
- 應(yīng)用服務(wù)器性能優(yōu)化
- 存儲(chǔ)服務(wù)器性能優(yōu)化
性能優(yōu)化策略
Web前端優(yōu)化
1. 瀏覽器訪問(wèn)優(yōu)化
- 減少HTTP請(qǐng)求:分別合并css、JS、圖片等資源,減少瀏覽器的請(qǐng)求次數(shù)。
- 使用瀏覽器緩存:瀏覽器將CSS、JS、圖標(biāo)等靜態(tài)資源緩存在瀏覽器中,那樣就不用每次都去請(qǐng)求服務(wù)器,可以極好地改善性能。設(shè)置HTTP頭中 Cache-Control 和 Expires 屬性。
- 啟用壓縮:在服務(wù)器端對(duì)文件進(jìn)行壓縮,在瀏覽器端對(duì)文件進(jìn)行解壓,可有效減少通信傳輸?shù)臄?shù)據(jù)量。壓縮比80%以上。壓縮和解壓縮會(huì)消耗服務(wù)器和瀏覽器所在的系統(tǒng)的CPU資源。
- CSS放在頁(yè)面最上面,JS放在頁(yè)面最下面:加載JS后會(huì)立即執(zhí)行,可能會(huì)阻塞頁(yè)面渲染。
- 減少Cookie傳輸:減少Cookie中傳輸?shù)臄?shù)據(jù)量,請(qǐng)求靜態(tài)資源沒(méi)有必要發(fā)送Cookie。
2. CDN加速
CDN(Content Distribute Network,內(nèi)容分發(fā)網(wǎng)絡(luò)),是指將數(shù)據(jù)緩存在離用戶最近的地方,使用戶以最快的速度獲取數(shù)據(jù),提升網(wǎng)頁(yè)的打開(kāi)速度。
CDN適合緩存 靜態(tài)資源 ,如圖片、文件、CSS、腳本、靜態(tài)文件等。
3. 反向代理
反向代理是指服務(wù)器根據(jù)客戶端的請(qǐng)求,從其關(guān)聯(lián)的一組或多組后端服務(wù)器上獲取資源,然后再將這些資源返回給客戶端,客戶端只會(huì)得知反向代理的IP地址,而不知道在代理服務(wù)器后面具體的真實(shí)服務(wù)器的存在。
反向代理的作用:
- 安全功能
- 通過(guò)緩存配置加速Web請(qǐng)求(靜態(tài)資源)
- 負(fù)載均衡,通過(guò)構(gòu)建集群,提高系統(tǒng)總體處理能力
應(yīng)用服務(wù)器優(yōu)化
1. 分布式緩存
網(wǎng)站性能優(yōu)化第一定律: 優(yōu)先考慮使用緩存優(yōu)化性能 。
原理:將數(shù)據(jù)存儲(chǔ)在訪問(wèn)速度較高的存儲(chǔ)介質(zhì)中,加快訪問(wèn)速度。
緩存作用:
- 緩存訪問(wèn)速度快,減少數(shù)據(jù)訪問(wèn)時(shí)間
- 緩存計(jì)算結(jié)果,節(jié)省計(jì)算的時(shí)間
合理使用緩存:
- 緩存讀寫比高,變化少的數(shù)據(jù)
- 盡量緩存熱點(diǎn)數(shù)據(jù)
- 確保數(shù)據(jù)有效性,根據(jù)業(yè)務(wù)場(chǎng)景,選擇是否能容忍數(shù)據(jù)一定時(shí)間內(nèi)不一致,還是及時(shí)更新
- 對(duì)緩存設(shè)置失效時(shí)間,緩存數(shù)據(jù)丟失或者不可用,會(huì)從數(shù)據(jù)庫(kù)直接獲取數(shù)據(jù)
- 緩存預(yù)熱:在緩存啟動(dòng)的時(shí)候就把熱點(diǎn)數(shù)據(jù)加載好。
- 避免緩存穿透:將不存的數(shù)據(jù)也緩存起來(lái)。
2. 異步操作
使用消息隊(duì)列將調(diào)用異步化,以改善網(wǎng)站的性能。
使用消息隊(duì)列后,用戶請(qǐng)求的數(shù)據(jù)發(fā)送給消息隊(duì)列后就立即返回,再由消息隊(duì)列的消費(fèi)者從消息隊(duì)列中獲取數(shù)據(jù),再進(jìn)行邏輯處理(如寫入數(shù)據(jù)庫(kù))。
3. 使用集群
使用負(fù)載均衡技術(shù)為應(yīng)用構(gòu)建一個(gè)由多臺(tái)服務(wù)器組成的服務(wù)器集群,將并發(fā)訪問(wèn)請(qǐng)求分發(fā)到多臺(tái)服務(wù)器上處理,避免單一服務(wù)器因負(fù)載壓力過(guò)大而響應(yīng)緩存,降低用戶請(qǐng)求響應(yīng)延遲,提升用戶體驗(yàn)。
4. 代碼優(yōu)化
代碼優(yōu)化主要關(guān)注以下幾個(gè)方面:
- 多線程:涉及線程安全問(wèn)題,多線程并發(fā)對(duì)某個(gè)資源進(jìn)行修改,解決辦法:
- 將對(duì)象設(shè)計(jì)為無(wú)狀態(tài)對(duì)象
- 使用局部對(duì)象
- 并發(fā)訪問(wèn)資源時(shí)使用鎖
- 資源復(fù)用:減少開(kāi)銷較大的系統(tǒng)資源的創(chuàng)建和銷毀,如數(shù)據(jù)庫(kù)連接、網(wǎng)絡(luò)通信連接、線程、復(fù)雜對(duì)象等。
- 單例(Singleton)
- 對(duì)象池(Object Pool)
- 數(shù)據(jù)結(jié)構(gòu)
- 垃圾回收
存儲(chǔ)性能優(yōu)化
磁盤是系統(tǒng)最嚴(yán)重的瓶頸。
1. 機(jī)械硬盤 & 固態(tài)硬盤
在網(wǎng)站應(yīng)用中,大部分應(yīng)用訪問(wèn)數(shù)據(jù)都是隨機(jī)的,機(jī)械硬盤由于需要移動(dòng)磁頭臂,所以性能較差。SSD具有更好的性能。
2. B+樹 & LSM樹
為了改善數(shù)據(jù)訪問(wèn)特性,文件系統(tǒng)或數(shù)據(jù)庫(kù)系統(tǒng)通常會(huì)對(duì)數(shù)據(jù)排序后存儲(chǔ),以加快檢索速度,這樣就需要保證數(shù)據(jù)在不斷更新、插入、刪除后依然有序。
傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)使用B+樹,B+樹是一種專門針對(duì)磁盤而優(yōu)化的N叉排序樹,以樹節(jié)點(diǎn)為單位存儲(chǔ)在磁盤中,從根開(kāi)始查找所需數(shù)據(jù)所在的節(jié)點(diǎn)編號(hào)和磁盤位置,將其加載到內(nèi)存中然后繼續(xù)查找,直到找到所需的數(shù)據(jù)。
LSM樹是一個(gè)N階合并樹。數(shù)據(jù)的插入、修改和刪除都是在內(nèi)存中進(jìn)行,并且都會(huì)創(chuàng)建一個(gè)新記錄,這些數(shù)據(jù)在內(nèi)存中以樹結(jié)構(gòu)排序,當(dāng)數(shù)據(jù)量超過(guò)設(shè)定的閾值后,會(huì)和磁盤上最新的的排序樹合并。在合并的過(guò)程中,會(huì)用最新更新的數(shù)據(jù)覆蓋舊的數(shù)據(jù)。讀操作先從內(nèi)存中排序樹開(kāi)始搜索,如未找到,再?gòu)拇疟P上排序樹順序查找。
在LSM樹上進(jìn)行一次數(shù)據(jù)更新不需要磁盤訪問(wèn),在內(nèi)存即可完成,速度遠(yuǎn)快于B+樹。
對(duì)于寫多,集中讀最近寫入數(shù)據(jù)的場(chǎng)景,使用LSM樹可以極大的減少磁盤的訪問(wèn)次數(shù),加快訪問(wèn)速度。
3. RAID & HDFS
RAID
廉價(jià)磁盤冗余陣列,主要是為了改善磁盤的訪問(wèn)延遲,增強(qiáng)磁盤的可用性和容錯(cuò)能力。
多塊磁盤通過(guò)使用RAID技術(shù),實(shí)現(xiàn)數(shù)據(jù)在多塊磁盤上的并發(fā)讀寫和數(shù)據(jù)備份。
常用RAID技術(shù):
- RAID0:在寫的時(shí)候,根據(jù)磁盤數(shù)量將數(shù)據(jù)分成N份,并發(fā)寫入N塊磁盤。在讀的時(shí)候,從N塊磁盤上并發(fā)讀。RAID0具有極快的數(shù)據(jù)讀取速度,但是未做備份。
- RAID1:數(shù)據(jù)寫入的時(shí)候,將一份數(shù)據(jù)同時(shí)寫入兩塊磁盤,一塊磁盤損壞不會(huì)導(dǎo)致數(shù)據(jù)丟失,插入新磁盤可以通過(guò)復(fù)制數(shù)據(jù)方式自動(dòng)修復(fù),可靠性高。
- RAID10:將所有磁盤平均分成兩份,數(shù)據(jù)同時(shí)在兩份磁盤寫入,結(jié)合RAID0和RAID1兩種方案,既提高了可靠性又改善了性能,但是RAID10的磁盤利用率較低,一般磁盤用來(lái)備份數(shù)據(jù)。
- RAID3:數(shù)據(jù)寫入的時(shí)候,將數(shù)據(jù)分成N-1份,并發(fā)寫入N-1塊磁盤,并在第N塊磁盤記錄校驗(yàn)數(shù)據(jù),任何一塊磁盤損壞(包括校驗(yàn)數(shù)據(jù)磁盤),都可以利用其它N-1塊磁盤的數(shù)據(jù)修復(fù)。在數(shù)據(jù)修改較多的場(chǎng)景,會(huì)導(dǎo)致第N塊磁盤頻繁重寫校驗(yàn)數(shù)據(jù),容易造成磁盤損壞,所以一般少在實(shí)踐中使用。
- RAID5:與RAID3類似,但是校驗(yàn)數(shù)據(jù)是螺旋寫入所有磁盤,避免頻繁寫一塊盤。
- RAID6:與RAID5類似,數(shù)據(jù)值寫入N-2塊磁盤,螺旋式地在兩塊磁盤中寫入校驗(yàn)信息(不同算法),數(shù)據(jù)可靠性最高。
HDFS
系統(tǒng)在整個(gè)存儲(chǔ)集群的多臺(tái)服務(wù)器上進(jìn)行數(shù)據(jù)并發(fā)讀寫和備份。HDFS以塊(Block)為單位管理文件內(nèi)容,一個(gè)文件被切分成多個(gè)Block,當(dāng)應(yīng)用程序?qū)懳募r(shí),每寫完一個(gè)Block,HDFS會(huì)將其自動(dòng)復(fù)制到另外兩臺(tái)機(jī)器上,保證3副本(默認(rèn))。在處理文件的時(shí)候(MapReduce),可以同時(shí)啟動(dòng)多個(gè)任務(wù)并行讀取文件的不同Block,并發(fā)處理,提升讀取效率。
HDFS配置MapReduce等并行計(jì)算框架進(jìn)行大數(shù)據(jù)處理時(shí),可以在整個(gè)集群上并發(fā)讀寫訪問(wèn)所有的磁盤安,無(wú)需RAID支持。
高可用
網(wǎng)站的可用性描述 網(wǎng)站可有效訪問(wèn) 的特性。
可用性度量:服務(wù)7*24可用,可用性超過(guò)99.99%。
網(wǎng)站不可用時(shí)間(故障時(shí)間) = 故障修復(fù)時(shí)間點(diǎn) - 故障發(fā)現(xiàn)(報(bào)告)時(shí)間點(diǎn) 網(wǎng)站年度可用性指標(biāo)=(1-網(wǎng)站不可用時(shí)間/年度總時(shí)間)*100%
硬件故障是常態(tài),網(wǎng)站的高可用架構(gòu)設(shè)計(jì)主要目的: 保證服務(wù)器硬件故障時(shí)服務(wù)依然可用、數(shù)據(jù)依然能保存并能被訪問(wèn) 。
高可用架構(gòu)的主要手段:數(shù)據(jù)和服務(wù) 冗余備份 及 失效轉(zhuǎn)移 。
一個(gè)典型的網(wǎng)站設(shè)計(jì)通常遵循三層架構(gòu)模型:
- 應(yīng)用層:負(fù)責(zé)具體業(yè)務(wù)邏輯處理
- 服務(wù)層:負(fù)責(zé)提供可復(fù)用的服務(wù)
- 數(shù)據(jù)層:負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)于訪問(wèn)
高可用的應(yīng)用
應(yīng)用的顯著特點(diǎn):無(wú)狀態(tài)性。
無(wú)狀態(tài)應(yīng)用是指應(yīng)用服務(wù)器不保存業(yè)務(wù)的上下文信息,僅根據(jù)每次請(qǐng)求提交的數(shù)據(jù)進(jìn)行相應(yīng)的業(yè)務(wù)邏輯處理。多個(gè)服務(wù)器實(shí)力之間完全對(duì)等,請(qǐng)求提交到任意服務(wù)器,處理結(jié)果都是完全一樣的。
通過(guò)負(fù)載均衡進(jìn)行無(wú)狀態(tài)服務(wù)的失效轉(zhuǎn)移
通過(guò)負(fù)載均衡手段,將流量和數(shù)據(jù)均勻分配到一個(gè)集群組成的多臺(tái)服務(wù)器上,以提高系統(tǒng)的整體負(fù)載處理能力。
應(yīng)用服務(wù)器集群的Session管理
Session管理手段:
1. Session復(fù)制應(yīng)用服務(wù)器開(kāi)啟Web容器的Session復(fù)制功能,在集群中的幾臺(tái)服務(wù)器之間同步Session對(duì)象,使得每臺(tái)服務(wù)器上都保存所有用戶的Session信息,這樣任何一臺(tái)機(jī)器宕機(jī)都不會(huì)導(dǎo)致Session數(shù)據(jù)的丟失。適合小規(guī)模集群。當(dāng)集群比較大時(shí),集群服務(wù)器間需要大量的通信進(jìn)行Session復(fù)制,會(huì)占用大量服務(wù)器和網(wǎng)絡(luò)資源。
2. Session綁定利用負(fù)載均衡的源地址Hash算法實(shí)現(xiàn),負(fù)載均衡服務(wù)器總是將來(lái)源于同一IP的請(qǐng)求分發(fā)到同一臺(tái)服務(wù)器上,也可以根據(jù)Cookie信息將同一個(gè)用戶的請(qǐng)求總是分發(fā)到同一臺(tái)機(jī)器上,這樣在整個(gè)會(huì)話期間沒(méi)用戶所有的請(qǐng)求都在同一臺(tái)服務(wù)器上處理,即Session綁定在某臺(tái)特定服務(wù)器上,又稱 會(huì)話黏滯 。
缺點(diǎn):不符合對(duì)系統(tǒng)高可用的需求,某臺(tái)服務(wù)器宕機(jī),那么該機(jī)器上的Session會(huì)丟失。很少使用。
3. 利用Cookie記錄Session
利用瀏覽器支持的Cookie記錄Session。每次請(qǐng)求的時(shí)候,將Session放在請(qǐng)求中發(fā)送到服務(wù)器,服務(wù)器處理完請(qǐng)求之后再將修改過(guò)的Session響應(yīng)給客戶端。
缺點(diǎn):受Cookie大小限制,記錄信息有限;每次請(qǐng)求都需傳輸Cookie,影響性能;如用戶關(guān)閉Cookie,訪問(wèn)就會(huì)異常。
4. Session服務(wù)器
利用獨(dú)立部署的Session服務(wù)器集群統(tǒng)一管理Session,應(yīng)用服務(wù)器每次讀寫Session時(shí),都訪問(wèn)Session服務(wù)器。
將應(yīng)用服務(wù)器的狀態(tài)分離,分為無(wú)狀態(tài)的應(yīng)用服務(wù)器和有狀態(tài)的Session服務(wù)器,針對(duì)這兩種服務(wù)器的不同特性分別設(shè)計(jì)其架構(gòu)。
Session服務(wù)器實(shí)現(xiàn):分布式緩存、數(shù)據(jù)庫(kù)等。
高可用的服務(wù)
高可用的服務(wù)模塊為業(yè)務(wù)產(chǎn)品提供 基礎(chǔ)公共服務(wù) ,一般是 獨(dú)立部署 。
高可用的服務(wù)策略:
1. 負(fù)載均衡
通過(guò)負(fù)載均衡的失效轉(zhuǎn)移策略實(shí)現(xiàn)高可用。
2. 分級(jí)管理
根據(jù)應(yīng)用和服務(wù)的重要程度進(jìn)行分級(jí)管理,不同重要程序的服務(wù)使用不同的硬件資源,越重要的的服務(wù)使用越好的硬件資源。核心服務(wù)和數(shù)據(jù)部署在不同地域的數(shù)據(jù)中心。
3. 超時(shí)設(shè)置
設(shè)置服務(wù)調(diào)用的超時(shí)時(shí)間,一旦超時(shí),通信框架拋出異常,應(yīng)用程序根據(jù)服務(wù)調(diào)度策略,選擇繼續(xù)重試或?qū)⒄?qǐng)求轉(zhuǎn)移到相同服務(wù)的其他服務(wù)器上。
4. 異步調(diào)用
應(yīng)用對(duì)服務(wù)的調(diào)用通過(guò)消息隊(duì)列等異步方式完成,避免一個(gè)服務(wù)失敗導(dǎo)致整個(gè)應(yīng)用請(qǐng)求失敗。
5. 服務(wù)降級(jí)
網(wǎng)站訪問(wèn)高峰期,服務(wù)可能因?yàn)榇罅康牟l(fā)調(diào)用而性能下降,嚴(yán)重時(shí)可能會(huì)導(dǎo)致服務(wù)宕機(jī)。為了保證核心應(yīng)用和功能的正常運(yùn)行,對(duì)服務(wù)進(jìn)行降級(jí)。
降級(jí)手段:
- 拒絕服務(wù):拒絕低優(yōu)先級(jí)應(yīng)用的調(diào)用,減少服務(wù)調(diào)用并發(fā)數(shù),確保核心應(yīng)用正常使用;或隨機(jī)拒絕部分請(qǐng)求調(diào)用,節(jié)約資源。
- 關(guān)閉服務(wù):關(guān)閉部分不重要的服務(wù),或者服務(wù)內(nèi)部關(guān)閉部分不重要的功能,節(jié)約系統(tǒng)開(kāi)銷,重要功能讓出資源。
6. 冪等性設(shè)計(jì)
服務(wù)層必須保證重復(fù)調(diào)用和調(diào)用一次產(chǎn)生的結(jié)果相同,即服務(wù)具有冪等性。
高可用的數(shù)據(jù)
1. CAP
為了保證數(shù)據(jù)的高可用,會(huì)犧牲 數(shù)據(jù)一致性 。
高可用的數(shù)據(jù)含義:
- 數(shù)據(jù)持久性:保證數(shù)據(jù)持久存儲(chǔ),不會(huì)出現(xiàn)數(shù)據(jù)丟失的問(wèn)題。
- 數(shù)據(jù)可訪問(wèn)性:在多份數(shù)據(jù)副本分別存放在不同存儲(chǔ)設(shè)備的情況下,一個(gè)數(shù)據(jù)存儲(chǔ)設(shè)備損壞需要將數(shù)據(jù)訪問(wèn)切換到其他數(shù)據(jù)存儲(chǔ)設(shè)備上。
- 數(shù)據(jù)一致性:多副本之間數(shù)據(jù)一致。
CAP原理:一個(gè)提供數(shù)據(jù)服務(wù)的存儲(chǔ)系統(tǒng)無(wú)法同時(shí)滿足 數(shù)據(jù)一致性(Consistency) 、 數(shù)據(jù)可用性(Availibility) 、**分區(qū)耐受性(Partition Tolerance,系統(tǒng)具有跨網(wǎng)絡(luò)分區(qū)的伸縮性)**這三個(gè)條件。
在大型網(wǎng)站應(yīng)用中,數(shù)據(jù)規(guī)模總是快速擴(kuò)張的,因此可伸縮即分區(qū)耐受性必不可少,規(guī)模變大以后,機(jī)器數(shù)量也會(huì)變得龐大,這是網(wǎng)路和服務(wù)器故障會(huì)頻繁吹安,要想保證應(yīng)用可用,就必須保證分布式處理系統(tǒng)的高可用。所以在大型網(wǎng)站中,通常會(huì)選擇強(qiáng)化分布式存儲(chǔ)系統(tǒng)的可用性(A)和伸縮性(P),而在某種程度上放棄一致性(C)。
數(shù)據(jù)不一致出現(xiàn)原因:系統(tǒng)高并發(fā)寫操作或者集群狀態(tài)不穩(wěn)定(故障恢復(fù)、集群擴(kuò)容)。
數(shù)據(jù)一致性分為:
- 數(shù)據(jù)強(qiáng)一致:各副本的數(shù)據(jù)在物理存儲(chǔ)中總是一致的;數(shù)據(jù)更新操作結(jié)果和操作響應(yīng)總是一致的,即操作響應(yīng)通知更新失敗,那么數(shù)據(jù)一定沒(méi)有被更新,而不是出于不確定狀態(tài)。
- 用戶數(shù)據(jù)一致:數(shù)據(jù)在物理存儲(chǔ)中的各個(gè)副本的數(shù)據(jù)可能是不一致的,但終端用戶訪問(wèn)時(shí),通過(guò)糾錯(cuò)和校驗(yàn)機(jī)制,可以確定一個(gè)一直的且正確的數(shù)據(jù)返回給用戶。
- 數(shù)據(jù)最終一致:物理存儲(chǔ)的數(shù)據(jù)可能不一致,終端用戶訪問(wèn)到數(shù)據(jù)可能不一致,但系統(tǒng)經(jīng)過(guò)一段時(shí)間的自我恢復(fù)和修正,數(shù)據(jù)最終達(dá)到一直。
保證數(shù)據(jù)存儲(chǔ)高可用的手段:
2. 數(shù)據(jù)備份
保證數(shù)據(jù)有多個(gè)副本,任意副本的失效都不會(huì)導(dǎo)致數(shù)據(jù)的永久丟失,從而實(shí)現(xiàn)數(shù)據(jù)完全的持久化。
數(shù)據(jù)備份方式:
- 冷備:簡(jiǎn)單、廉價(jià)、成本和技術(shù)難度低。缺點(diǎn)不能保證數(shù)據(jù)最終一致。
- 熱備:
- 異步熱備:多份數(shù)據(jù)副本的寫入操作異步完成。
- 同步熱備:多份數(shù)據(jù)副本的下入操作同步完成。
3. 失效轉(zhuǎn)移機(jī)制
保證當(dāng)一個(gè)數(shù)據(jù)副本不可訪問(wèn)時(shí),可以快速切換訪問(wèn)數(shù)據(jù)的其他副本,保證系統(tǒng)可用。
失效轉(zhuǎn)移操作組成:
- 失效確認(rèn):通過(guò) 心跳檢測(cè) 和 應(yīng)用程序訪問(wèn)失敗報(bào)告 判斷服務(wù)器是否宕機(jī)
- 訪問(wèn)轉(zhuǎn)移:將數(shù)據(jù)的讀寫訪問(wèn)重新路由到其他服務(wù)器(不路由到宕機(jī)的服務(wù)器)
- 數(shù)據(jù)恢復(fù):從健康的服務(wù)器復(fù)制數(shù)據(jù),將數(shù)據(jù)副本數(shù)目恢復(fù)到設(shè)定值
高可用網(wǎng)站的軟件質(zhì)量保證
為了保證線上系統(tǒng)的可用性采取的一些質(zhì)量保證手段:
- 網(wǎng)站發(fā)布:每次關(guān)閉服務(wù)器中的一小部分,并在發(fā)布完成后立即可以訪問(wèn)。
- 自動(dòng)化測(cè)試:Selenium自動(dòng)化測(cè)試工具。
- 預(yù)發(fā)布驗(yàn)證:先發(fā)布到預(yù)發(fā)布機(jī)器上,然后進(jìn)行預(yù)發(fā)布驗(yàn)證,驗(yàn)證典型的業(yè)務(wù)流程,確認(rèn)沒(méi)有問(wèn)題后正式發(fā)布。
- 代碼控制:主干開(kāi)發(fā)、分支發(fā)布;分支開(kāi)發(fā),主干發(fā)布。工具:SVN,Git。
- 自動(dòng)化發(fā)布:火車發(fā)布模型。
- 灰度發(fā)布:將集群服務(wù)器分成若干部分,每天只發(fā)布一部分服務(wù)器,觀察運(yùn)行是否穩(wěn)定,第二天繼續(xù)發(fā)布一部分服務(wù)器。
網(wǎng)站運(yùn)行監(jiān)控
監(jiān)控?cái)?shù)據(jù)采集
- 用戶行為日志收集
- 服務(wù)器端日志收集
- 客戶端瀏覽器日志收集
- 服務(wù)器性能監(jiān)控
- 系統(tǒng)Load
- 內(nèi)存占用
- 磁盤
- 網(wǎng)絡(luò)IO
- 運(yùn)行數(shù)據(jù)報(bào)告:監(jiān)控一些與具體業(yè)務(wù)場(chǎng)景相關(guān)的技術(shù)和業(yè)務(wù)指標(biāo)。
監(jiān)控管理
需要根據(jù)實(shí)時(shí)監(jiān)控?cái)?shù)據(jù)進(jìn)行風(fēng)險(xiǎn)預(yù)警,并對(duì)服務(wù)器進(jìn)行失效轉(zhuǎn)移,自動(dòng)負(fù)載調(diào)整,最大化利用集群所有機(jī)器資源。
- 系統(tǒng)報(bào)警:對(duì)超過(guò)閾值的指標(biāo)進(jìn)行報(bào)警,如郵件、短信、語(yǔ)音等。
- 失效轉(zhuǎn)移:發(fā)現(xiàn)故障主動(dòng)通知應(yīng)用,進(jìn)行失效轉(zhuǎn)移。
- 自動(dòng)優(yōu)雅降級(jí):為應(yīng)對(duì)訪問(wèn)高峰,主動(dòng)關(guān)閉部分功能,釋放部分系統(tǒng)資源,保證網(wǎng)站核心功能正常訪問(wèn)。
可伸縮
伸縮性是指通過(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ù)量是否有限制
網(wǎng)站的伸縮性設(shè)計(jì)分類
網(wǎng)站的伸縮性設(shè)計(jì)主要分成以下兩類:
1. 根據(jù)功能進(jìn)行物理分離實(shí)現(xiàn)伸縮
通過(guò)物理上分離不同的網(wǎng)站功能,實(shí)現(xiàn)網(wǎng)站伸縮性的手段,可以在網(wǎng)站發(fā)展的任何階段使用。不同服務(wù)器部署不同的服務(wù),提供不同的功能。
分離主要分為兩種情況:
- 縱向分離(分層后分離):將業(yè)務(wù)處理流程上的不同部分分離部署,實(shí)現(xiàn)系統(tǒng)伸縮性。
- 橫向分離(業(yè)務(wù)分割后分離):將不同的業(yè)務(wù)模塊分離部署,實(shí)現(xiàn)系統(tǒng)伸縮性。
2. 單一功能通過(guò)集群實(shí)現(xiàn)伸縮
隨著網(wǎng)站訪問(wèn)量的逐步增加,單一的服務(wù)器也不同滿足業(yè)務(wù)規(guī)模的要求,需要使用服務(wù)器集群,將相同服務(wù)部署在多臺(tái)服務(wù)器上構(gòu)成一個(gè)集群整體對(duì)外提供服務(wù)。
應(yīng)用服務(wù)器集群的伸縮性設(shè)計(jì)
負(fù)載均衡技術(shù)
1. HTTP重定向負(fù)載均衡
利用HTTP重定向協(xié)議實(shí)現(xiàn)負(fù)載均衡。
HTTP重定向服務(wù)器會(huì)根據(jù)用戶的HTTP請(qǐng)求計(jì)算一臺(tái)真實(shí)的Web服務(wù)器地址,并將該Web服務(wù)器地址寫入HTTP重定向響應(yīng)(響應(yīng)狀態(tài)碼302)中返回給用戶瀏覽器,瀏覽器自動(dòng)重新請(qǐng)求實(shí)際物理服務(wù)器。
優(yōu)缺點(diǎn):
- 優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單
- 缺點(diǎn):瀏覽器需要兩次請(qǐng)求服務(wù)器才能完成一次訪問(wèn),性能較差;重定向服務(wù)器自身處理能力會(huì)成為瓶頸;使用302重定向,可能會(huì)讓搜索引擎判斷為seo作弊,降低搜索排名。
HTTP重定向負(fù)載均衡在實(shí)際生產(chǎn)環(huán)境中很少使用。
2. DNS域名解析負(fù)載均衡
通過(guò)DNS處理域名解析請(qǐng)求的同時(shí)進(jìn)行負(fù)載均衡處理的一種方案。
每次域名解析請(qǐng)求都會(huì)根據(jù)負(fù)載均衡算法計(jì)算一個(gè)不同的IP地址返回,可以將請(qǐng)求分布到多臺(tái)服務(wù)器上,實(shí)現(xiàn)負(fù)載均衡。
優(yōu)缺點(diǎn):
- 優(yōu)點(diǎn):將負(fù)載均衡的工作轉(zhuǎn)交給DNS,省去了網(wǎng)站管理維護(hù)負(fù)載服務(wù)器的麻煩;DNS還支持基于地理位置的域名解析,會(huì)將域名解析成距離用戶地理最近的一個(gè)服務(wù)器地址,從而加快用戶訪問(wèn)速度,改善性能。
- 缺點(diǎn):DNS是多級(jí)解析,每級(jí)DNS都會(huì)緩存服務(wù)器配置,修改了DNS配置,需要較長(zhǎng)時(shí)間才能生效。
DNS域名解析一般作為第一級(jí)負(fù)載均衡。
3. 反向代理負(fù)載均衡
利用反向代理服務(wù)器進(jìn)行負(fù)載均衡。
優(yōu)缺點(diǎn):
- 優(yōu)點(diǎn):和代理服務(wù)器集成簡(jiǎn)單
- 缺點(diǎn):反向代理服務(wù)器是所有請(qǐng)求和響應(yīng)的中轉(zhuǎn)站,其性能可能會(huì)成為瓶頸。
4. IP負(fù)載均衡
在網(wǎng)絡(luò)層通過(guò)修改請(qǐng)求目標(biāo)地址進(jìn)行負(fù)載均衡。在內(nèi)核進(jìn)程中完成數(shù)據(jù)分發(fā),性能較好。集群的最大響應(yīng)數(shù)據(jù)吞吐量受制于負(fù)載均衡服務(wù)器網(wǎng)卡帶寬。
5. 數(shù)據(jù)鏈路層負(fù)載均衡
在通信協(xié)議的數(shù)據(jù)鏈路層修改mac地址進(jìn)行負(fù)載均衡。linux平臺(tái)最好的鏈路層負(fù)載均衡開(kāi)源產(chǎn)品 LVS 。
負(fù)載均衡算法
1. 輪詢(Round Robin,RR)
所有請(qǐng)求被依次分發(fā)到每臺(tái)應(yīng)用服務(wù)器上,即每臺(tái)服務(wù)器需要處理的請(qǐng)求數(shù)目都相同,適合于所有服務(wù)器硬件都相同的場(chǎng)景。
2. 加權(quán)輪詢(Weight Round Robin,WRR)
根據(jù)應(yīng)用服務(wù)器硬件性能的情況,在輪詢的基礎(chǔ)上,按照配置的權(quán)重將請(qǐng)求分發(fā)到每個(gè)服務(wù)器,性能高的服務(wù)器分配更多請(qǐng)求。
3. 隨機(jī)(Random)
請(qǐng)求被隨機(jī)分配到各個(gè)應(yīng)用服務(wù)器。實(shí)現(xiàn)簡(jiǎn)單。
4. 最少連接(Least Connections)
記錄每個(gè)應(yīng)用服務(wù)器正在處理的連接數(shù)(請(qǐng)求數(shù)),將新到的請(qǐng)求分發(fā)到最少連接的服務(wù)器上。最符合負(fù)載均衡定義的算法。
5. 源地址散列(Source Hashing)
根據(jù)請(qǐng)求來(lái)源IP地址進(jìn)行Hash計(jì)算,得到應(yīng)用服務(wù)器,這樣來(lái)自同一個(gè)IP地址的請(qǐng)求總在同一個(gè)服務(wù)器上處理,該請(qǐng)求的上下文信息可以存儲(chǔ)在這臺(tái)服務(wù)器上,在一個(gè)會(huì)話內(nèi)重復(fù)使用,從而實(shí)現(xiàn)會(huì)話黏滯。
分布式緩存集群的伸縮性設(shè)計(jì)
分布式緩存服務(wù)器集群中不同服務(wù)器中緩存的數(shù)據(jù)各不相同,緩存訪問(wèn)請(qǐng)求不可以在緩存服務(wù)器集群中的任意一臺(tái)處理,必須先找到緩存有需要數(shù)據(jù)的服務(wù)器,然后才能訪問(wèn)。
緩存的目的: 加速數(shù)據(jù)讀取的速度 并 減輕數(shù)據(jù)存儲(chǔ)服務(wù)器的負(fù)載壓力 。
分布式緩存集群伸縮性設(shè)計(jì)的主要目標(biāo):新加入緩存服務(wù)器應(yīng)使整個(gè)緩存服務(wù)器集群中已經(jīng)緩存的數(shù)據(jù)盡可能還被訪問(wèn)到。
一致性哈希算法
一致性Hash算法通過(guò)一致性Hash環(huán)的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)Key到緩存服務(wù)器的Hash映射。
算法過(guò)程:先構(gòu)造一個(gè)長(zhǎng)度為 0~的整數(shù)環(huán)(一致性Hash環(huán)),根據(jù)節(jié)點(diǎn)名稱的Hash值( 范圍0~)將緩存服務(wù)器節(jié)點(diǎn)放置在這個(gè)Hash環(huán)上。然后根據(jù)需要緩存的數(shù)據(jù)的Key值計(jì)算得到其Hash值,然后再Hash環(huán)上順時(shí)針找距離這個(gè)Key的Hash值(范圍 0~)最近的緩存服務(wù)節(jié)點(diǎn),完成Key到服務(wù)器的Hash映射查找。
擴(kuò)容的時(shí)候,將新加入的節(jié)點(diǎn)的Hash放入一致性Hash環(huán)中,由于Key是順時(shí)針查找距離最近的節(jié)點(diǎn),因此新加入的節(jié)點(diǎn)只影響整個(gè)換中的一小段。
解決一致性Hash算法帶來(lái)的負(fù)載不均衡的問(wèn)題
將每臺(tái)物理緩存服務(wù)器虛擬為一組虛擬緩存服務(wù)器,將虛擬服務(wù)器的Hash值放置在Hash環(huán)上,Key在換上先找到虛擬服務(wù)器節(jié)點(diǎn),在得到物理服務(wù)器的信息。這樣新加入的物理服務(wù)器節(jié)點(diǎn)是一組虛擬節(jié)點(diǎn),如果虛擬節(jié)點(diǎn)足夠多的,這組虛擬節(jié)點(diǎn)將會(huì)影響同樣多數(shù)目的已經(jīng)在環(huán)上存在的虛擬節(jié)點(diǎn)。
物理節(jié)點(diǎn)對(duì)應(yīng)的虛擬節(jié)點(diǎn)越多,各個(gè)物理節(jié)點(diǎn)之間的負(fù)載越均衡,新加入物理服務(wù)器對(duì)原有的物理服務(wù)器的影響越保持一致。
根據(jù)經(jīng)驗(yàn),一臺(tái)物理服務(wù)器虛擬為150個(gè)虛擬服務(wù)器節(jié)點(diǎn)。
數(shù)據(jù)存儲(chǔ)服務(wù)器集群的伸縮性設(shè)計(jì)
數(shù)據(jù)存儲(chǔ)層必須保證數(shù)據(jù)的可靠存儲(chǔ),任何情況下都必須保證數(shù)據(jù)的 可用性 和 正確性 。
1. 關(guān)系數(shù)據(jù)庫(kù)集群的伸縮性設(shè)計(jì)
架構(gòu)設(shè)計(jì):主從架構(gòu)、主從讀寫分離、主從復(fù)制、分庫(kù)
分庫(kù):不同業(yè)務(wù)數(shù)據(jù)表部署在不同的數(shù)據(jù)庫(kù)集群上。缺點(diǎn):夸庫(kù)不能Join。
2. NoSQL數(shù)據(jù)庫(kù)的伸縮性設(shè)計(jì)
NoSQL數(shù)據(jù)庫(kù)產(chǎn)品都放棄了關(guān)鍵數(shù)據(jù)庫(kù)的兩大重要基礎(chǔ):
- 以關(guān)系代數(shù)為基礎(chǔ)的結(jié)構(gòu)化查詢語(yǔ)言(SQL)
- 事務(wù)一致性保證(ACID)
NoSQL更關(guān)注: 高可用性 和 可伸縮性
可擴(kuò)展
軟件設(shè)計(jì)的終極目標(biāo): 低耦合 系統(tǒng)。
低耦合系統(tǒng)更容易擴(kuò)展,低耦合模塊更容易復(fù)用,低耦合的系統(tǒng)設(shè)計(jì)會(huì)讓開(kāi)發(fā)過(guò)程和維護(hù)變得更加輕松和容易管理。
主要目的:網(wǎng)站的架構(gòu)能夠快速響應(yīng)需求變化。
可擴(kuò)展架構(gòu)的核心思想: 模塊化,并在此基礎(chǔ)之上,降低模塊間的耦合性,提高模塊的復(fù)用性。
衡量標(biāo)準(zhǔn):網(wǎng)站增加新的業(yè)務(wù)產(chǎn)品時(shí),是否可以實(shí)現(xiàn)對(duì)現(xiàn)有產(chǎn)品透明無(wú)影響,不需要任何改動(dòng)或者很少鈣能既有業(yè)務(wù)功能就可以上線新產(chǎn)品。不同產(chǎn)品之間低耦合。
網(wǎng)站可伸縮架構(gòu)主要手段是 事件驅(qū)動(dòng)架構(gòu) 和 分布式服務(wù) 。
利用分布消息隊(duì)列降低系統(tǒng)耦合性
事件驅(qū)動(dòng)架構(gòu)
事件驅(qū)動(dòng)架構(gòu)(Event Driven Architecture):通過(guò)在低耦合的模塊之間傳輸事件消息,以保持模塊的松散耦合,并借助事件消息的通信完成模塊間合作。如生產(chǎn)者消費(fèi)者模式。
常用的事件驅(qū)動(dòng)架構(gòu):分布式消息隊(duì)列。
利用消息隊(duì)列,將用戶請(qǐng)求和其他業(yè)務(wù)事件構(gòu)造成消息發(fā)布到消息隊(duì)列,消息的處理者作為消費(fèi)者從消息隊(duì)列中獲取消息進(jìn)行處理。通過(guò)這種方式將消息產(chǎn)生和消息處理分離開(kāi)來(lái),可以透明地增加新的消息生產(chǎn)者任務(wù)或者新的消息消費(fèi)者任務(wù)。
分布式消息隊(duì)列
消息 生產(chǎn)者 應(yīng)用程序通過(guò)遠(yuǎn)程訪問(wèn)接口將 消息 推送 給 消息隊(duì)列服務(wù)器 ,消息隊(duì)列服務(wù)器將消息寫入本地內(nèi)存隊(duì)列后即立即返回成功響應(yīng)給消息生產(chǎn)者。消息隊(duì)列服務(wù)器根據(jù)消息訂閱列表查找訂閱該消息的消息消費(fèi)者應(yīng)用程序,將消息隊(duì)列中的消息按照 先進(jìn)先出 的原則將 消息通過(guò)遠(yuǎn)程通信接口發(fā)送給消息 消費(fèi)者 程序。
利用分布式服務(wù)打造可復(fù)用的業(yè)務(wù)平臺(tái)
將業(yè)務(wù)和可復(fù)用服務(wù)分離開(kāi)來(lái),通過(guò)分布式服務(wù)框架調(diào)用。
巨無(wú)霸應(yīng)用存在問(wèn)題:
- 編譯、部署困難
- 代碼分支管理困難
- 數(shù)據(jù)庫(kù)連接耗盡
- 新增業(yè)務(wù)困難
解決方案就是 拆分 ,將模塊獨(dú)立部署,降低系統(tǒng)耦合性。
- 縱向拆分:將一個(gè)大應(yīng)用拆分為多個(gè)小應(yīng)用,如果新增業(yè)務(wù)比較獨(dú)立,那么就直接將其部署為一個(gè)獨(dú)立的應(yīng)用系統(tǒng)。
- 橫向拆分:將復(fù)用的業(yè)務(wù)拆分開(kāi)來(lái),獨(dú)立部署為分布式服務(wù),新增業(yè)務(wù)只需調(diào)用這些分布式服務(wù),不需要依賴具體的模塊代碼。
大型網(wǎng)站分布式服務(wù)的需求和特點(diǎn)
- 服務(wù)注冊(cè)與發(fā)現(xiàn)
- 服務(wù)調(diào)用
- 負(fù)載均衡
- 失效轉(zhuǎn)移
- 高效的遠(yuǎn)程通信
- 整合異構(gòu)系統(tǒng)
- 對(duì)應(yīng)用最少侵入
- 版本管理
- 實(shí)時(shí)監(jiān)控
利用開(kāi)放平臺(tái)建設(shè)網(wǎng)站生態(tài)圈
- API接口:Restful、WebService、RPC等
- 協(xié)議轉(zhuǎn)換:將各種API輸入轉(zhuǎn)換成內(nèi)部服務(wù)可以識(shí)別的形式,并將內(nèi)部服務(wù)的返回封裝成API的格式。
- 安全:身份識(shí)別、權(quán)限控制、分級(jí)的訪問(wèn)帶寬限制。
- 審計(jì):記錄第三方應(yīng)用的訪問(wèn)情況,并進(jìn)行監(jiān)控、計(jì)費(fèi)等。
- 路由:將開(kāi)放平臺(tái)的耕種訪問(wèn)路由映射到具體的內(nèi)部服務(wù)。
- 流程:將一組離散的服務(wù)組織成一個(gè)上下文相關(guān)的新服務(wù),隱藏服務(wù)細(xì)節(jié),提供統(tǒng)一接口供開(kāi)發(fā)者調(diào)用。
安全性
安全性是指保護(hù)網(wǎng)站不受惡意訪問(wèn)和攻擊,保護(hù)網(wǎng)站的重要數(shù)據(jù)不被竊取。
衡量標(biāo)準(zhǔn):針對(duì)現(xiàn)存和潛在的各種攻擊與竊密手段,是否有可靠的應(yīng)對(duì)策略。
網(wǎng)站攻擊和防御
XSS攻擊
XSS攻擊即 跨站點(diǎn)腳本攻擊 (Cross Site Script),指黑客通過(guò)篡改網(wǎng)頁(yè),注入惡意html腳本,在用戶瀏覽網(wǎng)頁(yè)時(shí),控制用戶瀏覽器進(jìn)行惡意操作的一種攻擊方式。常見(jiàn)攻擊類型有:
- 反射型:攻擊者誘使用戶點(diǎn)擊一個(gè)嵌入惡意腳本的連接,達(dá)到攻擊目的。
- 持久型:黑客提交含有惡意腳本的請(qǐng)求,保存在被攻擊的Web站點(diǎn)的數(shù)據(jù)庫(kù)中,用戶瀏覽網(wǎng)頁(yè)時(shí),惡意腳本被包含在正常頁(yè)面中,達(dá)到攻擊的目的。
XSS防攻擊手段:
- 消毒:對(duì)html危險(xiǎn)字符進(jìn)行轉(zhuǎn)義。消毒幾乎是所有網(wǎng)站最必備的XSS防攻擊手段。
- HttpOnly:瀏覽器進(jìn)制頁(yè)面JAVAScript訪問(wèn)帶有HttpOnly屬性的Cookie。HttpOnly主要是防止XSS攻擊者竊取Cookie。
注入攻擊
注入攻擊主要由 SQL注入攻擊 和 OS注入攻擊 兩種。
SQL注入攻擊
攻擊者在HTTP請(qǐng)求中注入惡意SQL命令,服務(wù)器用請(qǐng)求參數(shù)構(gòu)造數(shù)據(jù)庫(kù)SQL命令(如刪除數(shù)據(jù)庫(kù)表)時(shí),惡意SQL被一起構(gòu)造,并在數(shù)據(jù)庫(kù)中執(zhí)行。
SQL注入攻擊前提:攻擊者需要對(duì)要攻擊的數(shù)據(jù)庫(kù)結(jié)構(gòu)有所了解。
攻擊者獲取數(shù)據(jù)庫(kù)表結(jié)構(gòu)信息手段:
- 開(kāi)源:開(kāi)源軟件搭建的網(wǎng)站數(shù)據(jù)結(jié)構(gòu)是公開(kāi)的。
- 錯(cuò)誤回顯:攻擊者可以通過(guò)服務(wù)端返回的異常信息,猜測(cè)數(shù)據(jù)庫(kù)表結(jié)構(gòu)。
- 盲注:攻擊者根據(jù)頁(yè)面變化情況判斷SQL語(yǔ)句的執(zhí)行情況,猜測(cè)數(shù)據(jù)庫(kù)表結(jié)構(gòu)。
防御
首先應(yīng)避免被攻擊者猜測(cè)到表名等數(shù)據(jù)庫(kù)表結(jié)構(gòu)信息。
除此之外還有以下兩種方式:
- 消毒:通過(guò)正則匹配過(guò)濾請(qǐng)求數(shù)據(jù)中可能注入的SQL。請(qǐng)求參數(shù)消毒是一種比較簡(jiǎn)單粗暴又有效的手段。
- 參數(shù)綁定:使用預(yù)編譯手段,綁定參數(shù)是最好的防SQL注入方法。
CSRF攻擊
CSRF(Cross Site Request Forgery, 跨站點(diǎn)請(qǐng)求偽造 ),指的是攻擊者通過(guò)跨站請(qǐng)求,以合法用戶的身份進(jìn)行非法操作,如轉(zhuǎn)賬交易、發(fā)表評(píng)論等。
CSRF攻擊的主要手法:利用跨站請(qǐng)求,在用戶不知情的情況下,以用戶的身份偽造請(qǐng)求。
核心是利用了瀏覽器Cookie或服務(wù)器Session策略,盜取用戶身份。
CSRF攻擊防御主要手段是 識(shí)別請(qǐng)求者身份 。主要有下面幾種方法:
- 表單Token:通過(guò)在請(qǐng)求參數(shù)中增加隨機(jī)數(shù)的方法來(lái)阻止攻擊者獲得所有請(qǐng)求參數(shù)。正常請(qǐng)求會(huì)包含token隨機(jī)數(shù),每次請(qǐng)求都不一樣,偽造請(qǐng)求無(wú)法獲得該值,服務(wù)器檢查請(qǐng)求參數(shù)中token的值是否存在并且正確以確定請(qǐng)求提交者是否合法。
- 驗(yàn)證碼:在請(qǐng)求提交時(shí),需要用戶輸入驗(yàn)證碼,以避免在用戶不知情的情況下被攻擊者偽造請(qǐng)求。但是輸入驗(yàn)證碼是一個(gè)很糟糕的用戶體驗(yàn)。
- Referer Check:通過(guò)檢查HTTP請(qǐng)求的Referer域中記錄的請(qǐng)求來(lái)源,驗(yàn)證其是否合法。常見(jiàn)場(chǎng)景如:圖片防盜鏈。
其他攻擊和漏洞
1. Error Code
錯(cuò)誤回顯,指的是服務(wù)器端未處理異常堆棧信息直接輸出到客戶端瀏覽器。
防御:配置web服務(wù)器參數(shù),跳轉(zhuǎn)500頁(yè)面到指定的錯(cuò)誤頁(yè)面,避免將異常堆棧信息直接返回給用戶。
2. HTML注釋
在瀏覽器中是可以看到HTML代碼中注釋的部分,這樣會(huì)給黑客造成攻擊便利。
防御:程序在最終發(fā)布前需要進(jìn)行代碼review或自動(dòng)掃描,避免HTML注釋漏洞。
3. 文件上傳
攻擊方式:上傳一個(gè)可執(zhí)行的程序,并通過(guò)該程序獲得服務(wù)器端命令執(zhí)行能力。
防御:設(shè)置上傳文件白名單,只允許上傳可靠的文件類型。此外還可以修改文件名、使用專門的存儲(chǔ)等手段,保護(hù)服務(wù)器免受上傳文件攻擊。
4. 路徑遍歷
攻擊方式:攻擊者在請(qǐng)求的URL中使用相對(duì)路徑,遍歷系統(tǒng)為開(kāi)放的目錄和文件。
防御:將JS、CSS等資源文件部署在獨(dú)立服務(wù)器,使用獨(dú)立域名,其他文件不適用靜態(tài)URL訪問(wèn),動(dòng)態(tài)參數(shù)不包含文件路徑信息。
信息加密技術(shù)及密鑰安全管理
為了保護(hù)網(wǎng)站的敏感數(shù)據(jù),需要對(duì)這些敏感數(shù)據(jù)進(jìn)行加密處理,信息加密技術(shù)分為三類:
單向散列加密
通過(guò)對(duì)不同輸入長(zhǎng)度的信息進(jìn)行散列計(jì)算,得到固定長(zhǎng)度的輸出,散列計(jì)算是單向的,即不能對(duì)固定長(zhǎng)度的輸出進(jìn)行計(jì)算從而獲得輸入信息。
使用場(chǎng)景:密碼加密保存,生成信息摘要,計(jì)算具有高離散程度的隨機(jī)數(shù)等。
常用單向散列算法:MD5、SHA等。
對(duì)稱加密
加密和解密使用的密鑰是同一密鑰(或者可以互相推算)。
使用場(chǎng)景:Cookie加密,通信加密等。
優(yōu)缺點(diǎn):
- 優(yōu)點(diǎn):算法簡(jiǎn)單,加密效率高,系統(tǒng)開(kāi)銷小,適合對(duì)大量數(shù)據(jù)加密。
- 缺點(diǎn):加解密使用同一個(gè)密鑰。
常用對(duì)稱加密算法:DES、RC算法。
非對(duì)稱加密
加密和解密使用的密鑰不同,其中一個(gè)對(duì)外界公開(kāi),叫做 公鑰 ,另一個(gè)只有所有者知道,被稱為 私鑰 。用公鑰加密的信息必須用私鑰才能解開(kāi),反之,用私鑰加密的信息只有公鑰才能解開(kāi)。理論上不可能通過(guò)公鑰計(jì)算獲得私鑰。
使用場(chǎng)景:信息安全傳輸,數(shù)字簽名等。
常用非對(duì)稱加密算法:RSA算法。
HTTPS傳輸中瀏覽器使用的數(shù)字證書就是經(jīng)過(guò)權(quán)威機(jī)構(gòu)認(rèn)證的非對(duì)稱加密的公鑰。
信息過(guò)濾與反垃圾
常用的信息過(guò)濾與反垃圾手段有以下幾種:
文本匹配
主要用來(lái)解決敏感詞過(guò)濾問(wèn)題。
快速判斷信息中是否包含敏感詞方法:
- 正則匹配:適用于敏感詞較少,信息文本較短場(chǎng)景。正則表達(dá)式的效率一般較差。
- Trie樹及變種:算法本質(zhì)是確定一個(gè)有限狀態(tài)的自動(dòng)機(jī),根據(jù)輸入數(shù)據(jù)進(jìn)行狀態(tài)轉(zhuǎn)移。
分類算法
算法原理:先將批量已經(jīng)分好類的樣本數(shù)據(jù)輸入分類算法進(jìn)行訓(xùn)練,可以得到一個(gè)分類模型,然后再利用分類算法結(jié)合分類模型對(duì)待處理郵件進(jìn)行識(shí)別。
簡(jiǎn)單實(shí)用的分類算法:貝葉斯分類
實(shí)用場(chǎng)景:反垃圾、信息自動(dòng)分類等
黑名單
將需要過(guò)濾的內(nèi)容加入到黑名單中,然后從黑名單中進(jìn)行查找,如果找到,就過(guò)濾掉。
常用數(shù)據(jù)結(jié)構(gòu):Hash表、BloomFilter。
電子商務(wù)風(fēng)險(xiǎn)控制
交易安全是電子商務(wù)網(wǎng)站的底線。
風(fēng)險(xiǎn)
主要風(fēng)險(xiǎn):
- 賬戶風(fēng)險(xiǎn):如賬戶被黑客盜用、惡意注冊(cè)賬號(hào)等。
- 買家風(fēng)險(xiǎn):買家惡意下單占用庫(kù)存進(jìn)行不正當(dāng)競(jìng)爭(zhēng);黃牛利用促銷搶購(gòu)低價(jià)商品。
- 賣家風(fēng)險(xiǎn):不良賣家進(jìn)行惡意欺詐。
- 交易風(fēng)險(xiǎn):信用卡盜刷、支付欺詐、洗錢套現(xiàn)等。
風(fēng)控
風(fēng)控手段包括 自動(dòng) 和 人工 兩種。
自動(dòng)風(fēng)控技術(shù):
- 規(guī)則引擎:將 業(yè)務(wù)規(guī)則 和 規(guī)則處理邏輯 分離的技術(shù)。缺點(diǎn):規(guī)則沖突,難以維護(hù),規(guī)則越多性能越差。
- 統(tǒng)計(jì)模型:使用統(tǒng)計(jì)模型進(jìn)行風(fēng)險(xiǎn)控制。分類算法或者更復(fù)雜的機(jī)器學(xué)習(xí)算法。
關(guān)注作者:JAVA高級(jí)程序員
我會(huì)不定期在微頭條發(fā)放:(Java工程化、分布式架構(gòu)、高并發(fā)、高性能、深入淺出、微服務(wù)架構(gòu)、Spring、MyBatis、Netty、源碼分析)等技術(shù)學(xué)習(xí)資料,以及Java進(jìn)階學(xué)習(xí)路線圖。