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