架構設計的指導思想——總結《大型網站技術架構:核心原理與案例分析》一書
本文的思維導圖如下:
本文分為三大部分,9個架構模式、8個架構要素和架構要素的提升手段。9個架構模式分別是分層,分割,分散式,叢集,快取,非同步,冗餘,自動化,安全。8個架構要素分別是效能,可用性,可伸縮,可擴充套件,安全,成本,可維護,可移植。
在展開闡述之前,先談談架構演化思想:好的架構都是演化而來的,好的架構是滿足當時業務的需求,切不要為了架構而架構,但設計架構的時候要考慮為系統留一定的餘量。
第一部分:9個架構模式
分層:一般分為接入層,應用層,服務層和資料層。接入層是指網路中面向使用者連線和訪問的部分。應用層負責具體業務和檢視展示。服務層為應用層提供服務支援。資料層提供資料儲存和訪問服務。
分割:將不同的功能和服務分割開來,包裝成高內聚低耦合的模組單元。
分散式:常用的分散式方案有分散式應用和服務,分散式靜態資源,分散式資料和儲存,分散式計算,分散式配置,分散式鎖,分散式檔案系統。
叢集:多臺伺服器部署相同應用構成一個叢集,通過負載均衡裝置共同對外提供服務。即使是訪問量很小的分散式應用和服務,也至少部署兩臺伺服器構成一個小的叢集,目的是提高系統的可用性
快取:優先考慮使用快取,使用快取的兩個前提:資料訪問熱點不均衡和資料在某個時間段內有效。
快取的手段有:
CDN內容分發網路
部署在距離終端使用者最近的網路服務商
反向代理快取網站的靜態資源
本地快取在應用伺服器本地快取著熱點資料
分散式快取專門的一個分散式快取叢集
非同步:目的降低軟體耦合性,可晚點的操作儘量晚點操作
單一伺服器內部可通過多執行緒共享記憶體佇列的方式實現非同步
多個伺服器叢集可通過分散式訊息佇列實現非同步,可看做是記憶體佇列的分散式部署
優點:提供系統可用性,加快網站響應速度,消除併發訪問高峰
冗餘:伺服器冗餘執行,資料冗餘備份
冷備份:定期備份,存檔儲存
熱備份:實時同步備份,例子:資料庫的主從分離
自動化:主要集中在釋出運維方面
釋出過程自動化,自動化程式碼管理,自動化測試,自動化安全檢測,自動化部署,自動化監控,自動化報警,自動化失效轉移,自動化失效恢復,自動化降級,自動化分配資源等
安全:通過密碼和手機校驗碼,加密,驗證碼,垃圾資訊和敏感資訊過濾,交易風險控制
第二部分:8個架構要素
架構要素 |
衡量標準 |
常用手段 |
效能 |
響應時間,TPS,系統性能計數器等 |
在瀏覽器端: 瀏覽器快取,頁面壓縮,合理佈局頁面,減少cookie傳輸,CDN,反向代理 在應用伺服器端: 本地快取,分散式快取,非同步分散式訊息佇列,伺服器叢集 在程式碼層面: 多執行緒,改善記憶體管理 在資料庫伺服器端: 索引,快取,SQL優化,NoSQL等 |
可用性 |
可用性指標 |
在應用伺服器端: 伺服器叢集 在儲存伺服器端: 冗餘備份,失效轉移,失效恢復 在軟體開發過程: 預釋出驗證,自動化測試,自動化釋出,灰度釋出等 |
伸縮性 |
是否容易向叢集中新增新的伺服器 |
對於應用伺服器叢集: 通過合適的負載均衡裝置向叢集不斷加入伺服器 對於快取伺服器叢集: 通過改進快取路由演算法保證快取資料的可訪問性 對於關係資料庫叢集: 通過路由分割槽等手段 對於NoSQL資料庫產品: 選擇對伸縮性支援好的產品 |
擴充套件性 |
新增業務產品或功能,對現有業務或功能改動最少 |
使用分散式訊息佇列 使用分散式服務,將業務和可複用服務分離開來,通過分散式服務框架呼叫 提供開發平臺介面給第三方開發者 |
安全性 |
對現有的攻擊與竊密手段是否有可靠對策 |
XSS攻擊:消毒和HttpOnly 注入攻擊:消毒和引數繫結 CSRF攻擊:表單token,驗證碼,Referer check Error Code:跳轉500頁面 HTML註釋:程式碼review 檔案上傳:設定白名單 路徑遍歷:資原始檔獨立部署,使用獨立域名 使用web應用防火牆,如ModSecurity 網站安全漏洞掃描 資訊加密技術及金鑰安全管理 資訊過濾與反垃圾:文字匹配,分類演算法和黑名單 電子商務風險控制:規則引擎和統計模型 |
成本 |
專案週期,人力成本,機器成本 |
技術選型上選擇團隊擅長的技術棧 合理分解任務 估算業務量指標DAU,MAU等等 |
可維護 |
易維護性 |
自動化專案管理 自動化監控 自動化釋出 |
可移植 |
是否方便移植到別的平臺 |
程式語言:選擇跨平臺語言 軟體:選擇跨平臺軟體 系統:選擇通用的系統 |
第三部分:架構要素的提升手段
1、提升效能的手段
效能測試指標 |
說明 |
測試方法 |
響應時間 |
指應用執行一個操作需要的時間,包括從發出請求開始到收到最後響應資料所需要的時間 |
重複請求,總響應時間之和取平均 |
併發數 |
指系統能夠同時處理請求的數目 網站系統使用者數>>網站線上使用者數>>網站併發使用者數 |
通過多執行緒模擬併發使用者的辦法 |
吞吐量 |
單位時間內系統處理的請求數量,體現系統的整體處理能力 量化指標: TPS(每秒事務數) HPS(每秒HTTP請求數) QPS(每秒查詢數) |
通過多執行緒模擬併發使用者的辦法 |
效能計數器 |
系統負載,物件與執行緒數,記憶體使用,CPU使用,磁碟與網路I/O |
效能測試方法分類 |
測試目標 |
測試方法 |
效能測試 |
評估系統性能是否符合需求及設計目標——系統性能指標 |
通過多執行緒模擬併發使用者的辦法 |
負載測試 |
評估系統因為突發事件超出日常訪問壓力的情況下,保證系統正常執行情況下能夠承受的最大訪問負載壓力——最大負載能力 |
通過多執行緒模擬併發使用者的辦法 |
壓力測試 |
評估可能導致系統崩潰的最大訪問負載壓力——最大壓力承受能力 |
通過多執行緒模擬併發使用者的辦法 |
穩定性測試 |
特定條件下執行較長一段時間,系統是否穩定 |
不均勻地對系統施加壓力 |
效能分析步驟:
1)檢查請求處理的各個環節的日誌,分析哪個環節響應時間不合理、超過預期
2)檢查監控資料:分析影響效能的主要因素是記憶體,磁碟,網路還是CPU,是程式碼問題還是架構設計不合理,或者系統資源確實不足
效能優化分類 |
優化手段 |
說明 |
Web前端效能優化 |
瀏覽器訪問優化 |
1)減少http請求 2)使用瀏覽器快取:設定Cache-Control和Expires屬性 3)啟動壓縮:HTML,CSS,JavaScript檔案啟用Gzip 4)CSS放在頁面最上面,JavaScript放在頁面最下面 5)減少cookie傳輸 |
CDN加速 |
快取一般是靜態資源:圖片,檔案,CSS,Script指令碼,靜態網頁 |
|
反向代理 |
配置快取功能加速web請求,可快取靜態內容和動態內容,動態內容更新,需通過內部通知機制通知反向代理快取失效 另外,反向代理還起到安全防護和負載均衡的功能 |
|
應用伺服器效能優化 |
分散式快取 |
快取基本原理:減少資料訪問時間和減少計算時間 快取主要用來存放那些讀寫比很高、很少變化的資料 可以通過快取預熱手段改善效能,啟動時載入 還得解決快取穿透的問題,把不存在的資料也快取起來(其value為null) |
非同步操作 |
使用訊息佇列,可改善使用者響應延遲,具有很好的削峰作用 進行業務非同步處理後,需要適當修改業務流程進行配合 |
|
使用叢集 |
將併發訪問請求分發到多臺伺服器 |
|
程式碼優化 |
1)多執行緒:使用原因是IO阻塞和多CPU 一臺伺服器上啟動多少執行緒合適呢? 啟動執行緒數=[任務執行時間/(任務執行時間-IO等待時間)]*CPU核心數 2)資源複用 單例:比如spring單例 物件池:比如資料庫連線池和執行緒池 3)資料結構 4)垃圾回收 |
|
儲存效能優化 |
機械硬碟 vs 固態硬碟 |
SSD具有更好的讀寫效能 |
B+樹 vs LSM樹 |
傳統關係型資料庫使用B+樹 許多NoSQL使用LSM樹 |
|
RAID vs HDFS |
RAID技術在傳統關係資料庫及檔案系統中應用比較廣泛 大型網站比較喜歡使用NoSQL以及分散式檔案系統 |
2、提升可用性的手段
計算公式 |
說明 |
|
網站可用性度量 |
網站不可用時間(故障時間)=故障修復時間點-故障發現時間點 網站年度可用性指標=(1-網站不可用時間/年度總時間)*100% |
基本可用:2個9,少於88小時 較高可用:3個9,少於9小時 高可用:4個9,少於53分鐘 極高可用:5個9,少於5分鐘 |
網站可用性考核 |
故障分=故障時間(分鐘)*故障權重 |
故障分是對網站故障進行分類加權計算故障責任的方法 |
故障分類 |
描述 |
權重 |
事故級故障 |
嚴重故障,網站整體不可用 |
100 |
A類故障 |
網站訪問不順暢或核心功能不可用 |
20 |
B類故障 |
非核心功能不可用,或核心功能少數使用者不可用 |
5 |
C類故障 |
以上故障以外的其他故障 |
1 |
實現手段 |
描述 |
|
高可用的應用 |
通過負載均衡進行無狀態服務的失效轉移 |
實現可用狀態實時監測,自動轉移失敗任務的機制是負載均衡 目前,不管是開源免費的負載均衡軟體還是負載均衡硬體,都提供失效轉移的功能 |
應用伺服器叢集的session管理 |
session管理的手段有: 1)session複製:開啟web容器session複製功能,適用於叢集規模小的情況 2)session繫結:利用源地址hash演算法,將同一IP請求分發到同一臺伺服器上,實現session繫結。這種方法很少使用 3)利用cookie記錄session 4)session伺服器叢集:可利用分散式快取實現 |
|
高可用的服務 |
分級管理 |
低優先順序的服務部署在不同的虛擬機器上進行隔離 高優先順序的服務部署在不同的物理機上 核心服務和資料部署在不同地域的資料中心 |
超時設定 |
在應用程式中,設定服務呼叫的超時時間,一旦超時,通訊框架就丟擲異常,應用程式根據服務排程策略,可選擇繼續重試或將請求轉移到提供相同服務的其他伺服器上 |
|
非同步呼叫 |
應用對服務的呼叫通過訊息佇列等非同步方式完成,避免一個服務失敗導致整個應用請求失敗的情況 |
|
服務降級 |
1)拒絕服務:拒絕低優先順序應用的呼叫,減少服務呼叫併發數 2)關閉功能:關閉部分不重要的服務,或者服務內部關閉部分不重要的功能 |
|
冪等性設計 |
必須保證重複呼叫和一次呼叫產生的結果一致 |
|
高可用的資料 |
資料備份 |
1)資料冷備:不能保證資料最終一致性和資料可用性 2)資料熱備:非同步熱備方式和同步熱備方式 關係資料庫熱備機制通常指Master-Slave同步機制 |
失效轉移 |
失效轉移分三部分操作: 1)失效確認 2)訪問轉移:轉移到對等伺服器(兩臺伺服器資料完全一致) 3)資料恢復:伺服器宕機後,資料儲存發生了變化,得恢復 |
|
高可用網站的軟體質量保證 |
網站釋出 |
相當於一次提前預知的伺服器宕機 |
自動化測試 |
釋出後的迴歸測試 |
|
預釋出驗證 |
部署到預釋出伺服器上驗證,預釋出伺服器和正式伺服器共用一套資料庫,不同的是,預釋出伺服器沒有負載均衡 |
|
程式碼控制 |
1)主幹開發,分支釋出 2)分支開發,主幹釋出(使用這種方式) |
|
自動化釋出 |
火車釋出模型: 提交發布請求——>QA確認,安全確認,DBA確認——>程式碼合併——>預釋出驗證——>正式釋出 |
|
灰度釋出 |
將叢集伺服器分成若干部分,每天只發布一部分伺服器,成功繼續釋出,失敗回滾,在重新發布 灰度釋出也常用於使用者測試(AB測試) |
|
網站執行監控 (不允許沒有監控的系統上線) |
監控資料採集 |
1)使用者行為日誌收集 2)伺服器效能監控:開源效能監控工具Ganglia 3)執行資料報告 |
監控管理 |
1)系統報警 2)失效轉移 3)自動優雅降級 |
3、提升可伸縮的手段
伸縮是指不改變功能的情況下,增加叢集伺服器或對現有功能進行拆分後部署到新的機器。
網站架構的伸縮性設計分類 |
實現手段 |
描述 |
不同功能進行物理分離實現伸縮 |
分層後分離 |
將業務處理流程上的不同部分分離部署,實現系統伸縮性 |
業務分割後分離 |
將不同的業務模組分離部署,實現系統伸縮性 |
|
單一功能通過叢集規模實現伸縮 |
應用伺服器叢集的伸縮性設計 |
通過負載均衡實現,負載均衡的方法有: 1)HTTP重定向負載均衡(很少用) 2)DNS域名解析負載均衡(一般作為第一級負載均衡手段) 3)反向代理負載均衡(HTTP協議層面的,優點:部署簡單;缺點:反向代理可能會成為瓶頸) 4)IP負載均衡(網路層面的,負載均衡在核心程序完成資料分發,較反向代理負載均衡有更好的效能,負載均衡伺服器網絡卡頻寬可能會成為瓶頸) 5)資料鏈路層負載均衡(資料鏈路層面的,通過修改mac地址進行負載均衡,常用的負載均衡開源產品LVS,使用最廣泛) 負載均衡演算法有: 1)輪詢(Round Robin,RR) 2)加權輪詢(Weighted Round Robin,WRR) 3)隨機(Random) 4)最少連線(Least Connections) 5)源地址雜湊(Source Hashing) |
分散式快取叢集的伸縮性設計 |
通過路由演算法和更新快取伺服器列表實現 比較流行的路由演算法有: 一致性Hash演算法 改進的一致性Hash演算法:在一致性Hash演算法的基礎上增加虛擬層,將一臺物理快取伺服器虛擬成一組虛擬快取伺服器,將虛擬伺服器的Hash值放置到Hash環中,KEY在環上先找到虛擬伺服器節點,再得到物理伺服器的資訊。一般來說,經驗值150,即一臺物理伺服器虛擬成150個虛擬伺服器節點 |
|
資料儲存伺服器叢集的伸縮性設計 |
1)關係資料庫叢集的伸縮性設計 資料分庫:不同業務資料表部署在不同的資料庫叢集上 資料分片:將一張表拆開分別儲存在多個數據庫中 支援資料分片的分散式關係資料庫產品有: Amoeba,Cobar,MyCat 一般的擴容方法: 根據業務遠景規劃未來叢集規模 資料遷移步驟: 先同步資料 後修改路由配置 同分布式快取叢集一樣,關鍵在於路由演算法 2)NoSQL資料庫的伸縮性設計 NoSQL:指非關係的,分散式的資料庫設計模式 應用最廣泛的是HBase,Redis,Cassandra,Mongodb |
4、提升可擴充套件的手段
實現手段 |
描述 |
|
模組化方式 |
分層和分割 |
利用分層和分割的方式將軟體分割成若干個低耦合的獨立的元件模組 |
聚合方式 |
分散式訊息佇列 |
訊息生產者應用程式通過遠端訪問介面將訊息推送給訊息佇列伺服器 訊息佇列伺服器根據訊息訂閱列表查詢訂閱該訊息的訊息消費者應用程式,將訊息佇列中的訊息按照先進先出的原則將訊息通過遠端通訊介面傳送給消費者程式 為了避免訊息佇列伺服器宕機造成訊息丟失,會將訊息成功傳送到訊息佇列的訊息儲存在訊息生產者的伺服器,等訊息真正被訊息消費者處理後才刪除訊息。在訊息佇列伺服器宕機後,生產者伺服器會選擇分散式訊息佇列伺服器叢集中的其他伺服器釋出訊息 開源的分散式訊息佇列產品有:ActiveMQ,Rabbitmq,Nsq,Rocketmq,kafka |
分散式服務 |
分散式服務框架的要求: 1)負載均衡 2)失效轉移 3)高效的遠端通訊 4)整合異構系統 5)對應用最少侵入 6)版本管理 7)實時監控 開源分散式服務框架有:Dubbo |
|
其他 |
可擴充套件的資料結構 |
許多NoSQL資料庫使用的ColumnFamily設計就是一種解決方案 |
開發平臺 |
提供給第三方開發者使用 |
5、提升安全的手段
實現手段 |
描述 |
|
網站應用的攻擊與防禦 |
XSS攻擊:跨站點指令碼攻擊,分為反射型和持久型 防禦手段: 1)消毒 2)HttpOnly |
消毒:進行過濾和消毒處理,即對某些html危險字元轉義 HttpOnly:防止XSS攻擊者竊取Cookie |
注入攻擊:SQL注入攻擊和OS注入攻擊 防禦SQL注入攻擊的手段: 1)消毒 2)引數繫結 |
消毒:通過正則表示式匹配,過濾可能注入的SQL 引數繫結:使用預編譯手段,繫結引數是最好的防SQL注入方法,如IBatis,Hibernate等 |
|
CSRF攻擊:跨站點請求偽造,核心是利用了瀏覽器Cookie或伺服器Session策略,盜取使用者身份 防禦手段:主要是識別請求者身份 1)表單token 2)驗證碼 3)Referer check |
token:通過在請求引數中增加隨機數的辦法 驗證碼:請求提交時,輸入驗證碼 Referer check:記錄請求來源,驗證是否合法 |
|
Error Code |
配置web伺服器引數,跳轉500頁面 |
|
HTML註釋 |
程式碼review |
|
檔案上傳 |
設定上傳白名單 |
|
路徑遍歷 |
靜態資源獨立部署,使用獨立域名 |
|
web防火牆 |
ModSecurity |
|
網站安全漏洞掃描 |
||
資訊加密技術及金鑰安全管理 |
單向雜湊加密 |
常用的演算法有:MD5,SHA等 |
對稱加密 |
對稱加密演算法有:DES演算法、RC演算法等 |
|
非對稱加密 |
非對稱加密演算法有:RSA演算法等 |
|
金鑰安全管理 |
有兩種手段: 1)把金鑰和演算法放在一個獨立的伺服器,對外提供加密和解密服務,應用系統通過呼叫這個服務,實現資料的加解密 2)將加密演算法放在應用系統中,金鑰則放在獨立伺服器中 |
|
資訊過濾與反垃圾 |
文字匹配 |
主要解決敏感詞過濾的問題,通常採用雙陣列Trie演算法等 |
分類演算法 |
對廣告貼和垃圾郵件等進行分類 |
|
黑名單 |
可通過Hash表實現 對過濾需求要求不完全精確的場景,可使用布隆過濾器代替Hash表 |
|
電子商務風險控制 |
風控自動手段: 1)規則引擎 2)統計模型 |
風險有:賬戶風險,買家風險,賣家風險,交易風險 風控手段:有自動和人工兩種 |
參考資料:《大型網站技術架構:核心原理與案例分析》