大型網站技術架構核心原理(1)

  • 書籍是人類進步的階梯,字裡行間傳達的是作者縝密的態度、思維的火花。盛世繁華之下,太多的人都伴隨著有生活的窘迫、工作的無奈以及情感的羈絆,煩躁之餘不妨讀一本書,放下不快,或許能給你帶來思維的拓展、情感的愉悅以及內心的寧靜,在此感謝《大型網站技術架構》的作者的分享。私以為,互聯網技術迭代日新月異,但核心架構理念是非常值得學習的,願好書有更多人學習參考,謹以此筆記分享 😃

一、大型網站架構技術演化

  • 核心:技術的更新是因為業務的發展,技術是來解決業務問題的
  • 誤區:技術不能解決所有問題,業務問題需要通過業務手段來解決
  • 要素:性能、可用性、伸縮性、擴展性、安全性這五個特性間的關係需要進行平衡處理
平衡策略
  • 衡量性能的一般指標:
    • 響應時間
    • TPS(TransctionPerSecond,每秒系統能夠處理的交易或事務的數量)
    • 系統性能計數器
  1. 客戶端:

    • 瀏覽器快取、頁面壓縮、減少Cookie傳輸、合理布局頁面
    • 使用 CND加速,靜態資源分發至離用戶最進的網路服務商機房,同時在網站機房部署反向代理伺服器,快取熱點文件,加快請求相應速度,減輕應用伺服器負載壓力
  2. 服務端:

    • 伺服器本地快取和分散式快取
    • 非同步操作,將用戶請求發送至消息隊列等待後續任務處理,當前請求直接返迴響應給用戶
    • 高並發情況下,將多台應用伺服器組成一個集群共同對外服務,提高整體處理能力,改善性能
    • 程式碼中,使用多執行緒、改善記憶體管理等手段優化性能
  3. 資料庫服務端:

    • 索引、快取、SQL優化
    • 使用 NoSQL,通過優化數據模型、存儲結構、伸縮特性等手段
可用性策略
  • 衡量標準:假設任意一台伺服器宕機時,以及出現各種不可預期的問題時,系統整體是否依然可用
  1. 應用伺服器:

    • 多台伺服器通過負載均衡設備組成集群,有個前提,應用伺服器是不你保存會話資訊 ,否則伺服器宕機,即使將用戶請求轉發到其他伺服器上也無法完成業務處理
  2. 存儲伺服器:

    • 數據冗餘備份,宕機時保證數據依然可用
  3. 開發階段:

    • 開發人員程式碼品質保證
    • 自動化測試,自動化發布
伸縮性
  • 衡量標準:是否可以用多台伺服器構建集群,是否容易向集群中添加新的伺服器,加入新伺服器後是否可以提供與原來的伺服器無差別的服務,集群中可容納的伺服器數量是否有限制
  1. 應用伺服器集群:

    • 伺服器上不保存數據,所有伺服器都是對等的,可以通過使用合適負載均衡設備向集群中不斷加入伺服器
  2. 快取伺服器集群:

    • 加入新的伺服器可能會使快取路由失效,進而導致集群中大不符快取數據都無法訪問,如果應用嚴重依賴快取,需要改進快取路由演算法
    • 使用NoSQL資料庫快取,而不是使用 關係型資料庫
擴展性
  • 衡量標準:增加新業務時對現有產品基本透明無影響,或者僅需改動很少既有業務

  • 實現手段:

    • 事件驅動:該類型網站使用消息隊列 實現,消息產生(生產者)和消息處理(消費者)分開,增加小的消息勝者任務或者小的消息消費者任務即可提高系統性能

    • 分散式服務:業務可復用服務 分離開,通過分散式服務框架調用。新增產品可以通過調用可復用的服務實現自身的業務邏輯,而對現有產品牡羊座任何影響

安全性
  • 衡量標準:針對現存或潛在的各種攻擊手段與竊密手段,是否有可靠的應對策略

1. 大型網站演化歷程

  • 思考角度:
    • 單體應用局限性
    • 資料庫分庫分表、主從複製
    • 快取性能、時效性
    • 集群、負載均衡
    • 分散式(業務、文件系統、配置、數據一致性、調度)
    • 非同步
    • 自動化
    • 安全
1.1 單伺服器應用
  • 特點:應用程式、資料庫、文件系統統一放在一個伺服器上
  • 隱患:
    • 資料庫和文件系統會隨著網站運行時間增長,存儲空間不再滿足需求,擴展困難
    • 當用戶量或並發量增大時,應用程式與資料庫間會有爭奪記憶體,很大概率會宕機
1.2 應用服務和數據服務分離
  • 特點:應用服務、資料庫、文件系統 放在不同的伺服器上

    • 應用伺服器部署在CPU有強大計算能力的伺服器上
    • 資料庫伺服器部署在記憶體很大的伺服器上,便於快速磁碟檢索與磁碟快取
    • 文件系統伺服器部署在有大空間的存儲硬碟上
  • 隱患:解決了單伺服器存儲的瓶頸

    • 用戶增多,對資料庫的訪問壓力增大,導致有延遲,影響體驗
1.3 使用快取減小資料庫壓力
  • 特點:經常訪問的數據進行快取,用戶獲取數據時直接從快取中獲取,減小資料庫壓力(二八定律)

    • 本地快取:訪問速度更快,但是受本地記憶體限制,快取數量有限
    • 遠程分散式快取:集群,部署大記憶體的 的伺服器作為專門快取伺服器,可以做到理論上不受記憶體容量限制的快取服務
  • 隱患:單一應用處理請求的連接數有限,應用伺服器成為網站的的瓶頸

  • 解決方案:增加應用伺服器,通過應用伺服器集群,負載均衡調度伺服器來將連接分發到合適的應用伺服器

1.4 解決快取問題:主從複製,讀寫分離
  • 特點:快取過期,或快取訪問不命中,寫操作就會請求訪問資料庫,用戶規模到某一程度時,資料庫會負載壓力過高。

  • 解決方案:通過主庫寫數據 ,然後同步更新到讀數據的 從庫數據伺服器,讀寫分離,降低資料庫壓力

1.5 CDN加速和反向代理加速網站響應
  • 特點:基本原理都是快取,一方面加快訪問速度,一方面降低服務端壓力
    • CDN:用戶請求服務時,從距離自己最近的網路提供商機房獲取數據
    • 反向代理:在服務端,請求發送到服務端後,若服務端有數據則會返回數據;同時反向代理在請求量到一定規模時,也可以通過負載均衡將請求分發的合適的應用伺服器上
1.6 分散式 文件系統 和 分部式 資料庫系統
  • 特點:表單數量過大時採用

  • 解決方案:按業務拆分資料庫

  • 隱患:隨著網站用戶及業務量發展,分散式資料庫不能滿足需求,也需要使用分散式文件系統,這中情況只有在表單規模非常巨大使才使用,常用的資料庫拆分手段是將不同的業務資料庫部署在不同的伺服器上

1.6 使用NoSQL 以及搜索引擎
1.7 業務拆分
  • 特點:每個應用獨立部署,應用間通過超鏈接消息隊列 進行數據分發;或者通過訪問同一個數據存儲系統來構成一個關聯的完整系統
1.8 分散式服務
  • 特點:獨立部署公用業務,由這些可復用的業務連接資料庫,提供共用業務服務。應用系統只需要管理用戶介面,通過分散式服務調用共用業務完成具體業務操作
  • 解決的問題:
    • 資料庫連接有限,公用業務進行資料庫訪問,然後為應用提供數據服務即可,減小數據伺服器壓力
    • 公用業務得到復用,系統更好的維護
1.9 雲計算平台
  • 情景:大型網站通過上述演化,已通過組合和改進現有技術架構解決海量數據的管理 和 高並發事物的處理 。因此大公司可以將這些解決方案應用到網站以外的業務上去,中小型公司不需要關注技術架構問題,直接購買即可獲得更大的存儲空間 和更多的計算資源
  • 特點:成熟的架構體系和資源,大型網站開始搭建雲計算平台 ,為中小型企業提供計算服務;一方面使大型網站本身的資源(伺服器、架構方案),充分得到再利用,另一方面使得中小型公司可以專註業務的發展,不必再架構上試錯 ,通過購買計算服務即可。

2. 大型網站架構模式

2.1 分層
  • 橫向分割(邏輯分層),也在物理層面上分層,將不同層級分別部署在不同的伺服器上

    • 應用層
    • 服務層
    • 數據層
  • 優點

    • 便於分工合作和維護
    • 各層之間具有一定的獨立性,只要維持調用的介面不變,各層可以根據具體問題獨立演化發展,並且不影響其他層
  • 注意事項

    • 各層級不能跨層級調用
    • 必須合理規劃層次邊界和介面
2.2 分割
  • 層級內縱向分割。例應用層可分多個(服務層也可根據需要分層)
    • 搜索
    • 購物
    • 廣告
    • 論壇
2.3 分散式
  • 基礎條件:分層分割 ,將不同模組部署在不同的伺服器是和,通過遠程調用協同工作
  • 實現:分散式用於處理訪問量大和數據量大的應用,通過使用更多的電腦、CPU、記憶體、存儲空間,提高並發訪問量、負載均衡、計算及存儲性能
  • 問題:
    • 宕機:一台伺服器宕機,這太服務的其他子伺服器也不能正常使用,資源浪費,網站可用性降低
    • 網路:網路波動會影響性能
    • 數據:分散式環境中數據保持一致性
2.3.1 分散式應用和服務
  • 基礎條件:應用和服務模組分層分割分散式部署,
  • 優點:
    • 改善網站性能和並發性,加快開發和發布,減少資料庫連接資源損耗
    • 提高服務的復用性 ,便於業務功能的擴展
2.3.2 分散式靜態資源
  • 動靜分離,靜態資源分散式部署減輕應用伺服器的壓力。通過使用獨立域名,由用戶體驗部開發等措施,可以加快瀏覽器並發訪問速度
2.3.3 分散式數據和存儲
2.3.4 分散式計算
  • 計算什麼:搜索引擎的索引構建 和 數據倉庫的數據分析統計
  • 實現:利用 Hadoop 及其MapReduce 分散式計算框架進行批處理計算,優點如下:
    • 計算:移動計算 而不是 移動數據,將計算程式分發到數據所在的位置以加速計算和分散式計算
    • 分散式配置:網站線上伺服器配置實時更新 分散式配置
    • 分散式鎖:分散式環境下實現兵法和協同的分散式鎖
    • 分散式文件系統
2.3.3 集群
  • 相同應用用多台伺服器部署,通過網關控制實現負載均衡,當一台伺服器不能使用了,不會導致應用崩潰
2.3.4 快取
  • 目的:將數據存放在離電腦最近的位置以加快處理速度。
  • 使用快取的條件:
    • 熱點數據應該放在快取中
    • 數據不會在短期失效,否則會產生zhang讀
  • 實現:
    • CDN
    • 反向代理
    • 本地快取
    • 分散式快取
2.3.5 非同步
  • 實現:

    • 單一伺服器:內部通過多執行緒共享記憶體隊列 的方式實現非同步,在業務操作前面的執行緒將輸出寫到隊列中,後面的執行緒從隊列中讀取數據進行處理;
    • 分散式系統中:多個伺服器集群通過分散式消息隊列 實現非同步,分散式消息隊列可以看作記憶體隊列的分散式部署
  • 特點:典型的生產者和消費者模式 ,兩者不存在直接調用,只要保持數據結構不變,彼此功能實現可以隨意變化而不互相影響,這網站擴展新功能非常便利。

  • 優點

    • 提高系統可用性:消費者伺服器故障,生產者伺服器可以繼續處理業務請求;消費者伺服器恢復後,繼續處理消息隊列中的數據
    • 加快網站響應速度:生產者伺服器處理完業務請求後將數據寫入消息隊列,不需要等待消費者伺服器處理就可返回,響應延遲減少
    • 消除並發訪問高峰:並發高峰時,消費者訪問請求放到消息隊列中,等待消費者伺服器依次處理,雖然響應可能會慢點,但是不會對網站負載造成太大的壓力
2.3.6 冗餘
  • 情景:網站需要 7×24 小時連續運行,伺服器規模比較大時,宕機是必然事件。所以避免數據丟失,需要對數據周期進行冗餘備份
  • 常見方式:
    • 冷備份,數據定期備分
    • 熱備份,資料庫主從分離
    • 災備數據重心
2.3.7 自動化
  • 自動化發布
  • 自動化程式碼管理
  • 自動化測試
  • 自動化安全檢測
  • 自動化部署
  • 自動化監控
  • 自動化報警
  • 自動化失效轉移
  • 自動化失效恢復
  • 自動化降級
  • 自動化分配資源
2.3.8 安全
  • 敏感資訊加密
  • 對於常見的攻擊網站的 XSS 攻擊、SQL 注入、進行編碼轉換等相應處理
  • 對垃圾資訊進行過濾
  • 對交易轉賬業務進行風險控制