嘮叨幾句
一個成熟的大型網站(如淘寶描扯、天貓、騰訊等)的系統架構并不是一開始設計時就具備完整的高性能趟薄、高可用绽诚、高伸縮等特性的,它是隨著用戶量的增加杭煎,業(yè)務功能的擴展逐漸演變完善的恩够,在這個過程中,開發(fā)模式羡铲、技術架構蜂桶、設計思想也發(fā)生了很大的變化,就連技術人員也從幾個人發(fā)展到一個部門甚至一條產品線也切。所以成熟的系統架構是隨著業(yè)務的擴展而逐步完善的扑媚,并不是一蹴而就;不同業(yè)務特征的系統雷恃,會有各自的側重點疆股,例如:淘寶,要解決海量的商品信息的搜索倒槐、下單旬痹、支付,例如騰訊导犹,要解決數億用戶的實時消息傳輸唱凯,百度它要處理海量的搜索請求,他們都有各自的業(yè)務特性谎痢,系統架構也有所不同磕昼。盡管如此我們也可以從這些不同的網站背景下,找出其中共用優(yōu)化的技術节猿,這些優(yōu)化技術和手段廣泛運用在大型網站系統的架構中票从,下面讓我們來認識這些優(yōu)化性能的技術和手段。
改善網站性能的幾大手段
最開始的網站架構
最初業(yè)務量不大滨嘱,訪問量小峰鄙,此時的架構,應用程序太雨、數據庫吟榴、文件都部署在一臺服務器上,有些甚至僅僅是租用主機空間囊扳。
1. 應用吩翻、數據兜看、文件分離
將應用程序、數據庫狭瞎、文件各自部署在獨立的服務器上细移,并且根據服務器的用途配置不同的硬件,達到最佳的性能效果熊锭。
2. 利用緩存改善網站性能
大部分網站訪問都遵循28原則,即80%的訪問請求弧轧,最終落在20%的數據上,所以我們可以對熱點數據進行緩存,減少熱點數據的訪問路徑碗殷,提高用戶體驗精绎。緩存實現常見的方式是本地緩存、分布式緩存亿扁。當然還有CDN捺典、反向代理鸟廓。
2.1 本地緩存
本地緩存从祝,顧名思義是將數據緩存在應用服務器本地,可以存在內存中引谜,也可以存在文件牍陌,組件。本地緩存的特點是速度快员咽,但因為本地空間有限所以緩存數據量也有限毒涧。OSCache就是常用的本地緩存。
2.2 分布式緩存
分布式緩存的特點是贝室,可以緩存海量的數據契讲,并且擴展非常容易,在門戶類網站中常常被使用滑频,速度按理沒有本地緩存快捡偏,常用的分布式緩存是Memcached、Redis峡迷。
2.3 反向代理
部署在網站的機房银伟,當用戶請求達到時首先訪問反向代理服務器,反向代理服務器將緩存的數據返回給用戶绘搞,如果沒有緩存數據才會繼續(xù)訪問應用服務器獲取彤避,這樣做減少了獲取數據的成本。反向代理有Squid夯辖,Nginx琉预。
2.4 CDN
假設我們的服務器都部署在杭州的機房,對于浙江的用戶來說訪問是較快的蒿褂,而對于北京的用戶訪問是較慢的圆米,這是由于浙江和北京分別屬于電信和聯通的不同發(fā)達地區(qū)尖阔,北京用戶訪問需要通過互聯路由器經過較長的路徑才能訪問到杭州的服務器,返回路徑也一樣榨咐,所以數據傳輸時間比較長介却。對于這種情況,常常使用CDN解決块茁,CDN將數據內容緩存到運營商的機房齿坷,用戶訪問時先從最近的運營商獲取數據,這樣大大減少了網絡訪問的路徑数焊。比較專業(yè)的CDN運營商有藍汛永淌、網宿。
3. 使用集群+負載均衡改善應用服務器性能
應用服務器作為網站的入口佩耳,會承擔大量的請求遂蛀,我們往往通過應用服務器集群來分擔請求數。
應用服務器前面部署負載均衡服務器調度用戶請求干厚,根據分發(fā)策略將請求分發(fā)到多個應用服務器節(jié)點李滴。
常用的負載均衡技術硬件的有F5,價格比較貴一般都在15W以上蛮瞄。
軟件的有LVS所坯、Nginx、HAProxy挂捅。LVS是四層(傳輸層)負載均衡芹助,根據目標地址和端口選擇內部服務器,Nginx和HAProxy是七層(應用層)負載均衡闲先,可以根據報文內容選擇內部服務器状土,因此LVS分發(fā)路徑優(yōu)于Nginx 和HAProxy,性能要高些伺糠,而Nginx和HAProxy則更具配置性蒙谓,如可以用來做動靜分離(根據請求報文特征,選擇靜態(tài)資源服務器還是應用服務器)退盯。
4. 數據庫優(yōu)化
4.1 讀寫分離和分庫分表
隨著用戶量的增加彼乌,數據庫成為最大的瓶頸,改善數據庫性能常用的手段是進行讀寫分離以及分庫分表渊迁,讀寫分離顧名思義就是將數據庫分為讀庫和寫庫慰照,通過主備功能實現數據同步。分庫分表則分為水平切分和垂直切分琉朽,水平切分則是對一個數據庫特大的表進行拆分毒租,例如用戶表。垂直切分則是根據業(yè)務的不同來切分箱叁,如用戶業(yè)務墅垮、商品業(yè)務相關的表放在不同的數據庫中惕医。
4.2 使用NoSql數據庫和搜索引擎
對于海量數據的查詢和分析,我們使用nosql數據庫加上搜索引擎可以達到更好的性能算色。并不是所有的數據都要放在關系型數據中抬伺。常用的NOSQL有mongodb、hbase灾梦、redis峡钓,搜索引擎有l(wèi)ucene、solr若河、elasticsearch能岩。
5. 將應用服務器進行業(yè)務拆分
隨著業(yè)務的擴展,應用程序變得非常臃腫萧福,這時我們需要將應用程序進行業(yè)務拆分拉鹃,如百度分為新聞、網頁鲫忍、圖片等業(yè)務膏燕。每個業(yè)務應用負責相對獨立的業(yè)務運作。業(yè)務之間通過消息進行通信或者共享數據庫來實現饲窿。
6.使用分布式系統
6.1 分布式文件系統
用戶一天天增加煌寇,業(yè)務量越來越大焕蹄,產生的文件越來越多逾雄,單臺的文件服務器已經不能滿足需求,這時就需要分布式文件系統的支撐腻脏。常用的分布式文件系統有GFS鸦泳、HDFS、TFS永品。
GFS(Google File System)可以給大量的用戶提供總體性能較高的服務
? 適合部署在廉價的普通硬件上
? 提供容錯功能
HDFS(Hadoop Distributed File System)能提供高吞吐量的數據訪問做鹰,非常適合大規(guī)模數據集上的應用
? 運行在通用硬件(commodityhardware)
? 高度容錯
? 適合部署在廉價的機器上
TFS(Taobao Flies System)主要針對海量的非結構化數據,提供高可靠和高并發(fā)的存儲訪問
? 高可擴展鼎姐、高可用钾麸、高性能
? 面向互聯網服務
? 適合海量小文件存儲
6.2 分布式服務
各個業(yè)務應用都會使用到一些基本的業(yè)務服務,例如用戶服務炕桨、訂單服務饭尝、支付服務、安全服務献宫,這些服務是支撐各業(yè)務應用的基本要素钥平。我們將這些服務抽取出來利用分部式服務框架搭建分布式服務。阿里的Dubbo是一個不錯的選擇姊途。
小結
完整的系統架構圖如下:
大型網站的架構是根據業(yè)務需求不斷完善的涉瘾,根據不同的業(yè)務特征會做特定的設計和考慮知态,本文只是講述一個常規(guī)大型網站會涉及的一些優(yōu)化技術和手段。