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