前言
- 本文是對(duì)《大型網(wǎng)站架構(gòu)設(shè)計(jì)》(李智慧 著)一書(shū)的梳理,類(lèi)似文字版的“思維導(dǎo)圖”
- 全文主要圍繞“性能,可用性,伸縮性,擴(kuò)展性,安全”這五個(gè)要素
- 性能,可用性,伸縮性這幾個(gè)要素基本都涉及到應(yīng)用服務(wù)器,緩存服務(wù)器,存儲(chǔ)服務(wù)器這幾個(gè)方面
概述
- 三個(gè)緯度:演化、模式、要素
- 五個(gè)要素: 性能,可用性,伸縮性,擴(kuò)展性,安全
演化歷程
大型網(wǎng)站架構(gòu)演化歷程:
- 初始階段的網(wǎng)站架構(gòu):一臺(tái)服務(wù)器,上面同時(shí)擁有應(yīng)用程序,數(shù)據(jù)庫(kù),文件,等所有資源。例如 LAMP 架構(gòu)
- 應(yīng)用和數(shù)據(jù)服務(wù)分離:三臺(tái)服務(wù)器(硬件資源各不相同),分別是應(yīng)用服務(wù)器,文件服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器
- 使用緩存改善網(wǎng)站性能:分為兩種,緩存在應(yīng)用服務(wù)器上的本地緩存和緩存在專(zhuān)門(mén)的分布式緩存服務(wù)器的遠(yuǎn)程緩存
- 使用應(yīng)用服務(wù)器集群改善網(wǎng)站并發(fā)處理能力:通過(guò)負(fù)載均衡調(diào)度服務(wù)器來(lái)將訪(fǎng)問(wèn)請(qǐng)求分發(fā)到應(yīng)用服務(wù)器集群中的任何一臺(tái)機(jī)器
- 數(shù)據(jù)庫(kù)讀寫(xiě)分離:數(shù)據(jù)庫(kù)采用主從熱備,應(yīng)用服務(wù)器在寫(xiě)數(shù)據(jù)時(shí)訪(fǎng)問(wèn)主數(shù)據(jù)庫(kù),主數(shù)據(jù)庫(kù)通過(guò)主從復(fù)制機(jī)制將數(shù)據(jù)更新同步到從數(shù)據(jù)庫(kù)。應(yīng)用服務(wù)器使用專(zhuān)門(mén)的數(shù)據(jù)訪(fǎng)問(wèn)模塊從而對(duì)應(yīng)用透明
- 使用反向代理和 CDN 加速網(wǎng)站響應(yīng):這兩者基本原理都是緩存。反向代理部署在網(wǎng)站的中心機(jī)房,CDN 部署在網(wǎng)絡(luò)提供商的機(jī)房
- 使用分布式文件系統(tǒng)和分布式數(shù)據(jù)庫(kù)系統(tǒng):數(shù)據(jù)庫(kù)拆分的最后手段,更常用的是業(yè)務(wù)分庫(kù)
- 使用 NoSQL 和搜索引擎:對(duì)可伸縮的分布式有更好的支持
- 業(yè)務(wù)拆分:將整個(gè)網(wǎng)站業(yè)務(wù)拆分成不同的應(yīng)用,每個(gè)應(yīng)用獨(dú)立部署維護(hù),應(yīng)用之間通過(guò)超鏈接建立聯(lián)系/消息隊(duì)列進(jìn)行數(shù)據(jù)分發(fā)/訪(fǎng)問(wèn)同一數(shù)據(jù)存儲(chǔ)系統(tǒng)
- 分布式服務(wù):公共業(yè)務(wù)提取出來(lái)獨(dú)立部署
架構(gòu)演化-分布式服務(wù)
演化的價(jià)值觀(guān)
- 大型網(wǎng)站架構(gòu)的核心價(jià)值是隨網(wǎng)站所需靈活應(yīng)對(duì)
- 驅(qū)動(dòng)大型網(wǎng)站技術(shù)發(fā)展的主要力量是網(wǎng)站的業(yè)務(wù)發(fā)展
誤區(qū)
- 一味追隨大公司的解決方案
- 為了技術(shù)而技術(shù)
- 企圖用技術(shù)解決所有問(wèn)題
架構(gòu)模式
模式的關(guān)鍵在于模式的可重復(fù)性
- 分層:橫向切分
- 分割:縱向切分
- 分布式:分層和分割的主要目的是為了切分后的模塊便于分布式部署。常用方案:分布式應(yīng)用和服務(wù)分布式靜態(tài)資源分布式數(shù)據(jù)和存儲(chǔ)分布式計(jì)算分布式配置,分布式鎖,分布式文件,等等
- 集群:多臺(tái)服務(wù)器部署相同的應(yīng)用構(gòu)成一個(gè)集群,通過(guò)負(fù)載均衡設(shè)備共同對(duì)外提供服務(wù)
- 緩存:將數(shù)據(jù)放距離計(jì)算最近的位置加快處理速度,改善性能第一手段,可以加快訪(fǎng)問(wèn)速度,減小后端負(fù)載壓力。使用緩存 兩個(gè)前提條件 :1.數(shù)據(jù)訪(fǎng)問(wèn)熱點(diǎn)不均衡;2.數(shù)據(jù)某時(shí)段內(nèi)有效,不會(huì)很快過(guò)期CDN反向代理本地緩存分布式緩存
- 異步:旨在系統(tǒng)解耦。異步架構(gòu)是典型的消費(fèi)者生產(chǎn)者模式,特性如下:提高系統(tǒng)可用性加快網(wǎng)站訪(fǎng)問(wèn)速度消除并發(fā)訪(fǎng)問(wèn)高峰
- 冗余:實(shí)現(xiàn)高可用。數(shù)據(jù)庫(kù)的冷備份和熱備份
- 自動(dòng)化:包括發(fā)布過(guò)程自動(dòng)化,自動(dòng)化代碼管理,自動(dòng)化測(cè)試,自動(dòng)化安全檢測(cè),自動(dòng)化部署,自動(dòng)化監(jiān)控,自動(dòng)化報(bào)警,自動(dòng)化失效轉(zhuǎn)移,自動(dòng)化失效恢復(fù),自動(dòng)化降級(jí),自動(dòng)化分配資源
- 安全:密碼,手機(jī)校驗(yàn)碼,加密,驗(yàn)證碼,過(guò)濾,風(fēng)險(xiǎn)控制
核心要素
架構(gòu)是“最高層次的規(guī)劃,難以改變的規(guī)定”。主要關(guān)注五個(gè)要素:
- 性能
- 可用性(Availability)
- 伸縮性(Scalability)
- 擴(kuò)展性(Extensibility)
- 安全性
架構(gòu)
下面依次對(duì)這五個(gè)要素進(jìn)行歸納
高性能
性能的測(cè)試指標(biāo)主要有:
- 響應(yīng)時(shí)間:指應(yīng)用執(zhí)行一個(gè)操作需要的時(shí)間
- 并發(fā)數(shù):指系統(tǒng)能夠同時(shí)處理請(qǐng)求的數(shù)目
- 吞吐量:指單位時(shí)間內(nèi)系統(tǒng)處理的請(qǐng)求數(shù)量
- 性能計(jì)數(shù)器:描述服務(wù)器或者操作系統(tǒng)性能的一些數(shù)據(jù)指標(biāo)
性能測(cè)試方法:
- 性能測(cè)試
- 負(fù)載測(cè)試
- 壓力測(cè)試
- 穩(wěn)定性測(cè)試
性能測(cè)試曲線(xiàn)
性能優(yōu)化,根據(jù)網(wǎng)站分層架構(gòu),可以分為三大類(lèi):
- Web 前端性能優(yōu)化瀏覽器訪(fǎng)問(wèn)優(yōu)化減少 http 請(qǐng)求使用瀏覽器緩存啟用壓縮css 放在頁(yè)面最上面,JAVAScript 放在頁(yè)面最下面減少 Cookie 傳輸CDN 加速:本質(zhì)是一個(gè)緩存,一般緩存靜態(tài)資源反向代理保護(hù)網(wǎng)站安全通過(guò)配置緩存功能加速 Web 請(qǐng)求實(shí)現(xiàn)負(fù)載均衡
- 應(yīng)用服務(wù)器性能優(yōu)化:主要手段有 緩存、集群、異步分布式緩存(網(wǎng)站性能優(yōu)化第一定律:優(yōu)化考慮使用緩存優(yōu)化性能)異步操作(消息隊(duì)列,削峰作用)使用集群代碼優(yōu)化多線(xiàn)程(設(shè)計(jì)為無(wú)狀態(tài),使用局部對(duì)象,并發(fā)訪(fǎng)問(wèn)資源使用鎖)資源復(fù)用(單例,對(duì)象池)數(shù)據(jù)結(jié)構(gòu)垃圾回收
- 存儲(chǔ)服務(wù)器性能優(yōu)化機(jī)械硬盤(pán) vs. 固態(tài)硬盤(pán)B+ 樹(shù) vs. LSM 樹(shù)RAID vs. HDFS
高可用
- 高可用的網(wǎng)站架構(gòu):目的是保證服務(wù)器硬件故障時(shí)服務(wù)依然可用、數(shù)據(jù)依然保存并能夠被訪(fǎng)問(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 管理Session 復(fù)制Session 綁定利用 Cookie 記錄 SessionSession 服務(wù)器
- 高可用的服務(wù):無(wú)狀態(tài)的服務(wù),可使用類(lèi)似負(fù)載均衡的失效轉(zhuǎn)移策略,此外還有如下策略分級(jí)管理超時(shí)設(shè)置異步調(diào)用服務(wù)降級(jí)冪等性設(shè)計(jì)
- 高可用的數(shù)據(jù):主要手段是數(shù)據(jù)備份和失效轉(zhuǎn)移機(jī)制CAP 原理數(shù)據(jù)一致性(Consisitency)數(shù)據(jù)可用性(Availibility)分區(qū)耐受性(Partition Tolerance)數(shù)據(jù)備份冷備:缺點(diǎn)是不能保證數(shù)據(jù)最終一致和數(shù)據(jù)可用性熱備:分為異步熱備和同步熱備失效轉(zhuǎn)移:由以下三部分組成失效確認(rèn)訪(fǎng)問(wèn)轉(zhuǎn)移數(shù)據(jù)恢復(fù)
- 高可用網(wǎng)站的軟件質(zhì)量保證網(wǎng)站發(fā)布自動(dòng)化測(cè)試預(yù)發(fā)布驗(yàn)證代碼控制主干開(kāi)發(fā)、分支發(fā)布分支開(kāi)發(fā)、主干發(fā)布自動(dòng)化發(fā)布灰度發(fā)布
- 網(wǎng)站運(yùn)行監(jiān)控監(jiān)控?cái)?shù)據(jù)采集用戶(hù)行為日志采集(服務(wù)器端和客戶(hù)端)服務(wù)器性能監(jiān)控運(yùn)行數(shù)據(jù)報(bào)告監(jiān)控管理警報(bào)系統(tǒng)失效轉(zhuǎn)移自動(dòng)優(yōu)雅降級(jí)
伸縮性
大型網(wǎng)站的“大型”是指:
- 用戶(hù)層面:大量用戶(hù)及大量訪(fǎng)問(wèn)
- 功能方面:功能龐雜,產(chǎn)品眾多
- 技術(shù)層面:網(wǎng)站需要部署大量的服務(wù)器
伸縮性的分為如下幾個(gè)方面
- 網(wǎng)站架構(gòu)的伸縮性設(shè)計(jì)不同功能進(jìn)行物理分離實(shí)現(xiàn)伸縮縱向分離(分層后分離)橫向分離(業(yè)務(wù)分割后分離)單一功能通過(guò)集群規(guī)模實(shí)現(xiàn)伸縮
- 應(yīng)用服務(wù)器集群的伸縮性設(shè)計(jì)HTTP 重定向負(fù)載均衡DNS 域名解析負(fù)載均衡反向代理負(fù)載均衡(在 HTTP 協(xié)議層面,應(yīng)用層負(fù)載均衡)IP 負(fù)載均衡(在內(nèi)核進(jìn)程完成數(shù)據(jù)分發(fā))數(shù)據(jù)鏈路層負(fù)載均衡(數(shù)據(jù)鏈路層修改 mac 地址,三角傳輸模式,LVS)負(fù)載均衡算法輪詢(xún)(Round Robin, RR)加權(quán)輪詢(xún)(Weighted Round Robin, WRR)隨機(jī)(Random)最少鏈接(Least Connections)源地址散列(Source Hashing)
- 分布式緩存集群的伸縮性設(shè)計(jì)Memcached 分布式緩存集群的訪(fǎng)問(wèn)模型Memcached 客戶(hù)端(包括 API,路由算法,服務(wù)器列表,通信模塊)Memcached 服務(wù)器集群Memcached 分布式緩存集群的伸縮性挑戰(zhàn)分布式緩存的一致性 Hash 算法(一致性 Hash 環(huán),虛擬層)
- 數(shù)據(jù)存儲(chǔ)服務(wù)集群的伸縮性設(shè)計(jì)關(guān)系數(shù)據(jù)庫(kù)集群的伸縮性設(shè)計(jì)NoSQL 數(shù)據(jù)庫(kù)的伸縮性設(shè)計(jì)
可擴(kuò)展
系統(tǒng)架構(gòu)設(shè)計(jì)層面的“開(kāi)閉原則”
- 構(gòu)建可擴(kuò)展的網(wǎng)站架構(gòu)
- 利用分布式消息隊(duì)列降低耦合性事件驅(qū)動(dòng)架構(gòu)(Event Driven Architecture)分布式消息隊(duì)列
- 利用分布式服務(wù)打造可復(fù)用的業(yè)務(wù)平臺(tái)Web Service 與企業(yè)級(jí)分布式服務(wù)大型網(wǎng)站分布式服務(wù)的特點(diǎn)分布式服務(wù)框架設(shè)計(jì)(Thrift, Dubbo)
- 可擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)(如 ColumnFamily 設(shè)計(jì))
- 利用開(kāi)放平臺(tái)建設(shè)網(wǎng)站生態(tài)圈
安全
XSS 攻擊和 SQL 注入攻擊是構(gòu)成網(wǎng)站應(yīng)用攻擊最主要的兩種手段,此外還包括 CSRF,Session 劫持等手段。
- 攻擊與防御XSS 攻擊:跨站點(diǎn)腳本攻擊(Cross Site Script)反射型持久型XSS 防御手段消毒(即對(duì)某些 html 危險(xiǎn)字符轉(zhuǎn)義)HttpOnly注入攻擊SQL 注入攻擊OS 注入攻擊注入防御避免被猜到數(shù)據(jù)庫(kù)表結(jié)構(gòu)信息消毒參數(shù)綁定CSRF 攻擊:跨站點(diǎn)請(qǐng)求偽造(Cross Site Request Forgery)CSRF 防御:主要手段是識(shí)別請(qǐng)求者身份表單 Token驗(yàn)證碼Referer Check其他攻擊和漏洞Error CodeHTML 注釋文件上傳路徑遍歷Web 應(yīng)用防火墻(ModSecurity)網(wǎng)站安全漏洞掃描
- 信息加密技術(shù)及密鑰安全管理單向散列加密:不同輸入長(zhǎng)度的信息通過(guò)散列計(jì)算得到固定長(zhǎng)度的輸出不可逆,非明文可加鹽(salt)增加安全性輸入的微小變化會(huì)導(dǎo)致輸出完全不同對(duì)稱(chēng)加密:加密和解密使用同一個(gè)密鑰非對(duì)稱(chēng)加密信息傳輸:公鑰加密,私鑰解密數(shù)字簽名:私鑰加密,公鑰解密密鑰安全管理:信息安全傳輸是靠密鑰保證的,改善手段有:把密鑰和算法放在一個(gè)獨(dú)立的服務(wù)器上將加解密算法放在應(yīng)用系統(tǒng)中,密鑰放在獨(dú)立服務(wù)器
- 信息過(guò)濾與反垃圾文本匹配分類(lèi)算法黑名單