讀《大型網(wǎng)站技術(shù)架構(gòu)》

《大型網(wǎng)站技術(shù)架構(gòu)》是自己接觸的第一本架構(gòu)知識(shí)的書籍,還是在14年時(shí)買的實(shí)體書,前后讀了幾遍,頗有所得,后來實(shí)體書被朋友借走再?zèng)]歸還,也就沒再翻過。

個(gè)人覺得這本書作為一本入門書籍頗為合適,里面對(duì)架構(gòu)知識(shí)的各個(gè)方面都有比較全面的講解,通俗易懂,由于篇幅并不長(zhǎng)且面面俱到,因此可能部分深度略有不足,但至少能使讀者對(duì)網(wǎng)站架構(gòu)的方法和思維方式有了比較全面的了解。同時(shí)也對(duì)架構(gòu)師內(nèi)涵和技術(shù)管理有所闡述,值得一讀。

日常工作與學(xué)習(xí)中,往往更多的時(shí)間是使用快餐的方式,比如讀一篇博客、聽一次演講、研究一段源碼,沉下心來好好讀一本書的機(jī)會(huì)反而少了,因此最近拿出一段的時(shí)間,與其他同類書籍對(duì)比的讀一遍,爭(zhēng)取學(xué)習(xí)到不同于之前的東西,結(jié)合當(dāng)前公司內(nèi)部的架構(gòu)體系,更好的理解相關(guān)知識(shí)。

個(gè)人寫讀書筆記分幾個(gè)階段,先把本書提綱梳理出來,然后慢慢補(bǔ)充自己的一些理解和一些業(yè)內(nèi)典型案例,以此為綱 循序漸進(jìn)。

概述

image.png

1 架構(gòu)演化

大型網(wǎng)站的關(guān)注指標(biāo)

  • 高可用
  • 高性能
  • 易擴(kuò)展
  • 可伸縮
  • 安全

大型網(wǎng)站的特點(diǎn)

  • 高并發(fā),大流量
  • 高可用
  • 海量數(shù)據(jù)
  • 用戶分布廣泛,網(wǎng)絡(luò)情況復(fù)雜
  • 安全環(huán)境惡劣
  • 需求快速變更,發(fā)布頻繁
  • 漸進(jìn)式發(fā)展

大型網(wǎng)站架構(gòu)演化發(fā)展過程

  • 初始階段,多使用LAMP來搭建,All In One即所有資源存放在一臺(tái)服務(wù)器上
  • 應(yīng)用服務(wù)和數(shù)據(jù)服務(wù)分離,有獨(dú)立的數(shù)據(jù)庫服務(wù)器
  • 使用緩存改善網(wǎng)站性能(依據(jù)是二八定律:80%的業(yè)務(wù)訪問集中在20%的數(shù)據(jù)上)
    • 這里需要考慮哪些數(shù)據(jù)適合緩存
    • 緩存可以是本地緩存,也可以是遠(yuǎn)程分布式緩存
    • 需要考慮使用合理的緩存策略,防止透?jìng)?/li>
  • 使用應(yīng)用服務(wù)器集群改善網(wǎng)站的并發(fā)處理能力
    • 如果能通過增加一臺(tái)服務(wù)器的方式來改善負(fù)載壓力,就可以以同樣的方式持續(xù)增加服務(wù)器來不斷改善系統(tǒng)性能,從而實(shí)現(xiàn)系統(tǒng)的可伸縮性
    • 這里需要考慮使用哪些負(fù)載均衡的策略
  • 數(shù)據(jù)庫讀寫分離
    • 緩存中的數(shù)據(jù),如果更新過快,那么會(huì)持續(xù)刷新緩存,從而降低性能
    • 可以利用主流數(shù)據(jù)庫提供的主從熱備功能,通過配置兩臺(tái)數(shù)據(jù)庫的主從關(guān)系,同時(shí)業(yè)內(nèi)也有很多優(yōu)秀的開源中間件如Atlas
  • 使用反向代理和CDN加速網(wǎng)絡(luò)響應(yīng)
    • CDN和反向代理的基本原理都是緩存
    • CDN部署在網(wǎng)絡(luò)提供商的機(jī)房,用戶在請(qǐng)求網(wǎng)絡(luò)服務(wù)時(shí),可以從距離自己最近的網(wǎng)絡(luò)提供商機(jī)房獲取數(shù)據(jù)
    • 反向代理部署在網(wǎng)站的中心機(jī)房,當(dāng)用戶的請(qǐng)求到達(dá)中心機(jī)房后,首先訪問的服務(wù)器是反向代理服務(wù)器,如果反向代理服務(wù)器中緩存著用戶請(qǐng)求的資源,那么就將其直接返回給用戶
    • CDN的重點(diǎn):——《大型網(wǎng)站系統(tǒng)與Java中間件實(shí)踐》
      • 全局調(diào)度
      • 緩存技術(shù)
      • 內(nèi)容分發(fā)
      • 帶寬優(yōu)化
  • 使用分布式文件系統(tǒng)和分布式數(shù)據(jù)庫系統(tǒng)
    • 網(wǎng)站常用的數(shù)據(jù)庫拆分手段是業(yè)務(wù)分庫,即將不同業(yè)務(wù)的數(shù)據(jù)庫部署到不同的物理服務(wù)器上
  • 使用NoSQL和搜索引擎
    • ES
    • MongoDB
  • 業(yè)務(wù)拆分,使用分而治之的手段將整個(gè)網(wǎng)站業(yè)務(wù)分成不同的產(chǎn)品線
    • 這部分十分重要,道理很簡(jiǎn)單,但是執(zhí)行起來的效果千差萬別。
    • 當(dāng)下火熱的微服務(wù),也是基于這種思想。
    • 技術(shù)實(shí)現(xiàn)方式也有很多
      • SOA、服務(wù)化
      • 中心化的 gataway方式
      • 消息隊(duì)列
      • 不同服務(wù)訪問同一個(gè)DB等
  • 分布式服務(wù)
image.png

大型網(wǎng)站架構(gòu)演化的價(jià)值觀

網(wǎng)站的價(jià)值在于它能為用戶提供什么價(jià)值,在于網(wǎng)站能做什么,而不在于它是怎么做的。因此對(duì)于小型網(wǎng)站來說,最需要做的是位用戶提供好的服務(wù)來創(chuàng)造價(jià)值,得到用戶的認(rèn)可,從而活下去,野蠻生長(zhǎng)。

  • 大型網(wǎng)站架構(gòu)技術(shù)的核心價(jià)值是隨網(wǎng)站所需靈活應(yīng)對(duì), 它是一個(gè)演化的過程
  • 驅(qū)動(dòng)大型網(wǎng)站技術(shù)發(fā)展的主要力量是網(wǎng)站的業(yè)務(wù)發(fā)展,是業(yè)務(wù)成就了技術(shù),而不是相反。因此要摒棄為了技術(shù)而技術(shù)的套路

網(wǎng)站架構(gòu)設(shè)計(jì)誤區(qū)

  • 一味追求大公司的解決方案
  • 為了技術(shù)而技術(shù)
  • 企圖用技術(shù)解決所有問題

2 架構(gòu)模式

  • 分層,這是在橫向方向?qū)ο到y(tǒng)進(jìn)行切分
    • 分層的挑戰(zhàn)在于必須合理規(guī)劃層次邊界和接口
    • 分層包括物理分層和邏輯分層兩種
  • 分割,這是在縱向方向?qū)ο到y(tǒng)進(jìn)行切分
    • 將不同的功能和服務(wù)分割開來,包裝秤高內(nèi)聚低耦合的模塊單元
  • 分布式
    • 分層和分割的目的在于小模塊便于分布式部署
    • 帶來的問題:
      • 1) 分布式意味著服務(wù)調(diào)用必須通過網(wǎng)絡(luò),需要考慮帶寬的影響;
      • 2) 服務(wù)器越多,宕機(jī)的概率越大
    • 常用的分布式方案:
      • 1) 分布式應(yīng)用和服務(wù);
      • 2) 分布式靜態(tài)資源;
      • 3) 分布式數(shù)據(jù)和存儲(chǔ);
      • 4) 分布式計(jì)算;
      • 5) 分布式配置、分布式鎖、分布式文件系統(tǒng)。。。
  • 集群,即多臺(tái)服務(wù)器部署相同的應(yīng)用,從而構(gòu)成一個(gè)集群,通過負(fù)載均衡設(shè)備共同對(duì)外提供服務(wù)
    • 即使訪問量很小的分布式應(yīng)用和服務(wù),也至少要部署到兩臺(tái)服務(wù)器來構(gòu)成一個(gè)小集群,這樣可以提高系統(tǒng)的可用性
  • 緩存,即將數(shù)據(jù)放在距離計(jì)算最近的位置以加快處理速度
    • CDN
    • 反向代理
    • 本地緩存
    • 分布式緩存
  • 異步,業(yè)務(wù)之間的消息傳遞不是同步調(diào)用,而是將一個(gè)業(yè)務(wù)操作分成多個(gè)階段,每個(gè)階段之間通過共享數(shù)據(jù)的方法異步進(jìn)行協(xié)作
    • 通常需要使用消息隊(duì)列
    • 帶來的好處:
    • 1) 提高系統(tǒng)可用性;
    • 2) 加快網(wǎng)站響應(yīng)速度;
    • 3) 消除并發(fā)訪問高峰
  • 冗余
    • 集群帶來的必然結(jié)果
    • 安全需求的必然結(jié)果
  • 自動(dòng)化,DevOps思維,盡量減少人工干預(yù)
    • 自動(dòng)化發(fā)布
    • 自動(dòng)化代碼管理
    • 自動(dòng)化測(cè)試
    • 自動(dòng)化安全監(jiān)測(cè)
    • 自動(dòng)化部署
    • 自動(dòng)化監(jiān)控
    • 自動(dòng)化報(bào)警
    • 自動(dòng)化失效轉(zhuǎn)移、恢復(fù)
    • 自動(dòng)化分配資源
    • ......
  • 安全

3 大型網(wǎng)站核心架構(gòu)要素

  • 性能
    • 一個(gè)性能問題可能會(huì)導(dǎo)致網(wǎng)站用戶嚴(yán)重流失
    • 衡量性能的指標(biāo):響應(yīng)時(shí)間、TPS、系統(tǒng)性能計(jì)數(shù)器等
  • 可用性
    • 沒有網(wǎng)站可以完美的7*24運(yùn)行
    • 網(wǎng)站高可用結(jié)構(gòu)的前提是必然會(huì)出現(xiàn)服務(wù)器宕機(jī),兒高可用設(shè)計(jì)的目標(biāo)是當(dāng)服務(wù)器宕機(jī)時(shí),服務(wù)或者應(yīng)用依然可用
    • 必要的手段是集群,即冗余
  • 伸縮性,即通過不斷向集群中加入服務(wù)器的手段來環(huán)節(jié)不斷上升的用戶并發(fā)訪問壓力和不斷增長(zhǎng)的數(shù)據(jù)存儲(chǔ)需求
    • 衡量標(biāo)準(zhǔn):是否可以構(gòu)建集群;是否可以方便的向集群中添加新的服務(wù)器
  • 擴(kuò)展性,直接關(guān)注網(wǎng)站的功能,保證可以快速響應(yīng)需求變更
    • 衡量標(biāo)準(zhǔn): 網(wǎng)站增加新的業(yè)務(wù)產(chǎn)品時(shí),是否對(duì)現(xiàn)有業(yè)務(wù)透明無影響
  • 安全性
    • 衡量標(biāo)準(zhǔn): 針對(duì)現(xiàn)存和潛在的各種攻擊和竊密手段,是否可以有效的應(yīng)對(duì)

4 瞬時(shí)響應(yīng) - 網(wǎng)站的高性能架構(gòu)

不同視角下的網(wǎng)站性能

  • 用戶視角
    • 主要是端到端的感覺
    • 主要通過前段優(yōu)化的手段來提升用戶體驗(yàn)
  • 開發(fā)人員視角
    • 主要關(guān)注應(yīng)用程序本身以及相關(guān)子系統(tǒng)的性能,包括響應(yīng)延遲、系統(tǒng)吞吐量、并發(fā)處理能力、系統(tǒng)穩(wěn)定性等
    • 主要優(yōu)化手段: 使用緩存加速數(shù)據(jù)讀取、使用集群提高吞吐能力、使用異步消息加快請(qǐng)求響應(yīng)、使用代碼優(yōu)化提升程序性能
  • 運(yùn)維人員視角
    • 主要關(guān)注基礎(chǔ)設(shè)施性能和資源利用率
    • 主要優(yōu)化手段: 建設(shè)優(yōu)化骨干網(wǎng)、使用高性價(jià)比定制服務(wù)器、利用虛擬化技術(shù)優(yōu)化資源利用率

性能測(cè)試指標(biāo)

  • 響應(yīng)時(shí)間,即應(yīng)用執(zhí)行一個(gè)操作需要的時(shí)間,包括從發(fā)出請(qǐng)求開始到收到最后響應(yīng)數(shù)據(jù)所需要的時(shí)間
  • 并發(fā)數(shù),即系統(tǒng)能夠同時(shí)處理的請(qǐng)求的數(shù)目,也反映了系統(tǒng)的負(fù)載特性
  • 吞吐量,即單位時(shí)間內(nèi)系統(tǒng)處理的請(qǐng)求數(shù)量,體現(xiàn)系統(tǒng)的整理處理能力
  • 性能計(jì)數(shù)器, 描述服務(wù)器或者操作系統(tǒng)性能的一些數(shù)據(jù)指標(biāo)

性能測(cè)試方法

  • 性能測(cè)試,以系統(tǒng)設(shè)計(jì)初期規(guī)劃的性能指標(biāo)為預(yù)期目標(biāo),對(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è)試,超過安全負(fù)載的情況下,繼續(xù)對(duì)系統(tǒng)增壓,直到系統(tǒng)崩潰或者不能再處理任何請(qǐng)求
  • 穩(wěn)定性測(cè)試,在特定硬件、軟件、網(wǎng)絡(luò)情況下,給系統(tǒng)加載一定壓力,是系統(tǒng)運(yùn)行較長(zhǎng)一段時(shí)間,來觀察系統(tǒng)是否穩(wěn)定

Web前端優(yōu)化

  • 瀏覽器訪問優(yōu)化
    • 減少http請(qǐng)求
    • 使用瀏覽器緩存
    • 啟用壓縮
    • CSS放在頁面最上面,JavaScript放在頁面最下面
    • 減少Cookie傳輸
  • CDN加速
  • 反向代理

應(yīng)用服務(wù)器性能優(yōu)化

  • 分布式緩存
    • 緩存從本質(zhì)上來說,就是一個(gè)內(nèi)存hash表
    • 緩存需要緩存那些讀寫比很高、很少變化的數(shù)據(jù),一般來說讀寫比在2:1以上時(shí),緩存才有意義
    • 應(yīng)用程序讀取數(shù)據(jù)時(shí),首先到緩存中讀取,如果緩存不存在或者已失效,再訪問數(shù)據(jù)庫,同時(shí)將新的數(shù)據(jù)放入緩存
    • 緩存也需要注意緩存熱點(diǎn)數(shù)據(jù)
    • 緩存預(yù)熱,在新啟動(dòng)的緩存系統(tǒng)中,在啟動(dòng)時(shí)就加載熱點(diǎn)數(shù)據(jù),這樣啟動(dòng)后就可以直接使用
    • 緩存穿透, 應(yīng)用持續(xù)大量訪問不存在的數(shù)據(jù),因?yàn)檫@類數(shù)據(jù)不存在于緩存中,因此會(huì)大量訪問數(shù)據(jù)庫,從而降低性能
    • 對(duì)于分布式緩存來說,目前有兩類:
      • 1)不同的緩存服務(wù)器之間進(jìn)行通信,例如JBoss Cache;
      • 2)不同緩存服務(wù)器之間不進(jìn)行通信,例如Memcached
    • 異步操作
      • 一般會(huì)使用消息隊(duì)列,帶來的額外好處是會(huì)削平峰值
    • 使用集群

代碼優(yōu)化

  • 多線程
    • 需要注意線程安全問題,方法:
      • 1) 將對(duì)象設(shè)計(jì)成無狀態(tài)對(duì)象;
      • 2) 使用局部對(duì)象;
      • 3) 并發(fā)訪問資源時(shí)使用鎖
  • 資源復(fù)用
    • 主要是單例和資源池(對(duì)象池)
  • 數(shù)據(jù)結(jié)構(gòu),選擇合適的算法
  • 垃圾回收
    • 合理設(shè)置垃圾回收策略
  • 存儲(chǔ)性能優(yōu)化
    • 機(jī)械硬盤 vs 固態(tài)硬盤
    • B+樹 vs LSM樹
    • RAID vs HDFS

5 萬無一失 - 網(wǎng)站的高可用架構(gòu)

網(wǎng)站可用性度量

  • 網(wǎng)站不可用時(shí)間 = 故障修復(fù)時(shí)間點(diǎn) - 故障發(fā)現(xiàn)時(shí)間點(diǎn)
  • 網(wǎng)站年度可用性指標(biāo) = (1 - 網(wǎng)站不可用時(shí)間/年度總時(shí)間)* 100%
    • 一般以幾個(gè)9來表示,2個(gè)9是基本可用,網(wǎng)站年度不可用時(shí)間小于88小時(shí);3個(gè)9是較高可用,網(wǎng)站年度不可用時(shí)間小于9小時(shí);4個(gè)9是具有自動(dòng)恢復(fù)能力的高可用,網(wǎng)站年度不可用時(shí)間小于53分鐘;5個(gè)9是極高可用性,網(wǎng)站年度不可用時(shí)間小于5分鐘
      網(wǎng)站高可用架構(gòu)的設(shè)計(jì)目標(biāo)是保證服務(wù)器硬件故障時(shí)服務(wù)依然可用、數(shù)據(jù)依然保存并能夠被訪問
      網(wǎng)站高可用架構(gòu)的主要手段:數(shù)據(jù)和服務(wù)的冗余備份以及失效轉(zhuǎn)移,一旦服務(wù)器宕機(jī),就將服務(wù)切換至其他可用的服務(wù)器上。

高可用的應(yīng)用

無狀態(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)求提交到任何一個(gè)服務(wù)器上,處理的結(jié)構(gòu)都是相同的

  • 通過負(fù)載均衡進(jìn)行無狀態(tài)服務(wù)的失效轉(zhuǎn)移
    • 負(fù)載均衡: 主要使用在業(yè)務(wù)量和數(shù)據(jù)量較高的情況下,當(dāng)單臺(tái)服務(wù)器不足以承擔(dān)所有的負(fù)載壓力時(shí),通過負(fù)載均衡手段,將流量和數(shù)據(jù)分?jǐn)偟揭粋€(gè)集群組成的多臺(tái)服務(wù)器上, 以提升整體的負(fù)載處理能力
  • 應(yīng)用服務(wù)器集群的Session管理
    • Session復(fù)制
    • Session綁定
    • 利用Cookie記錄Session
    • Session服務(wù)器

高可用的服務(wù)

  • 分級(jí)管理
    • 核心服務(wù)與非核心服務(wù)隔離
    • 核心服務(wù)優(yōu)先使用高性能服務(wù)器
  • 超時(shí)設(shè)置
  • 異步調(diào)用
    • 必須滿足可以使用異步調(diào)用方式
  • 服務(wù)降級(jí)
  • 冪等性設(shè)計(jì)
  • 服務(wù)高可用(高可靠)一直是美團(tuán)外賣的第一要求,為了提高可用性,做了很多策略,包括并不限于上文提出的各種架構(gòu)設(shè)計(jì)方案。
  • 其實(shí)造成線上問題的很大一部分原因是由于發(fā)版造成的,也體現(xiàn)出了SOP的重要性。
  • 關(guān)于降級(jí)與依賴隔離,可以考慮采用Hystrix實(shí)現(xiàn)自動(dòng)降級(jí)與依賴隔離 。

高可用的數(shù)據(jù)

數(shù)據(jù)一旦出現(xiàn)問題,對(duì)于網(wǎng)站往往是毀滅性的打擊,因此保護(hù)網(wǎng)站的數(shù)據(jù)就是保護(hù)企業(yè)的命脈。

  • 主要手段:數(shù)據(jù)備份和失效轉(zhuǎn)移

  • 緩存服務(wù)高可用

    • 觀點(diǎn)一:緩存服務(wù)已經(jīng)承擔(dān)了業(yè)務(wù)中絕大多數(shù)的數(shù)據(jù)讀取訪問,因此需要同樣保證高可用
    • 觀點(diǎn)二:緩存服務(wù)并不是數(shù)據(jù)存儲(chǔ)服務(wù),出現(xiàn)服務(wù)不可用導(dǎo)致數(shù)據(jù)丟失應(yīng)從別的手段解決,而不是提高緩存服務(wù)本身高可用
    • 緩存服務(wù)器集群中單機(jī)故障,集群規(guī)模較大時(shí),數(shù)據(jù)丟失比例和數(shù)據(jù)負(fù)載壓力影響很小。
  • CAP原理: 一個(gè)提供數(shù)據(jù)服務(wù)的存儲(chǔ)系統(tǒng)無法同時(shí)滿足數(shù)據(jù)一致性(Consistency)、數(shù)據(jù)可用性(Availibility)、分區(qū)耐受性(Parition Tolerance)這三個(gè)條件

  • 數(shù)據(jù)高可用含義:

    • 1)數(shù)據(jù)持久性
      • 同時(shí)寫入數(shù)據(jù)副本
    • 2)數(shù)據(jù)可訪問性
      • 多個(gè)副本可讀
    • 3)數(shù)據(jù)一致性
      • 副本間數(shù)據(jù)一致
  • 數(shù)據(jù)一致性分類:
    * 1) 數(shù)據(jù)強(qiáng)一致;
    * 2) 數(shù)據(jù)用戶一致;
    * 3) 數(shù)據(jù)最終一致

  • 數(shù)據(jù)備份

    • 冷備的優(yōu)點(diǎn)是簡(jiǎn)單和廉價(jià),成本和技術(shù)難度較低,缺點(diǎn)是不能保證數(shù)據(jù)最終一致
    • 熱備分為兩種:
      • 1) 異步熱備;
      • 2) 同步熱備
  • 失效轉(zhuǎn)移

    • 失效確認(rèn):
      • 1) 心跳檢測(cè)(Keepalived、Heartbeat);
      • 2) 應(yīng)用程序訪問失敗報(bào)告
    • 訪問轉(zhuǎn)移
    • 數(shù)據(jù)恢復(fù)

高可用網(wǎng)站的軟件質(zhì)量保證

  • 網(wǎng)站發(fā)布,它的過程和服務(wù)器宕機(jī)效果箱單,其對(duì)系統(tǒng)可用性的影響也 類似
    • 一般采取批量更新的方式進(jìn)行,不會(huì)一次關(guān)掉集群中的全部服務(wù)器
  • 自動(dòng)化測(cè)試
    • 一般使用Selenium來進(jìn)行測(cè)試
  • 預(yù)發(fā)布驗(yàn)證
    • 預(yù)發(fā)布服務(wù)器是一種特殊用途的服務(wù)器,它和線上的正式服務(wù)器唯一的區(qū)別是沒有配置在負(fù)載均衡服務(wù)器上,外部用戶無法訪問
  • 代碼控制
    • 主干開發(fā),分支發(fā)布
    • 分支開發(fā),主干發(fā)布,這是目前使用的主流方式
  • 自動(dòng)化發(fā)布
    • 火車模型:將每個(gè)應(yīng)用的發(fā)布過程看做一次火車旅程,火車定點(diǎn)運(yùn)行,期間有若干站點(diǎn),每一站都進(jìn)行例行檢查,不通過的項(xiàng)目下車,通過的項(xiàng)目繼續(xù)坐著火車旅行,直到火車到達(dá)終點(diǎn)。
    • 實(shí)際中,可能所有項(xiàng)目在途中都下車了,這樣火車不得不回到原點(diǎn),等待問題解決后再來一次
    • 一種可能是火車上的重點(diǎn)項(xiàng)目如果失敗,那么整趟火車需要返回
    • 人的干預(yù)越少,自動(dòng)化程度越高,引入故障的可能性就越小
  • 灰度發(fā)布
    • 大型網(wǎng)站都會(huì)使用灰度發(fā)布模式,將集群服務(wù)器分成若干部分,每天只發(fā)布一部分服務(wù)器,觀察運(yùn)行穩(wěn)定沒有故障,第二天繼續(xù)發(fā)布一部分服務(wù)器,持續(xù)幾天你才把整個(gè)集群全部發(fā)布完畢,期間如果發(fā)現(xiàn)問題,只需要回滾已發(fā)布的一部分服務(wù)器即可

網(wǎng)站運(yùn)行監(jiān)控

  • 監(jiān)控?cái)?shù)據(jù)采集
    • 用戶行為日志收集
    • 服務(wù)器性能監(jiān)控
    • 運(yùn)行數(shù)據(jù)報(bào)告
  • 監(jiān)控管理
    • 系統(tǒng)報(bào)警
    • 失效轉(zhuǎn)移
    • 自動(dòng)優(yōu)雅降級(jí)

6 永無止境 - 可伸縮性架構(gòu)

網(wǎng)站伸縮性: 在不需要改變網(wǎng)站的軟硬件設(shè)計(jì),僅僅通過改變部署的服務(wù)器數(shù)量就可以擴(kuò)大或者縮小網(wǎng)站的服務(wù)處理能力

網(wǎng)站架構(gòu)的伸縮性設(shè)計(jì)

  • 不同功能進(jìn)行物理分離實(shí)現(xiàn)伸縮
  • 單一功能通過集群規(guī)模實(shí)現(xiàn)伸縮

應(yīng)用服務(wù)器集群的伸縮性設(shè)計(jì)

  • HTTP重定向負(fù)載均衡
  • DNS域名解析負(fù)載均衡
  • 反向代理負(fù)載均衡
  • IP負(fù)載均衡
  • 數(shù)據(jù)鏈路層負(fù)載均衡
  • 負(fù)載均衡算法
    • 輪詢
    • 加權(quán)輪詢
    • 隨機(jī)
    • 最小鏈接
    • 原地址散列

分布式緩存集群的伸縮性設(shè)計(jì)

  • Memcached分布式緩存集群的訪問模型
    • 用程序通過Memcached客戶端訪問Memcached服務(wù)器集群,Memcached客戶端主要由一組API、Memcached服務(wù)器集群路由算法、Memcached服務(wù)器集群列表以及通信模塊構(gòu)成
    • 路由算法負(fù)責(zé)根據(jù)應(yīng)用程序輸入的緩存數(shù)據(jù)KEY計(jì)算得到應(yīng)該將數(shù)據(jù)寫入到Memcached的哪臺(tái)服務(wù)器(寫緩存)或者應(yīng)該從哪臺(tái)服務(wù)器讀數(shù)據(jù)(讀緩存)
  • Memcached分布式緩存集群的伸縮性挑戰(zhàn)
    • 挑戰(zhàn)主要針對(duì)路由算法,當(dāng)集群擴(kuò)容時(shí),如何保證路由算法可以得到新加入的服務(wù)器?
    • 解決方法: 在網(wǎng)站訪問量最少的時(shí)候擴(kuò)容,然后通過模擬請(qǐng)求的方法逐漸預(yù)熱緩存,使得緩存服務(wù)器中的數(shù)據(jù)重新分布
  • 分布式緩存的一致性Hash算法

數(shù)據(jù)存儲(chǔ)服務(wù)器集群的伸縮性設(shè)計(jì)

  • 數(shù)據(jù)存儲(chǔ)服務(wù)器必須保證數(shù)據(jù)的可靠存儲(chǔ),任何情況下都必須保證數(shù)據(jù)的可用性和正確性
  • 關(guān)系數(shù)據(jù)庫集群的伸縮性設(shè)計(jì)
    • 利用主從結(jié)構(gòu)實(shí)現(xiàn)讀寫分離
    • 根據(jù)不同業(yè)務(wù)的數(shù)據(jù),放到不同的數(shù)據(jù)庫集群中,即數(shù)據(jù)庫分庫
    • 對(duì)于特別大的表,進(jìn)行分片處理
  • NoSQL數(shù)據(jù)庫的伸縮性設(shè)計(jì)
    • HBase

7 隨需應(yīng)變 - 可擴(kuò)展架構(gòu)

可擴(kuò)展性:在對(duì)現(xiàn)有系統(tǒng)影響最小的情況下,系統(tǒng)功能可持續(xù)擴(kuò)展或者提升的能力

實(shí)現(xiàn)可擴(kuò)展的手段:低耦合,高內(nèi)聚

利用分布式消息隊(duì)列降低系統(tǒng)耦合性

  • 事件驅(qū)動(dòng)架構(gòu)(Event Driven Architecture)
    • 定義:通過在低耦合的模塊之間傳輸事件消息,以保持模塊的松散耦合,并借助事件消息的通信完成模塊間合作。典型的場(chǎng)景是生產(chǎn)著消費(fèi)者模型
  • 分布式消息隊(duì)列

利用分布式服務(wù)打造可服用的業(yè)務(wù)平臺(tái)

  • 需要將超大型的、復(fù)雜系統(tǒng)查分成可獨(dú)立部署的模塊,從而降低耦合性
  • Web Service與企業(yè)分布式服務(wù)
    • Web Service比較臃腫,可以考慮使用REST
    • 或者使用開源的解決方案,例如Dubbo

可擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)

8 固若金湯 - 安全架構(gòu)

典型攻擊方式

  • XSS攻擊(跨站腳本攻擊)
    • 黑客通過篡改網(wǎng)頁,注入惡意HTML腳本,在用戶瀏覽網(wǎng)頁時(shí),控制用戶瀏覽器進(jìn)行惡意操作的一種攻擊方式
    • 分類:
      • 1) 反射型;
      • 2) 持久型
    • 解決方法:
      • 1) 消毒;
        1. HttpOnly
  • 注入攻擊
    • 分類:
      • 1) SQL注入攻擊;
      • 2) OS注入攻擊
    • 解決方法:
      • 1) 消毒;
      • 2) 參數(shù)綁定
  • CSRF攻擊(跨站點(diǎn)請(qǐng)求偽造)
    • 攻擊者通過跨站請(qǐng)求,以合法用戶的身份進(jìn)行非法操作
    • 解決方法: 識(shí)別請(qǐng)求者身份:
      • 1) 表單Token;
      • 2) 驗(yàn)證碼;
      • 3) Referer check
  • 其他攻擊方式
    • Error Code,可能顯示異常堆棧,從而暴露危險(xiǎn)信息,解決方法:使用統(tǒng)一的500頁面
    • HTML注釋,注釋可能會(huì)暴露危險(xiǎn)信息,解決方法:code review或者自動(dòng)掃描
    • 文件上傳,可能上傳病毒文件,解決方法:設(shè)置上傳文件白名單,只允許上傳指定類型的文件
    • 路徑遍歷, 在URL中使用相對(duì)路徑,遍歷系統(tǒng)未開放的目錄和文件,解決方法: 將資源文件部署在獨(dú)立的服務(wù)器上,使用獨(dú)立域名

信息加密技術(shù)以及密鑰管理

  • 單項(xiàng)散列加密,包括MD5、SHA等
  • 對(duì)稱加密, 包括DES算法、RC算法等
  • 非對(duì)稱加密, 包括RSA算法等
  • 密鑰安全管理
    • 將密鑰和算法放在一個(gè)獨(dú)立的服務(wù)器上,甚至做成一個(gè)專用的硬件設(shè)置,對(duì)外提供加密和解密服務(wù)
    • 將加解密算法放在應(yīng)用系統(tǒng)中,密鑰則放在獨(dú)立服務(wù)器中,在存儲(chǔ)時(shí),將密鑰切分成數(shù)片,分別存儲(chǔ)在不同的介質(zhì)中

后記

  1. 在大型網(wǎng)站的建設(shè)中,千萬不要一味遵循一些所謂的標(biāo)準(zhǔn),因?yàn)橛行?biāo)準(zhǔn)的指定根本不是針對(duì)大型網(wǎng)站系統(tǒng)的。
  2. 不能為了技術(shù)而技術(shù),能落地的架構(gòu)才是好架構(gòu),架構(gòu)設(shè)計(jì)不能堆砌概念和模式,不能面面俱到卻不解決具體問題。
  3. 做架構(gòu)設(shè)計(jì)的目的不是為了炫耀自己知道多少術(shù)語。
  4. 不要企圖去設(shè)計(jì)一個(gè)大型網(wǎng)站
    • 尤其很多傳統(tǒng)企業(yè)進(jìn)入互聯(lián)網(wǎng)時(shí),會(huì)試圖在互聯(lián)網(wǎng)領(lǐng)域開發(fā)一個(gè)大型網(wǎng)站復(fù)制其在傳統(tǒng)行業(yè)的優(yōu)勢(shì)地位,但是互聯(lián)網(wǎng)發(fā)展運(yùn)行有其自己的規(guī)律,短暫的互聯(lián)網(wǎng)歷史已經(jīng)一再證明這種企圖是行不通的。
    • 互聯(lián)網(wǎng)沒有門檻,誰都可以進(jìn)來玩,但是進(jìn)來后,最好把那些陳舊的思想和包袱放下。
    • 互聯(lián)網(wǎng)是一種精神,一種開發(fā)、分享、自由的精神;越是不計(jì)回報(bào)越是獲得豐厚的回報(bào)。
  5. 架構(gòu)師人在職場(chǎng),需要處理好個(gè)人、團(tuán)隊(duì)、公司的利益。需要不斷在工作中發(fā)現(xiàn)問題、解決問題,提升工作經(jīng)驗(yàn)、知識(shí)技能和核心競(jìng)爭(zhēng)力,擴(kuò)大自身影響力。
    • 新員工首先要做的事情是融入團(tuán)隊(duì),等熟悉了情況,再尋找突破口,擇機(jī)而動(dòng)
    • 新員工最不需要做的事情就是證明自己的能力。
    • 把“我的問題”表述成“我們的問題”
    • 給上司提封閉式問題,給下屬提開放式問題
    • 支出問題而不是批評(píng)人
    • 用贊同的方式提出問題
    • 在解決我的問題之前,先解決你的問題
    • 適當(dāng)?shù)奶颖軉栴}
  6. 架構(gòu)師領(lǐng)導(dǎo)藝術(shù)
    • 關(guān)注人而不是產(chǎn)品
      • 一群優(yōu)秀的人做一件他們熱愛的事,一定能取得成功
      • 尋找一個(gè)值得共同奮斗的目標(biāo),營(yíng)造一個(gè)讓大家都能最大限度發(fā)揮自我價(jià)值的工作氛圍
    • 發(fā)掘人的優(yōu)秀
      • 是事情成就了人,而不是人成就了事
      • 共享美好藍(lán)圖
    • 共同參與架構(gòu)
      • 不要只有架構(gòu)師一個(gè)人擁有架構(gòu)
      • 讓其他人維護(hù)框架與架構(gòu)文檔
    • 學(xué)會(huì)妥協(xié)
    • 成就他人

歡迎關(guān)注 高廣超的簡(jiǎn)書博客 與 收藏文章 !

個(gè)人介紹:

** 高廣超** :多年一線互聯(lián)網(wǎng)研發(fā)與架構(gòu)設(shè)計(jì)經(jīng)驗(yàn),擅長(zhǎng)設(shè)計(jì)與落地高可用、高性能互聯(lián)網(wǎng)架構(gòu)。目前就職于美團(tuán)網(wǎng),負(fù)責(zé)核心業(yè)務(wù)研發(fā)工作。

本文首發(fā)在 高廣超的簡(jiǎn)書博客 轉(zhuǎn)載請(qǐng)注明!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容