第一篇 概述
1. 大型網(wǎng)站架構(gòu)演化
大型網(wǎng)站軟件系統(tǒng)特點
- 高并發(fā)铭乾,大流量: 以P計的數(shù)據(jù)
- 高可用:系統(tǒng)7*24小時不間斷服務(wù)埂奈。
- 海量數(shù)據(jù):需要存儲若贮、管理海量數(shù)據(jù)
- 用戶分布廣泛戳吝,網(wǎng)絡(luò)情況復(fù)雜
- 安全環(huán)境惡劣
- 需求快速變更浩销,發(fā)布頻繁
- 漸進式發(fā)展
大型網(wǎng)站架構(gòu)演化歷程
- 初始階段網(wǎng)站架構(gòu):單機,liux+apache+php+mysql
- 應(yīng)用服務(wù)和數(shù)據(jù)服務(wù)分離
- 應(yīng)用服務(wù)器需要處理大量的業(yè)務(wù)邏輯听哭,需要更快更強大的CPU
- 數(shù)據(jù)服務(wù)器需要更快速磁盤檢索和數(shù)據(jù)緩存慢洋,需要更快的磁盤和更大的內(nèi)存
- 文件服務(wù)器需要存儲大量用戶上傳文件,需要更大的硬盤
- 使用緩存改善網(wǎng)站性能
- 本地緩存
- 訪問更快
- 緩存數(shù)據(jù)量有限陆盘,受服務(wù)器限制
- 多臺服務(wù)器一致性
- 與應(yīng)用服務(wù)器爭用內(nèi)存
- 分布式緩存
- 不受服務(wù)器內(nèi)存限制
- 本地緩存
- 使用應(yīng)用服務(wù)器集群改善網(wǎng)站并發(fā)處理能力
- 通過負載均衡調(diào)度服務(wù)器普筹,可將來自用戶請求分發(fā)到應(yīng)用服務(wù)器集群中的任意一臺服務(wù)器上。
- 數(shù)據(jù)庫讀寫分離
- 利用數(shù)據(jù)庫主從熱備功能隘马,實現(xiàn)讀寫分離
- 使用反向代理和CDN加速網(wǎng)站響應(yīng)
- CDN和反向代理基本原理都是緩存
- CDN 部署在網(wǎng)絡(luò)提供商的機房太防,可根據(jù)最近距離提供數(shù)據(jù)給用戶
- 反向代理則部署在網(wǎng)站的中心機房,如果反向代理緩存著用戶資源就直接返回用戶酸员。
- 加快訪問速度蜒车、改善用戶體驗、減輕后端服務(wù)器壓力
- 使用分布式文件系統(tǒng)和分布式數(shù)據(jù)庫系統(tǒng)
-常用 業(yè)務(wù)分庫 - 使用NoSQL和搜索引擎
- NoSQL對可伸縮的分布式特性具有更好的支持
- 業(yè)務(wù)拆分
- 網(wǎng)站通過超鏈接建立聯(lián)系
- 通過消息隊列進行數(shù)據(jù)分發(fā)
- 通過訪問統(tǒng)一數(shù)據(jù)庫系統(tǒng)構(gòu)成關(guān)聯(lián)的完整系統(tǒng)
- 分布式服務(wù)
演化原則
- 隨網(wǎng)站所需靈活應(yīng)對
- 業(yè)務(wù)驅(qū)動技術(shù)發(fā)展
網(wǎng)站架構(gòu)設(shè)計誤區(qū)
- 一味追求大公司解決方案
- 為了技術(shù)而技術(shù)幔嗦,而脫離業(yè)務(wù)
- 企圖用技術(shù)解決所有問題
2. 架構(gòu)模式
- 分層
- 將網(wǎng)站系統(tǒng)分成應(yīng)用層酿愧、服務(wù)層、數(shù)據(jù)層
- 嚴格遵循分層架構(gòu)約束邀泉,禁止跨層次調(diào)用(應(yīng)用層直接調(diào)用數(shù)據(jù)層)及逆向調(diào)用(數(shù)據(jù)層調(diào)用服務(wù)層)
- 應(yīng)用層可以再細分視圖層嬉挡、業(yè)務(wù)邏輯層
- 服務(wù)層也可以細分數(shù)據(jù)接口層和邏輯處理層
- 分割
- 將不同功能和服務(wù)分割開來,包裝成高內(nèi)聚低耦合的模塊單元汇恤。
- 分布式
- 對應(yīng)大型網(wǎng)站庞钢,分層和分割的一個最主要目的是為了切分后的模塊便于分布式部署。
- 分布式帶來問題
- 服務(wù)間通過網(wǎng)絡(luò)調(diào)用影響性能
- 服務(wù)器越多因谎,服務(wù)器宕機概率增大
- 保持數(shù)據(jù)一致性困難
- 網(wǎng)站依賴錯綜復(fù)雜基括,開發(fā)維護難
- ....
- 分布式方案
- 分布式應(yīng)用和服務(wù)
- 分布式靜態(tài)資源:
- 將靜態(tài)資源獨立分布式不是,并采用獨立域名蓝角,實現(xiàn)動靜分離(獨立域名可加快瀏覽器并發(fā)加載速度)
- 分布式數(shù)據(jù)和存儲
- 分布式計算
- 集群
- 多臺服務(wù)器部署相同的應(yīng)用構(gòu)成一個集群阱穗,通過負載均衡設(shè)備共同對外提供服務(wù)
- 緩存
- 緩存是改善軟件性能第一手段
- 緩存類別
- CDN
- 反向代理
- 本地緩存
- 分布式緩存
- 使用緩存前提:
- 數(shù)據(jù)訪問熱點不均衡
- 數(shù)據(jù)在某個時間點有效不會很快過期,否則緩存數(shù)據(jù)就會因為已經(jīng)失效而產(chǎn)生臟讀使鹅,影響結(jié)果正確性。
- 異步
- 異步實現(xiàn)方式
- 多線程共享內(nèi)存隊列
- 分布式消息隊列
- 異步作用
- 降低軟件耦合性
- 提高系統(tǒng)可用性
- 加快網(wǎng)站響應(yīng)速度(不需要等待消費者服務(wù)器處理完畢就可以返回昌抠,響應(yīng)延遲減少)
- 消除并發(fā)訪問高峰
- 異步實現(xiàn)方式
- 冗余
- 服務(wù)冗余患朱,構(gòu)建集群
- 數(shù)據(jù)庫冗余
- 定時備份,存檔保存炊苫,實現(xiàn)冷備份
- 數(shù)據(jù)庫進行主從分離裁厅,實時同步熱備份
- 全球部署災(zāi)備數(shù)據(jù)中心
- 自動化
- 自動化代碼管理
- 自動化測試
- 自動化安全檢查
- 自動化部署
- 自動化監(jiān)控冰沙、報警
- 自動化失效轉(zhuǎn)移及失效恢復(fù)
- 自動化降級
- 自動化分配資源
- 安全
- 通過密碼、手機校驗碼進行身份認證
- 使用驗證碼等識別機器人程序
- 對網(wǎng)站通信進行加密
- 敏感數(shù)據(jù)進行加密存儲
- 常見XSS攻擊执虹、SQL 注入拓挥、進行處理
- 對垃圾信息、敏感信息進行過濾
- 對重要的操作根據(jù)交易模式和交易信息進行風險控制袋励。
3. 大型網(wǎng)站核心架構(gòu)要素
- 性能
- 可用性
- 衡量系統(tǒng)架構(gòu)是否滿足高可用目標侥啤,就是系統(tǒng)任何一臺或者多臺服務(wù)器宕機時,以及出現(xiàn)各種不可預(yù)期問題茬故,系統(tǒng)整體是否依然可用
- 高可用主要手段是冗余
- 通過負載均衡組成集群共同對外提供服務(wù)盖灸。
- 伸縮性
- 所謂的伸縮性是指不斷向集群加入服務(wù)器的手段來緩解不斷上升的用戶并發(fā)訪問壓力和不斷增長的數(shù)據(jù)存儲需求
- 衡量架構(gòu)伸縮性主要標準:
- 是否可以用多臺服務(wù)器構(gòu)建集群,
- 是否容易向集群中添加新的服務(wù)器
- 加入的新服務(wù)器后是否可以提供和原來服務(wù)器無差別的服務(wù)
- 集群可容納的總服務(wù)器數(shù)據(jù)是否有限制磺芭。
- 擴展性
- 網(wǎng)站擴展性直接關(guān)注網(wǎng)站功能需求赁炎,能迅速響應(yīng)需求變化
- 衡量標準:
- 增加新業(yè)務(wù)產(chǎn)品,是否可以實現(xiàn)對現(xiàn)有產(chǎn)品透明無影響钾腺,無需或者很少改動
- 不同產(chǎn)品之間是否很少耦合
- 安全性
- 衡量網(wǎng)站安全架構(gòu)的標準就是針對現(xiàn)存和潛在的各種攻擊與竊密手段徙垫,是否有可靠的應(yīng)對策略
第二篇 架構(gòu)
4. 瞬時響應(yīng):網(wǎng)站高性能架構(gòu)
性能優(yōu)化主要工作是改善高并發(fā)用戶訪問情況下網(wǎng)站響應(yīng)速度,最終目的就是改善用戶體驗放棒,使用戶感覺很快松邪。即可使用技術(shù)手段,也可以通過優(yōu)化交互體驗改善哨查。
網(wǎng)站性能指標
- 響應(yīng)時間
- 注意如果測試目標花費時間極少逗抑,那測試程序占用時間多,那測試很難測試出系統(tǒng)響應(yīng)時間寒亥∮矢可以重復(fù)執(zhí)行求平均。
- 并發(fā)數(shù)
- 網(wǎng)站并發(fā)數(shù)溉奕,指同時提交請求的用戶數(shù)目
- 網(wǎng)站系統(tǒng)用戶數(shù)>> 網(wǎng)站在線用戶數(shù)>>網(wǎng)站并發(fā)用戶數(shù)
- 吞吐量
- 吞吐量指單位時間內(nèi)系統(tǒng)處理請求的數(shù)量褂傀,提現(xiàn)系統(tǒng)的整體處理能力
- 常用的指標還有TPS(每秒事物數(shù))、HPS(每秒HTTP請求數(shù))加勤、QPS(每秒查詢數(shù))等
- 系統(tǒng)并發(fā)量增大過程中仙辟,系統(tǒng)吞吐量先是逐漸增加,達到極限后鳄梅,反而下降叠国,達到系統(tǒng)崩潰點后,吞吐量為0
- 性能計數(shù)器
- 描述服務(wù)器或操作系統(tǒng)性能一些數(shù)據(jù)指標戴尸,包括System load(系統(tǒng)負載)粟焊、對象與線程數(shù)、內(nèi)存使用、CPU使用项棠、磁盤與網(wǎng)絡(luò)I/O等指標
- 系統(tǒng)負載悲雳,指當前被CPU執(zhí)行和等待被執(zhí)行的進程數(shù)目總和,最完美的system load是負載值等于CPU值香追。
性能測試方法
- 性能測試
- 負載測試
- 壓力測試
- 穩(wěn)定性測試
性能優(yōu)化策略
- 性能分析
- 性能優(yōu)化
Web前端性能優(yōu)化
- 瀏覽器訪問優(yōu)化
- 減少http 請求
- 合并css合瓢、js、合并圖片
- 合并接口透典,減少接口請求
- 使用瀏覽器緩存
- 使用Cache-Control晴楔、Expires屬性,設(shè)置緩存時間掷匠,緩存靜態(tài)資源
- 更新靜態(tài)資源,采用變更文件名實現(xiàn)滥崩,并更新引用,而不是僅僅更新內(nèi)容
- 啟用壓縮
- 采用Gzip壓縮可以減少80%以上流量傳輸讹语,但是對服務(wù)器及瀏覽器有一定的壓力
- css 放在頁面最上面钙皮、js 放在頁面最下面
- 瀏覽器下載完全部css之后才對整個頁面進行渲染,最后將css放置最上部
- 如果頁面解析需要用到j(luò)s,js也放置底部就不合適顽决。
- 減少cookie傳輸
- 靜態(tài)資源使用獨立域名訪問短条,避免請求靜態(tài)資源發(fā)送cookie
- 減小cookie傳輸內(nèi)容
- 減少http 請求
- CDN 加速
- cdn能夠緩存的都是一些靜態(tài)資源,如圖片才菠、文件茸时、css、靜態(tài)網(wǎng)頁等
- cdn部署在網(wǎng)絡(luò)運營商機房赋访,而這些運營商又是終端用戶網(wǎng)絡(luò)服務(wù)提供商可都,離用戶鏈路近
- 反向代理
- 使用反向代理,在系統(tǒng)服務(wù)器之前建立屏障蚓耽,可加強安全保障
- 反向代理服務(wù)上緩存靜態(tài)資源渠牲,加速web響應(yīng)請求,減輕服務(wù)器負載壓力
- 可將動態(tài)內(nèi)容也緩存在代理服務(wù)器上步悠,當動態(tài)內(nèi)容有變化時签杈,通過內(nèi)部通知機制通知反向代理緩存失效,然后重新加載最新動態(tài)內(nèi)容鼎兽。
- 反向代理還可實現(xiàn)負載均衡功能答姥,構(gòu)建應(yīng)用集群,提高性能
應(yīng)用服務(wù)器性能優(yōu)化
- 分布式緩存
- 網(wǎng)站性能優(yōu)化第一定律:優(yōu)選考慮使用緩存優(yōu)化性能
- 緩存原理:將數(shù)據(jù)存儲相對較高訪問速度的存儲介質(zhì)中谚咬,提高訪問速度鹦付。
- 不適合緩存
- 頻繁修改的數(shù)據(jù)
- 沒有數(shù)據(jù)熱點訪問
- 數(shù)據(jù)要求強一致,容忍不了短時間不一致
- 緩存可用性
- 采用集群序宦、緩存預(yù)熱等手段提高緩存可用性
- 緩存預(yù)熱睁壁,最好在緩存系統(tǒng)啟動時就把熱點數(shù)據(jù)加載好背苦,進行緩存預(yù)熱互捌,然后再接入系統(tǒng)
- 緩存穿透潘明,緩存沒有保存該數(shù)據(jù),請求落到數(shù)據(jù)庫上秕噪,就是緩存穿透钳降。當緩存穿透過多,數(shù)據(jù)庫也承受不來會發(fā)生崩潰腌巾,最好將不存在也緩存起來(其值為空值)
- 分布式緩存架構(gòu)
- 以JBOSS為代表的需要同步更新的分布式緩存
- 所有服務(wù)保存相同數(shù)據(jù)遂填,當某一臺數(shù)據(jù)更新,通知集群其他機器更新或清除數(shù)據(jù)
- 容量受單臺內(nèi)存空間限制
- 以Memcached為代表的互不通信的分布式緩存
- 通過一致性Hash等路由算法選擇緩存服務(wù)器遠程訪問路徑
- 緩存集群規(guī)模容易擴容澈蝙,具有良好可伸縮性
- Memcached使用TCP(UDP也支持)協(xié)議通信吓坚,其序列化協(xié)議則基于文本的自定義協(xié)議,非常簡單灯荧,以一個命令關(guān)鍵字作為開頭礁击,后面是一組命令操作數(shù),例如 get <Key>逗载。
- 以JBOSS為代表的需要同步更新的分布式緩存
- 異步操作
- 使用消息隊列快速返回應(yīng)答
- 使用消息隊列削峰平谷哆窿。
- 在高并發(fā)業(yè)務(wù)處理中,任何可以晚點做的事情厉斟,盡量晚點做
- 異步處理完成記得使用郵件挚躯、sms消息等通知用戶
- 使用集群
- 使用負載技術(shù)構(gòu)建多臺機器組成的服務(wù)器集群。
- 代碼優(yōu)化
- 多線程
- 使用多線程主要原因:IO阻塞與多CPU
- 最佳啟動線程數(shù)=[任務(wù)執(zhí)行時間/(任務(wù)執(zhí)行時間-IO等待時間)]*CPU內(nèi)核數(shù)
- 注意線程安全
- 資源復(fù)用
- 盡量減少那些開銷很大的系統(tǒng)資源的創(chuàng)建和銷毀擦秽,比如數(shù)據(jù)庫連接码荔、網(wǎng)絡(luò)通信、線程感挥、復(fù)雜對象等
- 復(fù)用主要方式
- 單例
- 對象池
- 使用合適數(shù)據(jù)結(jié)構(gòu)
- 垃圾回收
- 堆是主要存儲對象的內(nèi)存空間缩搅,對象的創(chuàng)建和釋放、垃圾回收就在此進行
- 棧存儲線程上下文信息链快,如方法參數(shù)誉己、局部變量等
- JVM分代垃圾回收機制,將堆空間分為年輕代(Young Generation)和年老代域蜗,又將年輕代分為Eden區(qū)巨双、From區(qū)和To區(qū)
- 當Old Generation空間也用完,就會觸發(fā)Full GC霉祸,即所謂的全量回收辕录,全量回收對系統(tǒng)性能會產(chǎn)生較大影響
- 應(yīng)根據(jù)系統(tǒng)業(yè)務(wù)特點暂幼,合理設(shè)置Young Generation 和Old Generation大小,盡量減少Full GC。
- 多線程
存儲性能優(yōu)化
- 使用固態(tài)硬盤代替機械硬盤
- 機械硬盤在數(shù)據(jù)連續(xù)訪問(要訪問的數(shù)據(jù)在連續(xù)的磁盤上)和隨機訪問(要訪問的數(shù)據(jù)存儲在不連續(xù)的磁盤空間)時锈至,由于移動磁頭臂的次數(shù)相差巨大走搁,性能表現(xiàn)非常大
- 固態(tài)硬盤,沒有機械裝置,數(shù)據(jù)存儲可持久記憶的硅晶體上敏晤,可以像內(nèi)存一樣快速隨機訪問,具有更小功耗缅茉、更少的磁盤震動與躁動嘴脾。但是SSD可靠性、性價比待提升蔬墩。
- B+樹 vs LSM 樹
- 目前數(shù)據(jù)庫多采用兩級索引的B+樹译打,樹層級最多三層。因此可能需要5次磁盤訪問才能更新一條記錄(三次磁盤訪問獲取數(shù)據(jù)索引及行Id,然后再進行一次數(shù)據(jù)文件讀操作及一次數(shù)據(jù)文件寫操作)
- 目前很多NoSQL產(chǎn)品采用LSM 樹作為主要數(shù)據(jù)結(jié)構(gòu)
- LSM可以看做N階合并樹拇颅。數(shù)據(jù)寫操作都在內(nèi)存中進行奏司,并且創(chuàng)建一個新記錄,如果數(shù)據(jù)量超過設(shè)定的內(nèi)存法制樟插,會將這棵排序樹與磁盤最新排序樹合并韵洋。在進行讀操作,總是從內(nèi)存排序樹中開始搜索岸夯,如果沒有找到麻献,就從磁盤上的排序樹順序查找。LSM 更新不需要訪問磁盤猜扮,在內(nèi)存即可完成勉吻,速度遠快于B+樹,而如果讀操作幾種最近寫入的數(shù)據(jù)旅赢,使用LSM可以極大程度減少磁盤訪問次數(shù)齿桃,加快速度
- 使用RAID技術(shù)加速磁盤訪問
- RAID(廉價磁盤冗余陣列)主要改善磁盤訪問延遲,增強磁盤可用性和容錯性煮盼。
- 服務(wù)器上插入多塊磁盤短纵,使用RAID技術(shù)實現(xiàn)數(shù)據(jù)在多塊磁盤上并發(fā)讀寫和數(shù)據(jù)備份
- RAID技術(shù)目前有RAID0、RAID1僵控、RAID01香到、RAID3、RAID5报破、RAID6
- RAID6,數(shù)據(jù)只寫入N-2塊磁盤悠就,并螺旋地在兩塊磁盤中寫人校驗信息。
- 使用HDFS
- HDFS以塊為(block)單位管理文件內(nèi)容充易,一個文件被分割為若干block 梗脾,當程序?qū)懳募r,每寫完一個Block,HDFS就將其自動復(fù)制到另外兩臺機器盹靴。
- 數(shù)據(jù)庫(block)默認為64M炸茧,不適合存儲小文件
5. 萬無一失:網(wǎng)站的高可用架構(gòu)
網(wǎng)站可用性指 網(wǎng)站可有效訪問瑞妇。
高可用架構(gòu)設(shè)計的主要目的就是服務(wù)器硬件故障時,服務(wù)依然可用梭冠、數(shù)據(jù)依然保存并能夠被訪問辕狰。
實現(xiàn)高可用架構(gòu)主要的手段是數(shù)據(jù)和服務(wù)的冗余備份和失效轉(zhuǎn)移。
高可用架構(gòu)設(shè)計需要考慮硬件宕機妈嘹,還需考慮升級發(fā)布引起的宕機柳琢。
影響網(wǎng)站可用性
- DNS 被劫持
- CDN 掛掉
- 網(wǎng)站服務(wù)器宕機
- 網(wǎng)絡(luò)交換機失效
- 硬盤損壞
- 網(wǎng)卡松動
- 機房停電
- 空調(diào)失靈
- 程序bug
- 黑客攻擊
- 促銷引發(fā)大量訪問
- 第三方合作伙伴服務(wù)不可用.....
服務(wù)器高可用方案
- 通過負載均衡進行無狀態(tài)的失效轉(zhuǎn)移
- 分級管理
- 服務(wù)器分級管理绍妨,核心應(yīng)用和服務(wù)使用好設(shè)備润脸,運維響應(yīng)更迅速
- 服務(wù)部署進行隔離
- 超時設(shè)置
- 異步調(diào)用
- 不影響主流程的服務(wù),可以通過消息隊列或者異步線程執(zhí)行
- 服務(wù)降級
- 拒絕服務(wù)
- 拒絕低優(yōu)先級應(yīng)用調(diào)用他去,減少服務(wù)調(diào)用次數(shù)毙驯,確保核心應(yīng)用正常使用
- 或者隨機拒絕請求調(diào)用,節(jié)約自然灾测,讓一部分請求得以成功爆价。
- 關(guān)閉服務(wù)
- 關(guān)閉不重要服務(wù),或者服務(wù)內(nèi)部關(guān)閉部分功能媳搪,以節(jié)約系統(tǒng)開銷铭段,為重要服務(wù)和功能讓出資源
- 拒絕服務(wù)
高可用服務(wù)問題
- 應(yīng)用集群session 管理
- session 復(fù)制
- 集群中服務(wù)器同步不sessio對象,使每臺服務(wù)器保存所有用戶的session 信息
- 適合小集群秦爆,加重服務(wù)器網(wǎng)絡(luò)序愚、及內(nèi)存資源
- session 綁定
- 通過負載均衡,將來源同一IP的請求分發(fā)到同一臺服務(wù)器上等限,該機器保存該用戶session爸吮。
- 或者通過cookie信息將同一用戶請求分發(fā)到同一臺服務(wù)器,
- 利用cookie記錄session
- 將session 記錄在客戶端望门,每次請求將session 發(fā)送給服務(wù)器形娇,服務(wù)器處理完請求后再修改session響應(yīng)給客戶端。
- session容量受cookie大小限制
- 每次都需要傳輸cookie影響性能
- 用戶關(guān)閉cookie訪問不正常筹误。
- session 服務(wù)器
- 獨立部署session服務(wù)器桐早,統(tǒng)一管理session
- 應(yīng)用每次讀寫session 都需要訪問session 服務(wù)器
- session 復(fù)制
- 冪等性設(shè)計
- 失效轉(zhuǎn)移可能是虛假的失敗,導致服務(wù)被重復(fù)調(diào)用厨剪,必須保證服務(wù)重復(fù)調(diào)用和調(diào)用一次產(chǎn)生結(jié)果相同哄酝,即具有冪等性。
- 特別注意 事務(wù)性操作的冪等性丽惶。
高可用數(shù)據(jù)
保證數(shù)據(jù)存儲高可用的手段是數(shù)據(jù)備份和失效轉(zhuǎn)移機制
- 數(shù)據(jù)備份
- 冷備份
- 定時將數(shù)據(jù)復(fù)制到存儲介質(zhì)上物理存檔保存炫七。
- 熱備份
- 異步熱備份
- 應(yīng)用寫入一份,然后存儲系統(tǒng)將異步寫入其他副本钾唬。
- 同步熱備份
- 多分數(shù)據(jù)副本寫入同步完成
- 存儲沒有主從之分万哪,完全對等侠驯,便于管理和維護
- 數(shù)據(jù)延遲是響應(yīng)最慢的那臺服務(wù)器
- 異步熱備份
- 冷備份
- 失效轉(zhuǎn)移
- 失效確認
- 心跳檢測
- 應(yīng)用程序訪問失敗報告(控制中心還需要再一次發(fā)送心跳包檢測進行確認)
- 訪問轉(zhuǎn)移
- 數(shù)據(jù)恢復(fù)
- 宕機后,從健康服務(wù)器中復(fù)制數(shù)據(jù)奕巍,將副本數(shù)目恢復(fù)設(shè)定值
- 失效確認
網(wǎng)站質(zhì)量保證方式
- 保證發(fā)布用戶不可感知吟策,不影響服務(wù)使用
- 自動化測試
- 預(yù)發(fā)布驗證
- 代碼控制
- 自動化發(fā)布
- 灰度發(fā)布
網(wǎng)站運行監(jiān)控
不允許沒有監(jiān)控的系統(tǒng)上線
- 監(jiān)控數(shù)據(jù)采集
- 用戶行為日志收集
- 服務(wù)器端日志收集
- 客戶端瀏覽日志收集
- 服務(wù)器性能監(jiān)控
- 系統(tǒng)load、內(nèi)存占用的止、磁盤IO檩坚、網(wǎng)絡(luò)IO等
- 對性能指標作出預(yù)警
- 運行數(shù)據(jù)報告
- 監(jiān)控與具體業(yè)務(wù)場景相關(guān)的技術(shù)和業(yè)務(wù)指標,比如響應(yīng)延遲诅福、緩存命中率匾委、待處理任務(wù)總數(shù)
- 用戶行為日志收集
- 監(jiān)控管理
- 監(jiān)控數(shù)據(jù)收集后,除用作系統(tǒng)性能評估氓润、集群規(guī)模伸縮性預(yù)測等赂乐,還可以進行監(jiān)控數(shù)據(jù)進行風險預(yù)警、對服務(wù)器進行失效轉(zhuǎn)移咖气,自動調(diào)整負載挨措,最大化利用集群機器資源
- 系統(tǒng)報警
- 失效轉(zhuǎn)移
- 自動優(yōu)雅降級
6. 永無止境:網(wǎng)站伸縮性架構(gòu)
網(wǎng)站的伸縮性是指不需改變網(wǎng)站的軟硬件設(shè)計,僅僅通過改變部署服務(wù)器數(shù)量就可以擴大或者縮小網(wǎng)站的服務(wù)器處理能力崩溪。
網(wǎng)站伸縮性設(shè)計
- 根據(jù)功能進行物理分離實現(xiàn)伸縮性
- 不同服務(wù)部署機器浅役,提供不同功能
- 縱向分離:將業(yè)務(wù)處理流程不同部分分離部署,實現(xiàn)系統(tǒng)伸縮性伶唯,比如數(shù)據(jù)庫觉既、緩存、靜態(tài)資源抵怎、基礎(chǔ)服務(wù)等分離部署
- 橫向分離:將不同業(yè)務(wù)模塊分離部署奋救,實現(xiàn)系統(tǒng)伸縮性
- 單一功能通過集群實現(xiàn)伸縮
- 集群多臺機器部署相同服務(wù),提供相同功能
- 應(yīng)用服務(wù)器集群伸縮性
- 數(shù)據(jù)服務(wù)器集群伸縮性
- 緩存數(shù)據(jù)服務(wù)器集群
- 存儲數(shù)據(jù)服務(wù)器集群
應(yīng)用服務(wù)器集群伸縮性設(shè)計
- 應(yīng)用服務(wù)設(shè)計為無狀態(tài)
- Http 重定向負載均衡(少見不推薦)
- dns 域名解析負載均衡
- 通過負載均衡算法返回不同ip地址
- dns 還支持基于地理位置域名解析反惕,加快用戶訪問速度尝艘。
- 缺點是 dns 控制權(quán)在域名服務(wù)商哪里,修改dns A 記錄姿染,使其生效需要較長時間背亥,容易解析到已經(jīng)下線服務(wù)器上
- 常見是域名解析作為第一級負載均衡手段。解析地址也是內(nèi)部負載均衡服務(wù)器地址悬赏。
- 反向代理負載均衡
- IP 負載均衡
- 數(shù)據(jù)鏈路層負載均衡
- 在linux 平臺最好的鏈路層負載均衡開源產(chǎn)品為LVS(Linux Virtual Server)
- 負載均衡服務(wù)器ip地址狡汉,與集群服務(wù)器的虛擬ip相同,通過通信協(xié)議數(shù)據(jù)鏈路層修改mac地址進行負載均衡(這種傳輸方式也叫三角傳輸方式
- 這種方式大型網(wǎng)站使用最廣的一種負載均衡手段
負載均衡算法
- 輪詢
- 加權(quán)輪詢
- 隨機(加權(quán)隨機)
- 最少連接
- 源地址散列
分布式緩存集群伸縮性設(shè)計
- 目的: 必須讓新加入的緩存服務(wù)器對整個分布式緩存集群影響最小
- 通過一致性hash 環(huán)的數(shù)據(jù)結(jié)構(gòu)實現(xiàn)key到服務(wù)器hash 映射闽颇,一致性hash 使用二叉樹實現(xiàn)
- 增加虛擬層盾戴,實現(xiàn)緩存負載均衡,將每臺物理緩存服務(wù)器虛擬為一組虛擬緩存服務(wù)器兵多,然后映射到hash環(huán)上尖啡。(實踐中一般服務(wù)器虛擬為150個節(jié)點橄仆。
數(shù)據(jù)庫存儲服務(wù)器集群伸縮性設(shè)計
- 數(shù)據(jù)存儲服務(wù)器必須保證數(shù)據(jù)可靠存儲,任何情況下都必須保證數(shù)據(jù)的可用性和正確性
- 關(guān)系數(shù)據(jù)庫集群伸縮性設(shè)計
- 讀寫分離
- 業(yè)務(wù)分割進行分庫
- 比較成熟支持數(shù)據(jù)庫分片開源產(chǎn)品 Amoeba衅斩、Cobar
- Cobar伸縮有兩種:Cobar服務(wù)器集群伸縮和Mysql 集群伸縮
- Cobar利用mysql 數(shù)據(jù)同步功能進行數(shù)據(jù)遷移盆顾,遷移單位為schema,遷移完修改Cobar服務(wù)器路由配置畏梆,將這些schema的IP修改為新機器ip您宪,然后刪除原機器中的相關(guān)schema,完成mysql 擴容奠涌。
- nosql數(shù)據(jù)庫伸縮性設(shè)計
- 應(yīng)用最廣泛nosql 為apache Hbase宪巨,他伸縮性依靠可分裂的HRegion及可伸縮的分布式文件系統(tǒng)HDFS 實現(xiàn)。
7. 隨需應(yīng)變:網(wǎng)站的可擴展架構(gòu)
擴展性: 指對現(xiàn)有系統(tǒng)影響最小的情況下铣猩,系統(tǒng)功能可持續(xù)擴展或提升的能力揖铜。
構(gòu)建可擴展的網(wǎng)絡(luò)架構(gòu)
- 開發(fā)低耦合系統(tǒng)是軟件設(shè)計的終極目標之一
- 設(shè)計網(wǎng)站可擴展架構(gòu)的核心思想是模塊化,并在此基礎(chǔ)上达皿,降低模塊間耦合性,提高模塊復(fù)用性
- 分層和分割是模塊化設(shè)計的重要手段
- 模塊化分布式部署以后聚合方式主要有分布式消息隊列和分布式服務(wù)贿肩。
- 分布式消息隊列
- 分布式服務(wù)
- 橫向拆分:將復(fù)用的業(yè)務(wù)拆分出來峦椰,獨立部署為分布式服務(wù)
- 縱向拆分:按照業(yè)務(wù)獨立,設(shè)計部署為獨立的應(yīng)用系統(tǒng)
- 分布式服務(wù)具有如下特性
- 負載均衡
- 失效轉(zhuǎn)移
- 高效遠程通信
- 整合異構(gòu)資源
- 對應(yīng)用最少侵入
- 版本管理
- 實時監(jiān)控
- 國內(nèi)實施最常見的分布式框架為Dubbo
8. 固若金湯:網(wǎng)站的安全架構(gòu)
常見攻擊手段
- XSS 攻擊: 跨站點腳本攻擊汰规,黑客篡改網(wǎng)頁汤功,注入惡意html腳本,用戶在瀏覽網(wǎng)頁時溜哮,控制用戶瀏覽器進行惡意操作的一種攻擊方式
- 主要攻擊類型:
- 反射型:攻擊者誘使用戶點擊一個嵌入惡意腳本的鏈接滔金,達到攻擊目的
- 持久型:攻擊者提交含有惡意腳本的請求,保存在被攻擊web站點數(shù)據(jù)庫中茂嗓,用戶瀏覽網(wǎng)頁時餐茵,惡意腳本被包含正常頁面中,達到攻擊目的
- 處理手段
- 消毒:對某些html危險字符轉(zhuǎn)義述吸,比如>轉(zhuǎn)義為>
- httponly: 禁止js訪問cookie
- 主要攻擊類型:
- 注入攻擊
- 常見攻擊方式
- SQL 注入: 攻擊者在http請求中注入惡意sql命令忿族,服務(wù)器請求sql命令時候,惡意sql被構(gòu)造并執(zhí)行蝌矛。
- 可以進行消毒
- 參數(shù)綁定道批,使用開源IBatis、Hibernate等框架入撒,處理sql命令隆豹,攻擊者sql命令,僅僅成為sql參數(shù)茅逮,而不是命令直接執(zhí)行
- OS 注入: 注入os命令被程序執(zhí)行
- SQL 注入: 攻擊者在http請求中注入惡意sql命令忿族,服務(wù)器請求sql命令時候,惡意sql被構(gòu)造并執(zhí)行蝌矛。
- 常見攻擊方式
- CSRF攻擊: 跨站點請求偽造(cross site request forgery),攻擊者通過跨站請求璃赡,以合合法身份進行非法操作簿煌。
- 其核心就是利用瀏覽器cookie或者session策略,盜取用戶身份鉴吹。
- 解決方法:
- token
- 驗證碼
- referer check
- 其他被利用的漏洞
- 錯誤頁面姨伟、錯誤信息過于詳細
- http 注釋
- 文件上傳沒有設(shè)置白名單,上傳文件類型控制
- 可以路徑遍歷系統(tǒng)未開放的目錄和文件
安全措施
- web 應(yīng)用防火墻豆励,常見modsecurity
- 網(wǎng)站安全漏洞掃描
- 信息加密和密鑰安全管理
信息加密技術(shù)
- 單項散列加密
- 單項散列加密不同輸入長度信息夺荒,得出固定長度輸出
- 不可對輸出進行計算從而獲取輸入內(nèi)容
- 由于人設(shè)置密碼具有一定模式,可以使用彩虹表等手段進行猜測式破解
- 可以加鹽良蒸,增加破解難度技扼。
- 輸入細微變化會導致輸出完全不同
- 常見單項散列算法有md5、sha等
- 對稱加密
- 加密與解密使用相同密鑰
- 算法簡單嫩痰,加解密效率高剿吻,系統(tǒng)開銷小,適合大量數(shù)據(jù)加密
- 常見算法有des串纺、rc等
- 非對稱加密
- 使用一組密鑰
- 公鑰加密的信息只有私鑰解開丽旅,反之私鑰加密的信息只有公鑰才能解開
- 理論上不可能通過公鑰計算獲得私鑰
- 常見算法為RSA
信息過濾及反垃圾手段
- 文本匹配
- 正則:效率低,適合提交文本長度短纺棺。
- Trie算法:
- 多級hash表進行文本匹配榄笙,及過濾樹
- 分類算法
- 根據(jù)不同單詞在垃圾郵件的概率,通過大量算法訓練祷蝌,得到可識別模型
- 黑名單
- hash 表: 適合黑名單比較小
- 布隆過濾器:
風控技術(shù)
機器識別出高風險交易和信息發(fā)送給風控人員進行人工審核茅撞。
- 規(guī)則引擎:
- 設(shè)置規(guī)則,當交易滿足指標一定條件巨朦,就認為是高風險交易
- 業(yè)務(wù)規(guī)則和規(guī)則處理邏輯分離米丘,運營人員通過編輯規(guī)則,無需更改代碼糊啡,更新風控規(guī)則拄查,實現(xiàn)風控
- 統(tǒng)計模型
- 規(guī)則引擎簡單,但是規(guī)則增多悔橄,會逐步出現(xiàn)規(guī)則沖突及難以維護狀態(tài)
- 使用分類算法或者機器學習算法進行智能統(tǒng)計
- 通過充分訓練的統(tǒng)計模型靶累,準確率不低于規(guī)則引擎
第三篇 案例
9. 淘寶架構(gòu)演化案例分析
10. 維基百科高性能架構(gòu)設(shè)計分析
- wikipedia 架構(gòu)組成
- geodns: 可以解析到離用戶最近的服務(wù)器
- LVS
- squid: 基于linux 反向代理
- Lighttpd: 較apache服務(wù)器更輕量、更快速
- PHP
- Memcached
- Lucene: java開發(fā)的開源全文搜索引擎
- Mysql
- wikipedia 前端性能優(yōu)化
- DNS 服務(wù): 基于地址位置解析最近服務(wù)器
- CDN 服務(wù): 熱點詞條緩存在CDN服務(wù)器癣疟,且離用戶瀏覽器最近的地方挣柬。
- 反向代理LVS
- 反向代理Squid 集群:通過LVS 負載均衡分發(fā)到每臺Squid 服務(wù)器。并緩存熱點數(shù)據(jù)睛挚,減輕服務(wù)器壓力邪蛔,詞條信息更新,應(yīng)用服務(wù)器使用invalidation Notification 服務(wù)通知squid 緩存失效
- 服務(wù)端性能優(yōu)化
- 使用緩存扎狱,將熱點數(shù)據(jù)緩存在分布式緩存系統(tǒng)中
- Mysql 優(yōu)化
- 使用較大的內(nèi)存的服務(wù)器
- 使用RAID0磁盤陣列以加速磁盤訪問
- 將數(shù)據(jù)庫事務(wù)一致性設(shè)置在較低水平侧到,加速宕機恢復(fù)速度
- Master宕機勃教,立即將應(yīng)用切到salve數(shù)據(jù)庫,同時關(guān)閉寫服務(wù)匠抗,關(guān)閉詞條編輯功能故源。
11. 海量分布式存儲系統(tǒng)Doris 高可用架構(gòu)設(shè)計分析
不同故障情況下高可用解決方案
- 分布式存儲系統(tǒng)故障分類
- 瞬時故障: 網(wǎng)絡(luò)通信瞬時中斷、線程過多停止訪問數(shù)據(jù)庫
- 增加重試機制
- 增加機器仲裁(數(shù)據(jù)庫搶占)
- 臨時故障: 交換機宕機汞贸、網(wǎng)卡松動等绳军、系統(tǒng)升級、停機維護等矢腻、內(nèi)存損壞门驾、cpu過熱等
- 發(fā)生故障,需要將數(shù)據(jù)寫入臨時存儲機器多柑,恢復(fù)后遷移數(shù)據(jù)
- 永久故障: 硬盤損壞奶是、數(shù)據(jù)丟失等
- 從其他服務(wù)器復(fù)制全部數(shù)據(jù)
- 瞬時故障: 網(wǎng)絡(luò)通信瞬時中斷、線程過多停止訪問數(shù)據(jù)庫
12. 網(wǎng)購秒殺系統(tǒng)架構(gòu)設(shè)計案例分析
秒殺挑戰(zhàn)
- 對現(xiàn)有的網(wǎng)站業(yè)務(wù)造成沖擊
- 高并發(fā)下應(yīng)用、數(shù)據(jù)庫負載
- 突然增加的網(wǎng)絡(luò)及服務(wù)器帶寬
- 直接下單
秒殺應(yīng)對策略
- 秒殺系統(tǒng)單獨部署竣灌,可以采用單獨域名聂沙,完全隔離正常業(yè)務(wù)
- 秒殺頁面靜態(tài)化
- 租借秒殺活動網(wǎng)絡(luò)帶寬
- 可升級或購買帶寬
- 可緩存CDN上,減輕服務(wù)器壓力
- 新增CDN出口帶寬
- 動態(tài)生成隨機下單頁面URL
- 秒殺下單URL 動態(tài)化帐偎,秒殺開始才生成逐纬,才讓前端訪問獲取。
秒殺系統(tǒng)設(shè)計
- 如何控制秒殺商品頁面購買按鈕點亮
- 增加js腳本控制削樊,秒殺開始生成新的js,控制按鈕點亮
- 如何只允許第一個提交訂單發(fā)送到訂單系統(tǒng)
- 可以控制讓少數(shù)用戶進入下單頁面入口,其他用戶直接進入秒殺結(jié)束頁面
- 秒殺故障兔毒,不提故障漫贞,直接顯示秒殺活動結(jié)束
13. 大型網(wǎng)站故障案例分析
故障實例分析
- 日志等級設(shè)置過低,記錄大量日志育叁,消耗磁盤空間迅脐,從而導致磁盤不足
- 設(shè)置好日志輸出級別
- 應(yīng)用輸出日志與第三方組件日志需要分別配置
- 有些開源組件輸出太多不恰當?shù)膃rror 日志,需要關(guān)掉
- 首頁系統(tǒng)直接查詢數(shù)據(jù)庫豪嗽,發(fā)布后用戶量過大谴蔑,數(shù)據(jù)庫load 居高不下
- 首頁系統(tǒng)不應(yīng)直接訪問數(shù)據(jù),可以從緩存服務(wù)器或者搜索引擎數(shù)據(jù)庫
- 首頁最好是靜態(tài)
- 耗時過程被加鎖龟梦,導致進程被等待
- 發(fā)布系統(tǒng)忽視對緩存系統(tǒng)壓力隐锭,導致系統(tǒng)崩潰
- 系統(tǒng)為apache+Jboss模式,apache啟動好计贰,接入用戶請求钦睡,但是jboss 還未啟動好,大量請求導致jboss 崩潰
- 內(nèi)部系統(tǒng)完整啟動準備好躁倒,才能接入用戶請求
- 少數(shù)用戶上傳大文件荞怒,占用大量服務(wù)器資源洒琢,導致其他用戶不能使用,
- 限制用戶上傳文件大小褐桌、文件類型
- 不同大小文件使用不同存儲系統(tǒng)
- 進行生產(chǎn)環(huán)境壓力測試衰抑,導致系統(tǒng)變慢
- 訪問生產(chǎn)環(huán)境需要規(guī)范
- 進行生產(chǎn)環(huán)境壓力、性能測試荧嵌,必須商量好時間呛踊,盡量不影響用戶
- 上線系統(tǒng)遺留調(diào)試代碼
- 規(guī)范codeview
第四篇 架構(gòu)師
14. 架構(gòu)師領(lǐng)導藝術(shù)
架構(gòu)師功能
- 技術(shù)工作
- 架構(gòu)設(shè)計
- 軟件開發(fā)
- 管理功能
- 規(guī)劃產(chǎn)品路線
- 估算人力資源和時間資源
- 安排人員職責分工
- 計劃里程碑點
- 指導工程師工作
- 過程評估與控制
- 溝通工作
- 項目組外工作角色溝通協(xié)調(diào)
架構(gòu)師要求
- 關(guān)注人而不是產(chǎn)品
- 尋找一個值得共同奮斗的目標,營造一個讓大家都能最大限度發(fā)揮自我價值的工作氛圍完丽。
- 發(fā)掘人的優(yōu)秀
- 讓做成一件事恋技,讓自己和參與的人變得優(yōu)秀
- 共享美好藍圖
- 架構(gòu)師要和項目組全體人員共同描繪一個藍圖,這個藍圖是整個團隊能夠認同的逻族,是團隊共同奮斗的目標
- 藍圖是表達清楚蜻底、形象、簡單的
- 項目過程中聘鳞,保持對目標藍圖的關(guān)注薄辅,對偏離藍圖保持警惕
- 共同參與架構(gòu)
- 讓項目組充分參與架構(gòu)設(shè)計中,不要只有架構(gòu)師一個人擁有架構(gòu)
- 讓其他人維護框架和架構(gòu)文檔
- 學會妥協(xié)
- 對技術(shù)細節(jié)爭論應(yīng)該立即驗證而不是繼續(xù)討論
- 成就他人
- 通過工作的挑戰(zhàn)抠璃,發(fā)掘自我的潛能站楚,重新認識自我和世界
架構(gòu)師職場功能
- 發(fā)現(xiàn)問題,尋求突破
- 提出問題搏嗡,尋求支持
- 提出問題tip
- 把我的問題窿春,表述成我們的問題
- 給上司提封閉式問題,給下屬提開放式問題
- 指出問題而不是批評人
- 用贊同的方式提出問題
- 提出問題tip
- 解決問題采盒,達成績效
第五篇 附錄
15. 大型網(wǎng)站架構(gòu)技術(shù)一覽
- 前端架構(gòu)
- 瀏覽器優(yōu)化技術(shù)
- 常見有頁面緩存旧乞、合并請求、使用頁面壓縮
- CDN
- 動靜分離磅氨,靜態(tài)資源獨立部署
- 圖片服務(wù)
- 反向代理
- DNS
- 瀏覽器優(yōu)化技術(shù)
- 應(yīng)用層架構(gòu)
- 開發(fā)框架
- 頁面渲染
- 負載均衡
- Session管理
- 動態(tài)頁面靜態(tài)化
- 業(yè)務(wù)拆分
- 虛擬化服務(wù)器
- 服務(wù)層架構(gòu)
- 分布式消息
- 分布式服務(wù)
- 分布式緩存
- 分布式配置
- 存儲層架構(gòu)
- 分布式文件
- 關(guān)系數(shù)據(jù)庫
- NoSQL數(shù)據(jù)庫
- 數(shù)據(jù)同步
- 后臺架構(gòu)
- 搜索引擎
- 數(shù)據(jù)倉庫
- 推薦系統(tǒng)
- 數(shù)據(jù)采集與監(jiān)控
- 瀏覽器數(shù)據(jù)采集
- 服務(wù)器業(yè)務(wù)數(shù)據(jù)采集
- 服務(wù)器性能數(shù)據(jù)采集
- 系統(tǒng)監(jiān)控
- 系統(tǒng)報警
- 安全架構(gòu)
- web 攻擊
- 數(shù)據(jù)保護
- 數(shù)據(jù)中心機房架構(gòu)
- 機房架構(gòu)
- 機柜架構(gòu)
- 服務(wù)器架構(gòu)