《大型網站技術架構》學習筆記

第一章: 大型網站的演化

1.1 大型網站軟件系統的特色

  高併發, 大流量:PV量巨大 css

  高可用:7*24小時不間斷服務html

  海量數據:PB級前端

  用戶分佈普遍, 網絡狀況複雜 算法

  安全環境惡劣:大型網站幾乎天天都被攻擊數據庫

  需求快速變動, 發佈頻繁:大型網站每週都有新版本上線瀏覽器

  漸進式發展:大型網站都從小網站發展而來緩存

 

1.2 大型網站架構演化發展歷程

初始階段的網站架構安全

  只用一臺服務器。性能優化

 

應用服務和數據服務分離服務器

  分出了應用, 數據, 文件三臺服務器.

  應用服務器要處理大量的業務, 因此須要更快更強的CPU.

  數據服務器快速磁盤檢索和數據緩存, 須要更快的硬盤和大內存

  文件服務器用於存儲用戶的文件, 須要更大的硬盤

 

使用緩存改善網站性能

  大部分業務訪問集中在一小部分數據上。

  本地緩存:速度快,受應用服務器內存限制

  分佈式緩存服務器(集羣):使用大內存服務器

 

使用應用服務器集羣改善網站的併發處理能力

  經過持續增長應用服務器的方式來改善負載壓力, 實現系統的可伸縮性。

  經過負載均衡調度服務器,將訪問請求分發到應用服務器集羣的任意一臺服務器。

 

數據庫的讀寫分離

  使用緩存後,少部分讀和所有寫仍是要訪問數據庫

  配置主從數據庫. 應用服務器要寫數據時, 訪問主數據庫. 主數據庫經過主從複製機制將數據更新同步到從數據庫.

 

使用反向代理和CDN加速網站響應

  基本原理都是緩存. 區別在於CDN部署在網絡提供商機房中. 而反向代理部署在網站機房中.

  若是反向代理服務器緩存着用戶請求的資源,則直接返回給用戶,下降了服務器的壓力。

  目的都是爲了儘早返回數據給用戶。

 

使用分佈式文件系統和分佈式數據庫系統

  一般使用業務分庫,將不一樣業務的數據部署在不一樣的服務器上。

  單表規模很是龐大時,才使用分佈式數據庫。

 

使用NoSQL和搜索引擎

  NoSQL和搜索引擎都是源自互聯網的技術手段,對可伸縮的分佈式特性具備更好的支持。

  應用服務器則經過一個統一數據訪問模塊訪問各類數據,減輕應用程序管理諸多數據源的麻煩。

 

業務拆分

  將整個網站業務拆分紅不一樣的產品線。

  大型購物網站會將首頁,商鋪,訂單,買家,賣家分紅不一樣的產品線,由不一樣的團隊負責。

  各個應用之間能夠經過一個超連接創建關係,也能夠經過消息隊列進行數據分發。

 

分佈式服務

  好比用戶管理,商品管理這些業務,能夠將共用的業務提取出來,獨立部署

 

 

第二章:大型網站架構模式

分層

  應用層:負責具體業務和視圖展現,如網站首頁,搜索結果展現
  服務層:爲應用層提供服務支持,如用戶管理,購物車
  數據層:提供數據存儲訪問服務
  分層架構是邏輯上的,但物理上也可部署在不一樣的機器上

 

分割

  分割是在縱向方面對軟件進行切分,將不一樣的功能和服務分割開來,包裝成高內聚低耦合的模塊單元,

  有助於軟件開發和維護,還便於不一樣模塊的分佈式部署,提升網站的併發處理能力和功能擴展能力。

 

分佈式

  對於大型網站,分層和分割的一個主要目的就是爲了切分後的模塊便於分佈式部署。

  分佈式可能遇到的問題:

  1. 網絡延遲的影響

  2. 服務器宕機

  3. 數據一致性保證

  4. 開發維護的問題

 

分佈式應用和服務

  應用和服務模塊分佈式部署,便於業務功能擴展

 

分佈式靜態資源 (動靜分離)

  JS、CSS、LOGO圖片等資源獨立部署,採用獨立域名

  分佈式部署減輕應用服務器壓力

  採用獨立域名,加大瀏覽器的併發加載量,讓網站更快的呈如今用戶面前

 

分佈式數據和存儲

  單臺計算機沒法存儲海量數據  

  包括關係數據庫的分佈式和NoSQL的分佈式

 

分佈式計算

  Hadoop及其MapReduce分佈式計算框架,其特色是移動計算而不是移動數據

  分佈式環境下實現併發和協同的分佈式鎖

 

集羣

  多臺服務器部署相同應用構成一個集羣,經過負載均衡設備共同對外提供服務

  當某臺服務器發生故障,負載均衡設備或者系統的失效轉移機制將請求轉發到集羣中的其餘服務器上,提升系統的可用性

 

緩存

  緩存就是將數據存放在距離計算最近的位置,以加快處理速度

  CDN:內容分發網絡,部署在距離用戶最近的網絡服務商,主要緩存網站的一些靜態資源,如視頻網站的熱點內容

  反向代理:部署在網站的前端,無須將請求轉發給應用服務器就能返回給用戶

  本地緩存:在應用服務器中,緩存熱點數據,這樣就不用訪問數據庫了

  分佈式緩存:應用程序經過網絡通訊訪問緩存數據

  緩存的數據應該不能被頻繁修改,且不會很快過時

 

異步

  業務之間的消息傳遞不是同步調用,而是將一個業務操做分紅多個階段,每一個階段之間經過共享數據的方式異步執行進行協做。

  異步架構是典型的生產者消費者模式,二者不存在直接調用,只要保持數據結構不變,彼此功能實現能夠隨意變化而不互相影響,這對網站擴展新功能很是便利。

  異步消息隊列能夠提升系統可用性、加快網站響應速度,消除併發訪問高峯。

 

冗餘

  要想保證在服務器宕機的狀況下網站依然能夠繼續服務,不丟失數據,就須要必定程度的服務器冗餘運行,數據冗餘備份,這樣當某臺服務器宕機時,能夠將其上的服務和數據訪問轉移到其餘機器上。

  數據庫除了按期備份存檔保存實現冷備份以外,爲了保證在線業務高可用,還須要對數據庫進行主從分離,實時同步實現熱備份

 

自動化

在無人值守的狀況下,網站能夠正常運行,一切均可以自動化是網站的理想狀態。目前大型網站的自動化架構設計主要集中在發佈運維方面。 

  ①發佈部署過程自動化;

  ②自動化代碼管理;

  ③自動化測試;

  ④自動化安全監測;

 

安全

  ①經過密碼手機校驗碼進行身份驗證;

  ②對登陸、交易等操做進行加密

  ③使用驗證碼進行識別;

  ④對於常見的XSS攻擊、SQL注入、編碼轉換等進行防範;

  ⑤對垃圾或敏感信息進行過濾

  ⑥對交易轉帳等操做進行風險控制

 

第三章:大型網站核心架構要素

性能

  瀏覽器端:瀏覽器緩存,使用頁面壓縮,合理佈局頁面,減小Cookie傳輸

  CDN:將網站靜態內容分發至離用戶最近的網絡服務商機房

  反向代理:緩存熱點文件,加快請求響應速度,減輕服務器壓力

  應用服務器端:服務器本地緩存和分佈式緩存

  異步:將用戶請求發送至消息隊列等待處理,當前請求直接返回

  集羣:多臺應用服務器組成集羣

  數據庫服務器端:索引,緩存,SQL優化,NoSQL

 

可用性

  冗餘:各服務器互相備份保證總體可用;

  應用服務器端:經過負載均衡設備創建集羣,其中一臺宕機當即切換到其餘服務器繼續提供服務,這就保證了高可用性。

  存儲服務器端:須要對數據進行實時備份,當某臺宕機當即將數據訪問請求轉換到其餘服務器上,並進行數據恢復以保證數據高可用。

 

伸縮性

  伸縮性:經過不斷向集羣中加入服務器的手段來緩解併發訪問的壓力和數據存儲的需求

(1)衡量標準:

  ①是否能夠多臺服務器構建集羣?

  ②是否容易向集羣中添加新服務器?

  ③加入服務器後是否能提供無差異服務?

(2)主要手段:

  ①應用服務器:使用合適的負載均衡設備

  ②緩存服務器:改進緩存路由算法保證緩存數據的可訪問性

  ③數據庫服務器:經過路由區分等手段將多服務器組成一個集羣

 

擴展性

(1)衡量標準:增長新業務時是否能夠實現對現有產品透明無影響

(2)主要手段:

  ①事件驅動架構:利用消息隊列實現;

  ②分佈式服務:將業務和可複用服務分離;

 

安全性

  衡量標準:針對現存和潛在的攻擊竊密手段,是否有可靠的應對策略

 

 

第四章:網站的高性能架構

4.1 網站性能測試

性能測試指標:

  響應時間:應用執行一個操做須要的時間,包括髮出請求到收到最後響應所要的時間。

  測試時一般採用重複測試,一個請求操做重複一萬次,總響應時間之和再除以一萬。

  併發數:系統可以同時處理請求的數目,也指同時提交請求的用戶數目。

  吞吐量:單位時間內系統處理的請求數量。

  性能計數器:描述系統性能的一些數據指標。

性能測試方法:

  ①性能測試;②負載測試;③壓力測試;④穩定性測試;

性能優化策略:

  ①性能分析:檢查請求處理各個環節的日誌,分析哪一個環節響應時間不合理,檢查監控數據分析影響性能的因素;

  ②性能優化:Web前端優化,應用服務器優化,存儲服務器優化;

 

4.2 Web前端性能優化

瀏覽器訪問優化:

  ①減小http請求:由於http是無狀態的,每次請求的開銷都比較昂貴(須要創建通訊鏈路、進行數據傳輸,而服務器端對於每一個http請求都須要啓動獨立的線程去處理);

  減小http的主要手段是合併CSS、合併JS、合併圖片(利用偏移定位image);

  ②使用瀏覽器緩存:設置http頭中Cache-Control和Expires屬性;

  ③啓用壓縮:能夠對html、css、js文件啓用Gzip壓縮,能夠達到較高的壓縮效率,可是壓縮會對服務器及瀏覽器產生必定的壓力;

  ④CSS放頁面最上面,JS放頁面最下面:瀏覽器會在下載徹底部CSS以後纔開始對整個頁面進行渲染,所以最好將CSS放在頁面最上面;

  而瀏覽器在加載JS後會當即執行,有可能會阻塞整個頁面,形成頁面顯示緩慢,所以最好將JS放在頁面最下面;

  ⑤減小Cookie傳輸:一方面,太大的Cookie會嚴重影響數據傳輸;另外一方面,對於某些靜態資源的訪問(如CSS、JS等)發送Cookie沒有意義;

  能夠考慮靜態資源使用獨立域名訪問,避免請求靜態資源時發送Cookie

 

CDN加速:

  CDN(內容分發網絡)仍然是一個緩存,它將數據緩存在離用戶最近的地方,便於用戶以最快速度獲取數據。即所謂的「網絡訪問第一跳」。

  CDN只將訪問頻度很高的熱點內容(例如:圖片、視頻、CSS、JS腳本等訪問頻度很高的內容)進行緩存,能夠極大地加快用戶訪問速度,減小數據中心負載。

 

反向代理:

  反向代理服務器位於網站機房,代理網站Web服務器接收Http請求,對請求進行轉發。

  反向代理服務器具備如下功能:

  ①保護網站安全:任何來自Internet的請求都必須先通過代理服務器;

  ②經過配置緩存功能加速Web請求:減輕真實Web服務器的負載壓力;

  維基百科及某些博客,會把熱門詞條,帖子,博客緩存在反向代理服務器上,動態內容變化時,通知反向代理服務器緩存失效,再從新加載冬天內容。

  ③實現負載均衡:均衡地分發請求,平衡集羣中各個服務器的負載壓力;

 

4.3 應用服務器性能優化

分佈式緩存:

  網站性能優化第必定律:優先考慮使用緩存優化性能

  定義:緩存是指將數據存儲在相對較高訪問速度的存儲介質中(如內存),以供系統進行快速處理響應用戶請求。

 

  緩存本質是一個內存Hash表,數據以(Key,Value)形式存儲在內存中。

  緩存主要用來存放那些讀寫比很高、不多變化的數據,如商品的類目信息、熱門商品信息等。這樣,應用程序讀取數據時,先到緩存中取,如緩存中沒有或失效,再到數據庫中取出,從新寫入緩存以供下一次訪問。

  所以,能夠很好地改善系統性能,提升數據讀取速度,下降存儲訪問壓力

 

  讀寫比高時,緩存纔有意義。熱門微博,緩存後可能會被讀取百萬次。

  緩存超過必定時間失效後,要從數據庫從新加載,失效前可能會有一段時間數據不一致。好比添加了新的分類,但卻沒有顯示。

  緩存預熱:新啓動的緩存系統沒有任何數據,能夠在啓動時就把熱點數據加載好。

  緩存穿透:持續高併發地請求某個不存在的數據,會對數據庫形成很大的壓力。能夠將不存在的數據也緩存起來,值爲null。

 

  分佈式緩存架構:一方面是以以JBoss Cache爲表明的互相通訊派;另外一方面是以Memcached爲表明的互不通訊派;

  JBoss Cache須要將緩存信息同步到集羣中的全部機器,代價比較大;而Memcached採用一種集中式的緩存集羣管理,緩存與應用分離部署,應用程序經過一致性Hash算法選擇緩存服務器遠程訪問緩存數據,緩存服務器之間互不通訊,於是集羣規模能夠輕易地擴容,具備良好的伸縮性。

 

  Memcached由兩個核心組件組成:服務端(ms)和客戶端(mc),在一個memcached的查詢中,mc先經過計算key的hash值來肯定kv對所處在的ms位置。當ms肯定後,客戶端就會發送一個查詢請求給對應的ms,讓它來查找確切的數據。由於這之間沒有交互以及多播協議,因此 memcached交互帶給網絡的影響是最小化的。

 

異步操做:

  使用消息隊列將調用異步化,可改善網站的擴展性,還可改善網站性能。

  用戶請求發送給消息隊列後當即返回,再由消費者進程從隊列中獲取數據,異步寫入數據庫。

  消息隊列具備削峯的做用->將短期高併發產生的事務消息存儲在消息隊列中,從而削平高峯期的併發事務。

 

使用集羣:

  ①在高併發場景下,使用負載均衡技術爲一個應用構建多臺服務器組成的服務器集羣;

  ②能夠避免單一服務器因負載壓力過大而響應緩慢,使用戶請求具備更好的響應延遲特性

  ③負載均衡能夠採用硬件設備,也能夠採用軟件負載。商用硬件負載設備(例如出名的F5)成本一般較高(一臺幾十萬上百萬很正常),因此在條件容許的狀況下咱們會採用軟負載,軟負載解決的兩個核心問題是:選誰、轉發,其中最著名的是LVS(Linux Virtual Server)。

 

代碼優化:

  ①多線程:使用多線程的緣由:一是IO阻塞,二是多CPU,都是爲了最大限度地利用CPU資源,提升系統吞吐能力,改善系統性能;

  ②資源複用:目的是減小開銷很大的系統資源的建立和銷燬,主要採用兩種模式實現:單例(Singleton)和對象池(Object Pool)。例如,在開發中,常用到的線程池,數據庫鏈接池等,本質上都是對象池。

  ③數據結構:在不一樣場合合理使用恰當的數據結構,能夠極大優化程序的性能。

  ④垃圾回收:理解垃圾回收機制有助於程序優化和參數調優,以及編寫內存安全的代碼。

 

4.4 存儲性能優化

  機械硬盤:經過馬達驅動磁頭臂,帶動磁頭到指定的磁盤位置訪問數據。它可以實現快速順序讀寫,慢速隨機讀寫

  固態硬盤(又稱SSD):無機械裝置,數據存儲在可持久記憶的硅晶體上,所以能夠像內存同樣快速隨機訪問

  在目前的網站應用中,大部分應用訪問數據都是隨機的,這種狀況下SSD具備更好的性能表現,可是性價比有待提高。

 

  傳統關係型數據庫普遍採用B+樹,B+樹是對數據排好序後再存儲,加快數據檢索速度

  目前大多數DB多采用兩級索引的B+樹,樹的層次最多三層。所以可能須要5次磁盤訪問才能更新一條記錄(三次磁盤訪問得到數據索引及行ID,一次數據文件讀操做,一次數據文件寫操做)

 

  NoSQL(例如:HBase)產品普遍採用LSM樹:

  具體思想是:將對數據的修改增量保持在內存中,達到指定的大小限制後將這些修改操做批量寫入磁盤。不過讀取的時候稍微麻煩,須要合併磁盤中歷史數據和內存中最近的修改操做,因此寫入性能大大提高,讀取時可能須要先看是否命中內存,不然須要訪問較多的磁盤文件。

  LSM樹的原理是:把一棵大樹拆分紅N棵小樹,它首先寫入內存中,隨着小樹愈來愈大,內存中的小樹會被清除並寫入到磁盤中,磁盤中的樹按期能夠作合併操做,合併成一棵大樹,以優化讀性能。

  LSM樹的優點在於:在LSM樹上進行一次數據更新不須要磁盤訪問,在內存便可完成,速度遠快於B+樹。

相關文章
相關標籤/搜索