一個成熟的大型網站系統架構演化之路
二、應用、資料、檔案分離
隨著業務的擴充套件,一臺伺服器已經不能滿足效能需求,故將應用程式、資料庫、檔案各自部署在獨立的伺服器上,並且根據伺服器的用途配置不同的硬體,達到最佳的效能效果。
三、利用快取改善網站效能
在硬體優化效能的同時,同時也通過軟體進行效能優化,在大部分的網站系統中,都會利用快取技術改善系統的效能,使用快取主要源於熱點資料的存在,大部分網站訪問都遵循28原則(即80%的訪問請求,最終落在20%的資料上),所以我們可以對熱點資料進行快取,減少這些資料的訪問路徑,提高使用者體驗。
快取實現常見的方式是本地快取、分散式快取。當然還有CDN、反向代理等,這個後面再講。本地快取,顧名思義是將資料快取在應用伺服器本地,可以存在記憶體中,也可以存在檔案,OSCache就是常用的本地快取元件。本地快取的特點是速度快,但因為本地空間有限所以快取資料量也有限。分散式快取的特點是,可以快取海量的資料,並且擴充套件非常容易,在門戶類網站中常常被使用,速度按理沒有本地快取快,常用的分散式快取是Memcached、Redis。
四、使用叢集改善應用伺服器效能
應用伺服器作為網站的入口,會承擔大量的請求,我們往往通過應用伺服器叢集來分擔請求數。應用伺服器前面部署負載均衡伺服器排程使用者請求,根據分發策略將請求分發到多個應用伺服器節點。
常用的負載均衡技術硬體的有F5,價格比較貴,軟體的有LVS、Nginx、HAProxy。LVS是四層負載均衡,根據目標地址和埠選擇內部伺服器,Nginx和HAProxy是七層負載均衡,可以根據報文內容選擇內部伺服器,因此LVS分發路徑優於Nginx和HAProxy,效能要高些,而Nginx和HAProxy則更具配置性,如可以用來做動靜分離(根據請求報文特徵,選擇靜態資源伺服器還是應用伺服器)。
五、資料庫讀寫分離和分庫分表
隨著使用者量的增加,資料庫成為最大的瓶頸,改善資料庫效能常用的手段是進行讀寫分離以及分庫分表,讀寫分離顧名思義就是將資料庫分為讀庫和寫庫,通過主備功能實現資料同步。分庫分表則分為水平切分和垂直切分,水平切分則是對一個數據庫特大的表進行拆分,例如使用者表。垂直切分則是根據業務的不同來切分,如使用者業務、商品業務相關的表放在不同的資料庫中。
六、使用CDN和反向代理提高網站效能
假如我們的伺服器都部署在成都的機房,對於四川的使用者來說訪問是較快的,而對於北京的使用者訪問是較慢的,這是由於四川和北京分別屬於電信和聯通的不同發達地區,北京使用者訪問需要通過互聯路由器經過較長的路徑才能訪問到成都的伺服器,返回路徑也一樣,所以資料傳輸時間比較長。對於這種情況,常常使用CDN解決,CDN將資料內容快取到運營商的機房,使用者訪問時先從最近的運營商獲取資料,這樣大大減少了網路訪問的路徑。比較專業的CDN運營商有藍汛、網宿。
而反向代理,則是部署在網站的機房,當用戶請求達到時首先訪問反向代理伺服器,反向代理伺服器將快取的資料返回給使用者,如果沒有快取資料才會繼續訪問應用伺服器獲取,這樣做減少了獲取資料的成本。反向代理有Squid,Nginx。
七、使用分散式檔案系統
使用者一天天增加,業務量越來越大,產生的檔案越來越多,單臺的檔案伺服器已經不能滿足需求,這時就需要分散式檔案系統的支撐。常用的分散式檔案系統有GFS、HDFS、TFS。
八、使用NoSql和搜尋引擎
對於海量資料的查詢和分析,我們使用nosql資料庫加上搜索引擎可以達到更好的效能。並不是所有的資料都要放在關係型資料中。常用的NOSQL有mongodb、hbase、redis,搜尋引擎有lucene、solr、elasticsearch。
九、將應用伺服器進行業務拆分
隨著業務進一步擴充套件,應用程式變得非常臃腫,這時我們需要將應用程式進行業務拆分,如百度分為新聞、網頁、圖片等業務。每個業務應用負責相對獨立的業務運作。業務之間通過訊息進行通訊或者共享資料庫來實現。
十、搭建分散式服務
這時我們發現各個業務應用都會使用到一些基本的業務服務,例如使用者服務、訂單服務、支付服務、安全服務,這些服務是支撐各業務應用的基本要素。我們將這些服務抽取出來利用分部式服務框架搭建分散式服務。阿里的Dubbo是一個不錯的選擇。
小結
大型網站的架構是根據業務需求不斷完善的,根據不同的業務特徵會做特定的設計和考慮,本文只是講述一個常規大型網站會涉及的一些技術和手段。