架構系列(一)---大型網站架構演化,要素及性能


大型網站架構演化

目錄

大型網站特點

  • 高並發,大流量
  • 高可用,系統不間斷服務
  • 海量數據,數據量大,需要存儲海量數據
  • 用戶分布廣泛,用戶分布在五湖四海
  • 安全環境惡劣,容易受到受到攻擊
  • 需求變更塊,發布頻繁
  • 漸進式發張,從小型網站慢慢發展為大型系統

大型網站的技術挑戰

  • 高並發訪問
  • 海量的數據

演化發展

  • 一台服務器就足夠,程序,數據庫和文件都在一台服務器上
  • 使用三台服務器,不同特性的服務器負責不同的功能。程序,數據庫和文件分離,應用程序處理大量業務,需要強大的cpu,數據庫需要快速檢索和緩存,需要更快的硬盤和更大的內存,文件則要更大的硬盤
  • 用戶量大以后,數據庫訪問壓力大,所以采用需要采用緩存,由於應用服務器的內存有限,所以采用大內存的緩存服務器
  • 用戶量增大,一台應用服務器壓力大,采用集群的方式來實現負載均衡
  • 緩存不命中的時候,數據庫的壓力增大,配置主從服務器,主數據庫用於寫數據,然后同步到從數據庫,讀的時候讀取從數據庫,實現讀寫分離,從而改善數據庫負載壓力
  • 采用CDN加速,將數據部署在網絡提供商的機房,使用戶在請求網站服務的時候,可以從距離自己最近的網絡提供商機房獲得數據。
  • 通過反向代理加速,當請求到達網站中心機房時候,先到達代理服務器,如果緩存命中的話,直接返回給用戶,這樣的話提高了訪問速度,同時也降低了服務器的負載壓力
  • 一台服務器滿足不了業務需求的增長,采用分布式文件系統和分布式數據庫系統
  • 進行業務拆分,業務日益復雜,將整個業務分成不同的產品線,給不同的業務團隊負責

價值觀

  • 網站的價值在於能給用戶提供什么價值,而不是他是怎么做的
  • 大型網站都是從小型網站一步步發展起來的,小型網站的時候,不要盲目去追求架構,而是首要去為業務創造價值
  • 是業務對架構提出要求,是業務促進技術的發展,是業務成就技術,所以,要對業務懷有感恩之心

網站架構設計誤區

  • 不要盲從別人的經驗,堅持自我
  • 不要為了技術而技術,技術是為業務服務的,關鍵是實現價值,不要以為最求時尚的技術
  • 技術可以解決業務問題,但也可以通過業務的手段去解決

總結

  • 隨着用戶的量的增加,業務的增多,數據量的增大,單機服務器滿足不了需求,所以,架構慢慢進行演化
  • 不要盲目最求新技術,關鍵是實現價值。是業務的需求促進技術的發展,對業務要有感恩之心。

大型網站架構要素

性能

提高手段

  • 瀏覽器緩存,頁面壓縮,減少cookie傳輸
  • cdn加速
  • 反向代理
  • 服務器本地緩存或者分布式緩存
  • 異步操作將用戶請求發送至消息隊列等待后續任務處理
  • 數據庫添加索引,優化sql,緩存

可用性

衡量標准

  • 扣除故障的時間,網站的總可用時間

提高手段

  • 應用部署到多台服務器上同時提供訪問,多台應用服務器通過負載均衡設備組成一個集群對外提供服務,任何一台服務器宕機,將請求切換到其他服務器
  • 對於存儲存儲數據庫,對數據進行實時備份

伸縮性

衡量標准

  • 是否可以用多台服務器構建集群
  • 是否容易向集群添加新的服務器
  • 加入新的服務器后是否提供與原來無差別的服務

擴展性

衡量標准

  • 為網站添加新的業務產品時,是否可以實現對現有產品透明無影響
  • 不需要改動現有業務功能就能上線新的產品
  • 一個產品改動對其他產品無影響

安全性

衡量標准

  • 對現有的和潛在的各種攻擊手段和竊密手段是否有可靠的應對策略

總結

  • 大型網站要素:性能,可用性,伸縮性,擴展性,安全性。

網站的高性能架構

不同人員眼中的性能

用戶角度的性能

  • 對於用戶來說,直觀的就是用戶感受的網站響應的速度,也就訪問后到響應到瀏覽器的時間。而這段時間實際上包括計算機和服務器的時間服務器的處理時間,瀏覽器接受響應數據后渲染到頁面的時間

開發人員角度的性能

  • 響應延遲
  • 系統吞吐量
  • 並發處理能力
  • 系統穩定性

運維人員角度的性能

  • 基礎設施性能和資源利用率,比如服務器硬件,網絡運營商的帶寬能力,服務器和網絡帶寬的資源的利用率

性能測試指標

響應時間

  • 指一個操作從發出請求到響應數據需要的時間
  • 打開一個網站
  • 從數據庫查找記錄
  • 從磁盤讀取數據

並發數

  • 對於網站而言,並發數就是並發用戶數,也就是同時提交請求的用戶數目
  • 系統用戶數(注冊用戶數)>在線用戶(登錄用戶數)>並發用戶數(同時提交請求的用戶數)

吞吐量

  • 單位時間內系統處理的請求數量

性能計數器

  • 系統負載,當前正在被cpu執行和等待被cpu執行的進程數目的總和
  • 對象與線程數
  • 內存使用
  • cpu使用
  • 磁盤和網絡IO

性能測試方法

性能測試

  • 以預期規划的性能指標為預期目標,對系統不斷施加壓力,驗證系統在資源可接受范圍內,是否能達到性能預期

負載測試

  • 對系統不斷地增加並發請求以增加系統壓力,直到系統的某項或多項性能指標達到安全臨界值

壓力測試

  • 超過安全負載的情況下,對系統繼續施加壓力,直到系統崩潰,從而獲得最大承受壓力

穩定性測試

  • 給系統加載一定業務壓力,使系統運行一段較長時間,來檢測系統是否穩定

性能分析

  • 對請求經歷的各個環節進行分析,檢查請求處理的各個環節的日志,分析哪個環節響應時間不合理,然后檢查監控數據,分析影響性能的因素(內存,磁盤,網絡,cpu,代碼等),排查可能出現性能瓶頸的地方。

性能優化

  • 前端優化
  • 應用服務器優化
  • 存儲服務器優化

前端優化

減少http請求

  • http每次請求都需要建立通信鏈路,進行數據傳輸。對於每個請求,服務端需要創建線程去處理。
  • 合並css,js,圖片。將瀏覽器一次訪問需要的css,js,資源合並成一個文件,這樣就可以只用一個請求,減少創造鏈路和服務端服務的開銷

使用瀏覽器緩存

  • 靜態資源(css,js,圖標)更新頻率比較低,可以選擇將他緩存在服務器

啟用壓縮

  • 服務端對文件進行壓縮,減少傳輸的數據的數據量,然后瀏覽器再進行解壓

css和js的順序

  • 瀏覽器加載完所有css才會進行渲染
  • 瀏覽器加載js后立即執行。
  • 如果不將js放在底部,那么可能會在執行js的時候阻塞,造成頁面顯示緩慢。所以css可以放在最上面,js放在最下面

減少cookie傳輸

  • 太大的Cookie會影響數據傳輸
  • 寫入cookie的數據要慎重考慮,盡量減少Cookie的數據量
  • 請求靜態資源發送Cookie是無意義的,服務器並不會對Cookie進行處理,這樣會消耗帶寬。所以靜態資源可以用獨立域名訪問。

CDN加速

  • 所謂CDN實現的就是將資源放在離用戶最近的地方,是用戶快速獲取數據
  • CDN可以緩存靜態資源

反向代理

  • 反向代理服務器配置緩存功能加速請求,當用戶請求靜態資源的時候,直接從反向代理服務器返回

應用服務器性能優化

分布式緩存

異步操作

  • 使用消息隊列將調用異步化
  • 在不使用消息隊列的時候,用戶的請求數據直接寫入數據庫,高並發情況下,會給數據庫服務器造成巨大的壓力。使用消息隊列后,用戶請求的數據發送給消息隊列后直接返回。消費者進程從消息隊列讀取數據,異步寫入數據庫

使用集群

  • 構建服務器集群,將並發請求分發到多台服務器

代碼優化

  • 合理設置線程,IO密集型,線程數最多不超過cpu核心數,IO密集型,多啟動線程充分利用cpu資源
  • 對象池技術和單例模式,減少開銷很大的系統資源的創建和銷毀
  • 不同場景使用合適的數據結構
  • 垃圾回收對系統的性能產生巨大的影響,配置合適的參數進行調優

總結

  • 不同人員的角度對性能的衡量標准不同的。
  • 性能測試指標:響應時間,並發數,吞吐量,性能計數器
  • 性能測試方法:性能測試,負載測試,壓力測試,穩定性測試
  • 性能優化的方法:前端優化,服務端優化,代碼優化,硬件優化

我覺得分享是一種精神,分享是我的樂趣所在,不是說我覺得我講得一定是對的,我講得可能很多是不對的,但是我希望我講的東西是我人生的體驗和思考,是給很多人反思,也許給你一秒鍾、半秒鍾,哪怕說一句話有點道理,引發自己內心的感觸,這就是我最大的價值。(這是我喜歡的一句話,也是我寫博客的初衷)

作者:jiajun 出處: http://www.cnblogs.com/-new/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。如果覺得還有幫助的話,可以點一下右下角的【推薦】,希望能夠持續的為大家帶來好的技術文章!想跟我一起進步么?那就【關注】我吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM