標籤:log type 機制 傳輸 範圍 mpi 登入 生產者 封裝
http://www.ha97.com/5095.html
說到大型網站,就得先說大型網站的特點:高並發、大流量、高可用、海量資料等。下面就說說大型網站的架構演化過程吧。
1. 初始階段的網站架構
初始階段都比較簡單,通常一台伺服器就可以搞定一個網站了,看圖:
2. 應用服務和資料服務分離
隨著網站業務的發展,一台伺服器逐漸不能滿足需求;這時候就需要將應用和資料分離,
3. 使用緩衝改善網站效能
毫無疑問,現在的網站基本上都會使用緩衝,即:80%的業務訪問都會集中在20%的資料上。
4. 使用應用伺服器叢集改善網站的並發處理能力
因為單一應用伺服器能夠處理的請求串連有限,在網站訪問高峰時期,應用伺服器會成為整個網站的瓶頸。因此使用負載平衡處理器勢在必然。通過負載平衡調度伺服器,可將來自瀏覽器的訪問請求分發到應用的叢集中的任何一台伺服器上。
5. 資料庫讀寫分離
當使用者達到一定規模後,資料庫因為負載壓力過高而成為網站的瓶頸。而目前主流的資料庫都提供主從熱備功能,通過配置兩台資料庫主從關係,可以將一台資料庫的資料更新同步到另一台伺服器上。網站利用資料庫這一功能實現資料庫讀寫分離,從而改善資料庫負載壓力。
6. 使用反向 Proxy和CDN加上網站相應
提高網站的訪問速度,主要手段有使用CDN和反向 Proxy。
CDN和反向 Proxy的基本原理都是緩衝,區別在於CDN部署在網路供應商的機房,而反向 Proxy是部署在網站的中心機房,當使用者請求到達中心機房後,首先訪問的反向 Proxy,如果反向 Proxy緩衝著使用者請求的資源,則直接返回給使用者。
7. 使用Distributed File System和分散式資料庫系統
任何強大的單一伺服器都滿足不了大型網站持續增長的業務需求。
分散式資料庫時網站資料庫拆分的最後手段,只用在單表資料規模非常大的時候才使用。不到不得已時,網站更常用的資料庫拆分手段是業務拆分,將不同業務的資料部署在不同的物理伺服器上。
8. 使用NoSQL和搜尋引擎
搜素引擎也基本已經形成現在大型網站必須提供的功能了,網站需要採用一些非關聯式資料庫技術如NoSQL和非資料庫查詢技術如搜尋引擎。
9. 業務拆分
大型網站為了應對日益複雜的業務情境,通過使用分而治之的手段將真箇網站業務拆分成不同的產品線。
具體到技術上,也會根據產品線話費,將一個網站拆分成許多不同的應用,每個應用獨立部署維護。應用之間可以通過超連結建立管理,也可以通過訊息佇列進行資料分發,當然最多的還是通過訪問同一個資料存放區系統來構成一個關聯的完整系統。
10. 分布式服務
由於每一個應用系統都需要執行許多相同的業務操作,比如使用者管理,session管理,那麼可以將這些公用的業務提取出來,獨立部署。
每一個模式描述了一個在我們周圍不斷重複發生的問題及該問題解決方案的核心。這樣,你就能一次又一次地使用該方案而不必做重複工作。
所謂網站架構模式即為瞭解決大型網站面臨的高並發訪問、海量資料、高可靠運行等一系列問題與挑戰。為此,在實踐中提出了許多解決方案,以實現網站高效能、高可靠性、易伸縮、可擴充、安全等各種技術架構目標。
1. 分層
分詞是公司專屬應用程式系統中最常見的一種架構牧師,將系統在橫向維度上切分成幾個部分,每個部分負責一部分相對簡單並比較單一的職責,然後通過上層對下層的依賴和調度組成一個完整的系統。
在網站的分層架構中,常見的為3層,即應用程式層、服務層、資料層。應用程式層具體負責業務和視圖的展示;服務層為應用程式層提供服務支援;資料庫提供資料存放區訪問服務,如資料庫、緩衝、檔案、搜尋引擎等。
分層架構是邏輯上的,在物理部署上,三層架構可以部署在同一個物理機器上,但是隨著網站業務的發展,必然需要對已經分層的模組分離部署,即三層結構分別部署在不同的伺服器上,是網站擁有更多的計算資源以應對越來越多的使用者訪問。
所以雖然分層架構模式最初的目的是規劃軟體清晰的邏輯結構以便於開發維護,但在網站的發展過程中,分層結構對網站支援高並發向分布式方向的發展至關重要。
2. 分隔
如果說分層是將軟體在橫向方面進行切分,那麼分隔就是在縱向方面對軟體進行切分。
網站越大,功能越複雜,服務和資料處理的種類也越多,將這些不同的功能和服務分隔開來,封裝成高內聚低耦合的模組單元,不僅有助於軟體的開發維護也便於不同模組的分布式部署,提高網站的並發處理能力和功能擴充能力。
大型網站分隔的粒度可能會很小。比如在應用程式層,將不同業務進行分隔,例如將購物、論壇、搜尋、廣告分隔成不同的應用,有對立的團隊負責,部署在不同的伺服器上。
3. 分布式
對於大型網站,分層和分隔的一個主要目的是為了切分後的模組便於分布式部署,即將不同模組部署在不同的伺服器上,通過遠程調用協同工作。分布式意味著可以使用更多的電腦完同樣的工作,電腦越多,CPU、記憶體、儲存資源就越多,能過處理的並發訪問和資料量就越大,進而能夠為更多的使用者提供服務。
在網站應用程式中,常用的分布式方案有一下幾種.
分布式應用和服務:將分層和分隔後的應用和服務模組分布式部署,可以改善網站效能和並發性、加快開發和發布速度、減少資料庫連接資源消耗。
分布式靜態資源:網站的靜態資源如js、CSS、Logo圖片等資源對立分布式部署,並採用獨立的網域名稱,即人們常說的動靜分離。靜態資源分布式部署可以減輕應用伺服器的負載壓力;通過使用獨立網域名稱加快瀏覽器並發載入的速度。
分布式資料和儲存:大型網站需要處理以P為單位的海量資料,單台電腦無法提供如此大的儲存空間,這些資料庫需要分布式儲存。
分散式運算:目前網站普遍使用Hadoop和MapReduce分散式運算架構進行此類批處理計算,其特點是移動計算而不是移動資料,將計算程式分發到資料所在的位置以加速計算和分散式運算。
4. 叢集
對於使用者訪問集中的模組需要將獨立部署的伺服器叢集化,即多台伺服器部署相同的應用構成一個叢集,通過負載平衡裝置共同對外提供服務。
伺服器叢集能夠為相同的服務提供更多的並發支援,因此當有更多的使用者訪問時,只需要向叢集中加入新的機器即可;另外可以實現當其中的某台伺服器發生故障時,可以通過負載平衡的失效轉移機制將請求轉移至叢集中其他的伺服器上,因此可以提高系統的可用性。
5. 緩衝
緩衝目的就是減輕伺服器的計算,使資料直接返回給使用者。在現在的軟體設計中,緩衝已經無處不在。具體實現有CDN、反向 Proxy、本機快取、分布式緩衝等。
使用緩衝有兩個條件:訪問資料熱點不均衡,即某些頻繁訪問的資料需要放在緩衝中;資料在某個時間段內有效,不過很快到期,否在會因為資料到期而髒讀,影響資料的正確性。
6. 非同步
使用非同步,業務之間的訊息傳遞不是同步調用,而是將一個業務操作分成多個階段,每個階段之間通過共用資料的方法非同步執行進行協作。
具體實現則在單一伺服器內部可用通過多線程共用記憶體對了的方式處理;在分布式系統中可用通過分布式訊息佇列來實現非同步。
非同步架構的典型就是生產者消費者方式,兩者不存在直接調用。
7. 冗餘
網站需要7×24小時連續運行,那麼就得有相應的冗餘機制,以防某台機器宕掉時無法訪問,而冗餘則可以通過部署至少兩台伺服器構成一個叢集實現服務高可用。資料庫除了定期備份還需要實現冷熱備份。甚至可以在全球範圍內部署災備資料中心。
8. 自動化
具體有自動化發布過程,自動化代碼管理、自動化測試、自動化安全檢測、自動化部署、自動化監控、自動化警示、自動化失效轉移、自動化失效恢複等。
9. 安全
網站在安全架構方面有許多模式:通過密碼和手機校正碼進行身份認證;登入、交易需要對網路通訊進行加密;為了防止機器人程式濫用資源,需要使用驗證碼進行識別;對常見的XSS攻擊、SQL注入需要編碼轉換;垃圾資訊需要過濾等。
所謂架構,一種通俗的說法就是“最高層次的規劃,難以改變的決定”,這些規劃和決定奠定了事物未來發展的方向和最終的藍圖。
而軟體架構即“有關軟體整體結構與組件的抽象描述,用於指導大型軟體系統各方面的設計”。一般來說軟體架構需要關注效能、可用性、伸縮性、擴充性和安全性這5個架構要素。
1. 效能
效能是網站架構設計的一個重要方面,任何軟體架構設計方案都必須考慮可能帶來的效能問題。也正因為效能問題幾乎無處不在,所以最佳化網站效能的手段也非常多:
瀏覽器端:可以通過瀏覽器緩衝、頁面壓縮傳輸、合理布局頁面、減少Cookie傳輸等手段,甚至可以使用CDN加速功能。
應用伺服器端:可以使用伺服器本機快取和分布式緩衝,也可以通過非同步作業方式來加快響應,在高並發請求的情況下,可以將多台應用伺服器組成一個叢集共同對外服務,提高整體處理能力,改善效能。
資料庫伺服器端:可用使用索引、緩衝、SQL效能最佳化等手段,還可以使用NoSQL資料庫來最佳化資料模型、儲存結構等。
衡量網站效能有一系列指標,重要的有回應時間、TPS、系統效能計數器等,通過這些指標以確定系統設計是否達到目標。
2. 可用性
可用性即能夠不間斷提供服務的時間。幾乎所有網站都承諾7×24小時可用,但事實上任何網站都不可能達到完全的7×24,總會有一些故障時間,扣除這些故障時間,就是網站的可用時間。一些大型網站可以做到4個9以上的可用性,也就是99.99%。
網站高可用的主要手段就是冗餘,應用部署在多台伺服器上同時提供服務,資料存放區在多台伺服器上相互備份,任何一台伺服器都不會影響應用的整體可以,通常的實現手段即把多台伺服器通過負載平衡裝置群組成一個叢集。
衡量一個系統架構設計是否滿足高可用的目標,就是假設系統中任何一台或者多台伺服器宕機時,以及出現各種不可預期的問題時,系統整體是否依然可用。
3. 伸縮性
大型網站需要面對大量使用者的高並發訪問和儲存海量資料,網站通過叢集的方式將多台伺服器組成一個整體共同提供服務。所謂伸縮性是指通過不斷向叢集中加入伺服器的手段來緩解不斷整體上市使用者並發訪問壓力和不斷增長的資料存放區需求。
衡量架構伸縮性的主要標準就是是否可用多台伺服器構建叢集,是否容易向叢集中添加新的伺服器。加入新的伺服器後是否可以提供和原來的伺服器無差別的服務。叢集中可容納的總伺服器數量是否有限制。
4. 擴充性
不同於其他架構要素主要關注非功能性需求,網站的擴充性架構直接關注網站的功能需求。網站快速發展,功能不斷擴充,如何設計網站的架構使其能夠快速響應需求變化,是網站可擴充架構的主要目標。
衡量網站架構擴充性好壞的主要標準就是在網站增加新的業務產品時,是否可以實現對現有產品透明無影響,不同產品之間是否很少耦合等。
網站可擴充架構的主要手段是事件驅動架構和分布式服務。
事件驅動通常利用訊息佇列實現,通過這種方式將訊息生產和處理邏輯分隔開。
伺服器服務則是將業務和可複用服務分離開來,通過分布式服務架構調用。新增加產品可用通過調用可複用的服務來實現自身的商務邏輯,而對現有產品沒有任何影響。
5. 安全性
互連網是開發的,任何人在任何地方都可以訪問網站。網站的安全架構就是保護網站不受惡意訪問和攻擊,保護網站的重要資料不被竊取。
衡量網站安全架構的標準就是針對現存和潛在的各種攻擊和竊密手段,是否有可靠的應對策略。
網站架構演化