前言
- 本文是對《大型網站架構設計》(李智慧 著)一書的梳理,類似文字版的“思維導圖”
- 全文主要圍繞“性能,可用性,伸縮性,擴展性,安全”這五個要素
- 性能,可用性,伸縮性這幾個要素基本都涉及到應用服務器,緩存服務器,存儲服務器這幾個方面
概述
- 三個緯度:演化、模式、要素
- 五個要素: 性能,可用性,伸縮性,擴展性,安全
演化歷程
大型網站架構演化歷程:
- 初始階段的網站架構:一臺服務器,上面同時擁有應用程序,數據庫,文件,等所有資源。例如 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 記錄 SessionSession 服務器
- 高可用的服務:無狀態的服務,可使用類似負載均衡的失效轉移策略,此外還有如下策略分級管理超時設置異步調用服務降級冪等性設計
- 高可用的數據:主要手段是數據備份和失效轉移機制CAP 原理數據一致性(Consisitency)數據可用性(Availibility)分區耐受性(Partition Tolerance)數據備份冷備:缺點是不能保證數據最終一致和數據可用性熱備:分為異步熱備和同步熱備失效轉移:由以下三部分組成失效確認訪問轉移數據恢復
- 高可用網站的軟件質量保證網站發布自動化測試預發布驗證代碼控制主干開發、分支發布分支開發、主干發布自動化發布灰度發布
- 網站運行監控監控數據采集用戶行為日志采集(服務器端和客戶端)服務器性能監控運行數據報告監控管理警報系統失效轉移自動優雅降級
伸縮性
大型網站的“大型”是指:
- 用戶層面:大量用戶及大量訪問
- 功能方面:功能龐雜,產品眾多
- 技術層面:網站需要部署大量的服務器
伸縮性的分為如下幾個方面
- 網站架構的伸縮性設計不同功能進行物理分離實現伸縮縱向分離(分層后分離)橫向分離(業務分割后分離)單一功能通過集群規模實現伸縮
- 應用服務器集群的伸縮性設計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 環,虛擬層)
- 數據存儲服務集群的伸縮性設計關系數據庫集群的伸縮性設計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 CodeHTML 注釋文件上傳路徑遍歷Web 應用防火墻(ModSecurity)網站安全漏洞掃描
- 信息加密技術及密鑰安全管理單向散列加密:不同輸入長度的信息通過散列計算得到固定長度的輸出不可逆,非明文可加鹽(salt)增加安全性輸入的微小變化會導致輸出完全不同對稱加密:加密和解密使用同一個密鑰非對稱加密信息傳輸:公鑰加密,私鑰解密數字簽名:私鑰加密,公鑰解密密鑰安全管理:信息安全傳輸是靠密鑰保證的,改善手段有:把密鑰和算法放在一個獨立的服務器上將加解密算法放在應用系統中,密鑰放在獨立服務器
- 信息過濾與反垃圾文本匹配分類算法黑名單