大型網站分佈式高併發架構設計

1前言


網站架構包括:前端架構+應用層架構+服務層架構+存儲層架構+後臺架構+數據中心機房架構+安全架構+數據採集與監控。


以下爲大型網站的一些架構:


2前端架構


  • 瀏覽器優化技術

    並不是優化瀏覽器,而是通過優化響應頁面,加快瀏覽器頁面的加載和顯示,常用的有頁面緩存、合併HTTP 減少請求次數、使用頁面壓縮等。

  • CDN

    內容分發網絡,部署在網絡運營商機房,通過將靜態頁面內容分發到離用戶最近的CDN 服務器,使用戶可以通過最短路徑獲取內容。

  • 動靜分離,靜態資源獨立部署

    靜態資源,如JS,CSS 等文件部署在專門的服務器集羣上,和Web 應用動態內容服務分離,並使用專門的(二級)域名。

  • 圖片服務

    圖片不是指網站Logo 按鈕圖標等,這些文件屬於上面提到的靜態資源,應該和JS CSS 部署在一起。這裏的圖片指用戶上傳的圖片,如產品圖片、用戶頭像等,圖片服務同樣使用獨立部署的圖片服務器集羣,並使用獨立(二級)域名。

  • 反向代理

    部署在網站機房,在應用服務器、靜態資源服務器、圖片服務器之前,提供頁面緩存服務。

  • DNS

    域名服務,將域名解析成IP 地址,利用DNS 可以實現DNS 負載均衡,配置CDN也需要修改DNS使域名解析後指向CDN 服務器。


3應用層架構


應用層是處理網站主要業務邏輯的地方。

  • 開發框架

  • 頁面渲染

    將分別開發維護的動態內容和靜態頁面模板集成起來,組合成最終顯示給用戶的完整頁面。

  • 負載均衡

    將多臺應用服務器組成一個集羣,通過負載均衡技術將用戶請求分發到不同的服務器上,以應對大量用戶同時訪問時產生的高併發負載壓力。

  • Session 管理

    爲了實現高可用的應用服務器集羣,應用服務器通常設計爲無狀態,不保存用戶請求上下文信息,但是網站業務通常需要保持用戶會話信息,需要專門的.機制管理Session使集羣內甚至跨集羣的應用服務器可以共享Session

  • 動態頁面靜態化

    對於訪問量特別大而更新又不很頻繁的動態頁面,可以將其靜態化,即生成一個靜態頁面,利用靜態頁面的優化手段加速用戶訪問,如反向代理、CDN、 瀏覽器緩存等。

  • 業務拆分

    將複雜而又龐大的業務拆分開來,形成多個規模較小的產品,獨立開發、部署、維護,除了降低系統耦合度,也便於數據庫業務分庫。按業務對關係數據庫進行拆分,技術難度相對較小,而效果又相對較好。

  • 虛擬化服務器

    將一臺物理服務器虛擬化成多臺虛擬服務器,對於併發訪問較低的業務,更容易用較少的資源構建高可用的應用服務器集羣。


4服務層架構


提供基礎服務,供應用層調用,完成網站業務。


  • 分佈式消息

    利用消息隊列機制,實現業務和業務、業務和服務之間的異步消息發送及低耦合的業務關係。

  • 分佈式服務

    提供高性能、低耦合、易複用、易管理的分佈式服務,在網站實現面向服務架構SOA

  • 分佈式緩存

    通過可伸縮的服務器集羣提供大規模熱點數據的緩存服務,是網站性能優化的重要手段。

  • 分佈式配置

    系統運行需要配置許多參數,如果這些參數需要修改,比如分佈式緩存集羣加入新的緩存服務器,需要修改應用程序客戶端的緩存服務器列表配置,並重啓應用程序服務器。分佈式配置在系統運行期提供配置動態推送服務,將配置修改實時推送到應用系統,無需重啓服務器。


5存儲層架構


  • 分佈式文件

    網站在線業務需要存儲的文件大部分都是圖片、網頁、視頻等比較小的文件,但是這些文件的數量非常龐大,而且通常都在持續增加,需要伸縮性設計比較好的分佈式文件系統。

  • 關係數據庫

    大部分網站的主要業務是基於關係數據庫開發的,但是關係數據庫對集羣伸縮性的支持比較差。通過在應用程序的數據訪問層增加數據庫訪問路由功能,根據業務配置將數據庫訪問路由到不同的物理數據庫上,可實現關係數據庫的分佈式訪問

  • NoSQL 數據庫

    目前各種NoSQL 數據庫層出不窮,在內存管理、數據模型、集羣分佈式管理等方面各有優勢,不過從社區活躍性角度看,HBase 無疑是目前最好的。

  • 數據同步

    在支持全球範圍內數據共享的分佈式數據庫技術成熟之前,擁有多個數據中心的網站必須在多個數據中心之間進行數據同步,以保證每個數據中心都擁有完整的數據。在實踐中,爲了減輕數據庫壓力,將數據庫的事務日誌(或者NoSQL 的寫操作Log) 同步到其他數據中心,根據Log 進行數據重演,實現數據同步。


6後臺架構


網站應用中,除了要處理用戶的實時訪問請求外,還有一些後臺非實時數據分析要處理。


  • 搜索引擎

    即使是網站內部的搜索引擎,也需要進行數據增量更新及全量更新、構建索引等。

    這些操作通過後臺系統定時執行。

  • 數據倉庫

    根據離線數據,提供數據分析與數據挖掘服務。

  • 推薦系統

    社交網站及購物網站通過挖掘人和人之間的關係,人和商品之間的關係,發掘潛在的人際關係和購物興趣,爲用戶提供個性化推薦服務。


7數據採集、監控

監控網站訪問情況與系統運行情況,爲網站運營決策和運維管理提供支持保障。

  • 瀏覽器數據採集

    通過在網站頁面中嵌入JS 腳本釆集用戶瀏覽器環境與操作記錄,分析用戶行爲。

  • 服務器業務數據採集

    服務器業務數據包括兩種,一種是採集在服務器端記錄的用戶請求操作日誌;一種是釆集應用程序運行期業務數據,比如待處理消息數目等。

  • 服務器性能數據採集

    採集服務器性能數據,如系統負載、內存使用率、網卡流量等。

  • 系統監控

    將前述採集的數據以圖表的方式展示,以便運營和運維人員監控網站運行狀況,做

    到這一步僅僅是系統監視。更先進的做法是根據釆集的數據進行自動化運維,自動處理,系統異常狀況,實現自動化控制。

  • 系統報警

    如果採集來的數據超過預設的正常情況的閾值,比如系統負載過高,就通過郵件、短信、語音電話等方式發出報警信號,等待工程師干預。


8安全架構


保護網站免遭攻擊及敏感信息泄露。

  • Web 攻擊

    以HTTP 請求的方式發起的攻擊,危害最大的就是XSS 和SQL 注入攻擊。但是隻要措施得當,這兩種攻擊都是比較容易防範的。

  • 數據保護

    敏感信息加密傳輸與存儲,保護網站和用戶資產。


9大型網站的特點


高併發、大流量;高可用;海量數據;用戶分佈廣泛且網絡環境複雜;安全環境惡劣;需求快速變更,發佈頻繁;漸進式發展。


10系統的演變


  1. 單機部署

  2. 數據和應用分離

  3. 使用緩存減少數據庫壓力

    網站訪問特點和現實世界的財富分配一樣遵循二八定律:80%的業務訪問集中在20%的數據上

  4. 應用服務器集羣化

    可擴展性,負載均衡

  5. 數據庫讀寫分離

    利用的是數據庫的主從熱備。寫主讀從。

  6. 加速網站訪問速度:CDN和反向代理。

    CDN 和反向代理的基本原理都是緩存,區別在於CDN 部署在網絡提供商的機房,使用戶在請求網站服務時,可以從距離自己最近的網絡提供商機房獲取數據;而反向代理則部署在網站的中心機房,當用戶請求到達中心機房後,首先訪問的服務器是反向代理服務器,如果反向代理服務器中緩存着用戶請求的資源,就將其直接返回給用戶。

  7. 分佈式數據庫和分佈式文件系統

    網站更常用的數據庫拆分手段是業務分庫,將不同業務的數據庫部署在不同的物理服務器上。

  8. 使用NoSQL和搜索引擎

  9. 業務拆分

  10. 分佈式服務


11大型網站架構模式


  1. 分層

    單一職責,上層對下層的依賴關係。

  2. 分割

    業務縱向分割,分佈式部署。

  3. 分佈式

    分層和分割都是爲了便於分佈式部署。

    常用的分佈式方案有:分佈式應用和服務;分佈式靜態資源;分佈式數據和存儲;分佈式計算。

  4. 集羣

  5. 緩存

    緩存是改善軟件性能的第一手段使用緩存有兩個前提條件,一是數據訪問熱點不均衡,某些數據會被更頻繁的訪問,這些數據應該放在緩存中;二是數據在某個時間段內有效,不會很快過期,否則緩存的數據就會因已經失效而產生髒讀,影響結果的正確性。

  6. 異步

    將一個業務操作分成多個階段,每個階段之間通過共享數據的方式異步執行進行協作。在分佈式系統中,多個服務器集羣通過分佈式消息隊列實現異步,分佈式消息隊列可以看作內存隊列的分佈式部署。提高系統可用性。加快網站響應速度。消除併發訪問高峯。

  7. 冗餘


12架構要素

從性能、可用性、伸縮性、擴展性、安全這五個要素。

所謂伸縮性是指通過不斷向集羣中加入服務器的手段來緩解不斷上升的用戶併發訪問壓力和不斷增長的數據存儲需求。

衡量架構伸縮性的主要標準就是是否可以用多臺服務器構建集羣,是否容易向集羣中添加新的服務器。加入新的服務器後是否可以提供和原來的服務器無差別的服務。集羣中可容納的總的服務器數量是否有限制。

關係數據庫雖然支持數據複製,主從熱備等機制,但是很難做到大規模集羣的可伸縮性,因此關係數據庫的集羣伸縮性方案必須在數據庫之外實現,通過路由分區等手段將部署有多個數據庫的服務器組成一個集羣至於大部分NoSQL 數據庫產品,由於其先天就是爲海量數據而生,因此其對伸縮性的支持通常都非常好,可以做到在較少運維參與的情況下實現集羣規模的線性伸縮。

擴展性是指的功能擴展,伸縮是指性能伸縮。

13性能優化


System Load 即系統負載,指當前正在被CPU 執行和等待被CPU 執行的進程數目總和,是反映系統忙閒程度的重要指標。多核CPU 的情況下,完美情況是所有CPU 都在使用,沒有進程在等待處理,所以Load 的理想值是CPU 的數目。當Load 值低於CPU 數目的時候,表示CPU 有空閒,資源存在浪費;當Load 值高於CPU 數目的時候,表示進程在排隊等待CPU 調度,表示系統資源不足,影響應用程序的執行性能。

在Linux 系統中使用top 命令査看,該值是三個浮點數,表示最近1 分鐘,10 分鐘,15 分鐘的運行隊列平均進程數。

性能測試是一個總稱,具體可細分爲性能測試、負載測試、壓力測試、穩定性測試。

排査一個網站的性能瓶頸和排査一個程序的性能瓶頸的手法基本相同:檢査請求處理的各個環節的日誌,分析哪個環節響應時間不合理、超過預期;然後檢査監控數據,分析影響性能的主要因素是內存、磁盤、網絡、還是copy 是代碼問題還是架構設計不合理,或者系統資源確實不足。


14前端性能優化


主要優化手段有優化瀏覽器訪問、使用反向代理、CDN 等。

優化瀏覽器訪問的措施:

  1. 減少http請求。

    HTTP 協議是無狀態的應用層協議,意味着每次HTTP 請求都需要建立通信鏈路、進行數據傳輸,而在服務器端,每個HTTP 都需要啓動獨立的線程去處理。這些通信和服務的開銷都很昂貴,減少HTTP 請求的數目可有效提高訪問性能。

    減少HTTP 的主要手段是合併CSS,合併JavaScript,合併圖片。將瀏覽器一次訪問需要的JavaScript CSS 合併成一個文件,這樣瀏覽器就只需要一次請求。圖片也可以合併,多張圖片合併成一張,如果每張圖片都有不同的超鏈接,可通過CSS 偏移響應鼠標點擊操作,構造不同的URL。

  2. 使用瀏覽器緩存

    對一個網站而言,CSSÿ JavaScript , Logo圖標這些靜態資源文件更新的頻率都比較低,而這些文件又幾乎是每次HTTP 請求都需要的,如果將這些文件緩存在瀏覽器中,可以極好地改善性能。

    通過設置HTTP 頭中Cache-Control 和Expires 的屬性,可設定瀏覽器緩存,緩存時間可以是數天,甚至是幾個月。

    在某些時候,靜態資源文件變化需要及時應用到客戶端瀏覽器,這種情況,可通改變文件名實現,即更新JavaScript 文件並不是更新JavaScript 文件內容,而是生成一個新的JS 文件並更新HTML 文件中的引用。

    使用瀏覽器緩存策略的網站在更新靜態資源時,應採用批量更新的方法,比如需要更新10 個圖標文件,不宜把10 個文件一次全部更新,而是應一個文件一個文件逐步更新,並有一定的間隔時間,以免用戶瀏覽器突然大量緩存失效,集中更新緩存,造成服務器負載驟增、網絡堵塞的情況。

  3. 啓用壓縮

    在服務器端對文件進行壓縮,在瀏覽器端對文件解壓縮,可有效減少通信傳輸的數據量。文本文件的壓縮效率可達80%以上,因此HTMLÿ CSSÿ JavaScript 文件啓用GZip壓縮可達到較好的效果。但是壓縮對服務器和瀏覽器產生一定的壓力,在通信帶寬良好,而服務器資源不足的情況下要權衡考慮。

  4. CSS 放在頁面最上面、JavaScript 放在頁面最下面

    但如果頁面解析時就需要用到JavaScript, 這時放在底部就不合適了。

  5. 減少cookie傳輸


15服務器端性能優化


  1. 分佈式緩存

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

    產品在設計之初就需要一個明確的定位:什麼是產品要實現的功能,什麼

    不是產品提供的特性。在產品漫長的生命週期中,會有形形色色的困難和誘惑來改變產品的發展方向,左右搖擺、什麼都想做的產品,最後有可能成爲一個失去生命力的四不像。緩存預熱、緩存穿透。

  2. 異步

    消息隊列。需要注意的是,由於數據寫入消息隊列後立即返回給用戶,數據在後續的業務校驗、寫數據庫等操作可能失敗,因此在使用消息隊列進行業務異步處理後,需要適當修改業務流程進行配合任何可以晚點做的事情都應該晚點做。

  3. 使用集羣。

  4. 代碼優化

  • 多線程。

    啓動線程數= [任務執行時間/ (任務執行時間-10 等待時間)] xCPU 內核數

    最佳啓動線程數和CPU 內核數量成正比,和IO 阻塞時間成反比。

    如果是計算型任務,那麼線程數最多不超過CPU 內核數,因爲啓動再多線程,CPU 也來不及調度;相反如果是任務需要等待磁盤操作,網絡響應,那麼多啓動線程有助於提高任務併發度,提高系統吞吐能力,改善系統性能。

  • 對象複用。單例和池技術。

  • 數據結果。

  • 垃圾回收。


16存儲性能優化

B+樹,關係型數據庫多采用此數據結構。

NoSql產品多采用LSM樹作爲主要數據結構。

在LSM 樹上進行一次數據更新不需要磁盤訪問,在內存即可完成,速度遠快於B+樹。當數據訪問以寫操作爲主,而讀操作則集中在最近寫入的數據上時,使用LSM樹可以極大程度地減少磁盤的訪問次數,加快訪問速度。

RAID,通過使用RAID 技術,實現數據在多塊磁盤上的併發讀寫和數據備份。

RAID 技術在傳統關係數據庫及文件系統中應用比較廣泛,但是在大型網站比

較喜歡使用的NoSQLÿ 以及分佈式文件系統中,RAID 技術卻遭到冷落。

17高可用性能優化


主要手段是數據和服務的冗餘備份及失效轉移。

分級管理,部署隔離。

超時設置。

異步調用。

服務降級。

冪等性設計。

CAP 原理認爲,一個提供數據服務的存儲系統無法同時滿足數據一致性

(Consistency)、數據可用性(Availibility )、分區耐受性即可擴展性(Patition Toleranceÿ 系統具有跨網絡分區的伸縮性)這三個條件。

通常我們必須去保證A可用性和P擴展性,某種程度上放棄C一致性。

數據最終一致性,這是數據一致性中較弱的一種,數據可能不一致,但經過一段時間的自我恢復和修正,數據達到最終一致。

數據備份,冷備和熱備。熱備又分同步熱備和異步熱備。

失效轉移操作由三部分組成:失效確認、訪問轉移、數據恢復。

18伸縮性優化


實現負載均衡的基礎技術:

  • HTTP 重定向

    這種負載均衡方案的優點是比較簡單。缺點是瀏覽器需要兩次請求服務器才能完成一次訪問,性能較差;重定向服務器自身的處理能力有可能成爲瓶頸,整個集羣的伸縮性規模有限;使用HTTP302 響應碼重定向,有可能使搜索引擎判斷爲SEO 作弊,降低搜索排名。因此實踐中使用這種方案進行負載均衡的案例並不多見。

  • DNS 域名解析負載均衡

    事實上,大型網站總是部分使用DNS 域名解析,利用域名解析作爲第一級負載均衡手段,即域名解析得到的一組服務器並不是實際提供Web 服務的物理服務器,而是同樣提供負載均衡服務的內部服務器,這組內部負載均衡服務器再進行負載均衡,將請求分發到真實的Web 服務器上。

  • 反向代理負載均衡

  • IP 負載均衡

  • 數據鏈路層負載均衡

    這種數據傳輸方式又稱作三角傳輸模式,負載均衡數據分發過程中不修改IP 地址,只修改目的mac 地址,通過配置真實物理服務器集羣所有機器虛擬IP 和負載均衡服務器IP 地址一致,從而達到不修改數據包的源地址和目的地址就可以進行數據分發的目的是目前大型網站使用最廣的一種負載均衡手段。在Linux 平臺上最好的鏈路層負載均衡開源產品是LVS ( Linux Virtual Server )。

19分佈式緩存

一致性哈希

計算機領域有句話:計算機的任何問題都可以通過增加一個虛擬層來解決。

。那麼在實踐中,一臺物理服務器虛擬爲多少個虛擬服務器節點合適呢?太多會影響性能,太少又會導致負載不均衡,一般說來,經驗值是150,當然根據集羣規模和負載均衡的精度需求,這個值應該根據具體情況具體對待。

20NOSQL


NoSQL數據庫產品都放棄了關係數據庫的兩大重要基礎:以關係代數爲基礎的結構化査詢語言( SQL ) 和事務一致性保證(ACID )。而強化其他一些大型網站更關注的特性:高可用性和可伸縮性。

設計網站可擴展架構的核心思想是模塊化,並在此基礎之上,降低模塊間的耦合性,提高模塊的複用性。

  • 利用分佈式消息隊列降低系統耦合性

  • 利用分佈式服務框架,如Dubbo

  • 搭建開放平臺建設網站生態圈

    API接口,協議轉換,安全,審計,路由,流程

21安全架構常見攻擊


XSS,跨站點腳本攻擊。惡意腳本執行。

防禦:消毒(特殊字符轉義)

httponly,防止XSS 攻擊者竊取Cookie。

注入攻擊,消毒,預編譯

CSRF,跨站點請求僞造。其核心是利用了瀏覽器Cookie 或服務器Session 策略,盜取用戶身份。

防禦:表單Token,驗證碼,referer check(請求來源檢查)

web應用防火牆

22加密


  • 單項散列加密

    常用的單向散列算法有MD5ÿ SHA 等。單向散列算法還有一個特點就是輸入的任何微小變化都會導致輸出的完全不同,這個特性有時也會被用來生成信息摘要、計算具有高離散程度的隨機數等用途。

  • 對稱加密

    常用的對稱加密算法有DES 算髮、RC 算法等

  • 非對稱加密

    非對稱加密的常用算法有RSA 算法


23信息過濾


  • 文本匹配

    正則表達式的效率一般較差,僅適用於短文本及低併發場景。

    高併發時使用的公幵的算法有很多,基本上都是Trie 樹的變種,空間和時間複雜度都比較好的有雙數組Trie 算法等。

1前言


網站架構包括:前端架構+應用層架構+服務層架構+存儲層架構+後臺架構+數據中心機房架構+安全架構+數據採集與監控。


以下爲大型網站的一些架構:


2前端架構


  • 瀏覽器優化技術

    並不是優化瀏覽器,而是通過優化響應頁面,加快瀏覽器頁面的加載和顯示,常用的有頁面緩存、合併HTTP 減少請求次數、使用頁面壓縮等。

  • CDN

    內容分發網絡,部署在網絡運營商機房,通過將靜態頁面內容分發到離用戶最近的CDN 服務器,使用戶可以通過最短路徑獲取內容。

  • 動靜分離,靜態資源獨立部署

    靜態資源,如JS,CSS 等文件部署在專門的服務器集羣上,和Web 應用動態內容服務分離,並使用專門的(二級)域名。

  • 圖片服務

    圖片不是指網站Logo 按鈕圖標等,這些文件屬於上面提到的靜態資源,應該和JS CSS 部署在一起。這裏的圖片指用戶上傳的圖片,如產品圖片、用戶頭像等,圖片服務同樣使用獨立部署的圖片服務器集羣,並使用獨立(二級)域名。

  • 反向代理

    部署在網站機房,在應用服務器、靜態資源服務器、圖片服務器之前,提供頁面緩存服務。

  • DNS

    域名服務,將域名解析成IP 地址,利用DNS 可以實現DNS 負載均衡,配置CDN也需要修改DNS使域名解析後指向CDN 服務器。


3應用層架構


應用層是處理網站主要業務邏輯的地方。

  • 開發框架

  • 頁面渲染

    將分別開發維護的動態內容和靜態頁面模板集成起來,組合成最終顯示給用戶的完整頁面。

  • 負載均衡

    將多臺應用服務器組成一個集羣,通過負載均衡技術將用戶請求分發到不同的服務器上,以應對大量用戶同時訪問時產生的高併發負載壓力。

  • Session 管理

    爲了實現高可用的應用服務器集羣,應用服務器通常設計爲無狀態,不保存用戶請求上下文信息,但是網站業務通常需要保持用戶會話信息,需要專門的.機制管理Session使集羣內甚至跨集羣的應用服務器可以共享Session

  • 動態頁面靜態化

    對於訪問量特別大而更新又不很頻繁的動態頁面,可以將其靜態化,即生成一個靜態頁面,利用靜態頁面的優化手段加速用戶訪問,如反向代理、CDN、 瀏覽器緩存等。

  • 業務拆分

    將複雜而又龐大的業務拆分開來,形成多個規模較小的產品,獨立開發、部署、維護,除了降低系統耦合度,也便於數據庫業務分庫。按業務對關係數據庫進行拆分,技術難度相對較小,而效果又相對較好。

  • 虛擬化服務器

    將一臺物理服務器虛擬化成多臺虛擬服務器,對於併發訪問較低的業務,更容易用較少的資源構建高可用的應用服務器集羣。


4服務層架構


提供基礎服務,供應用層調用,完成網站業務。


  • 分佈式消息

    利用消息隊列機制,實現業務和業務、業務和服務之間的異步消息發送及低耦合的業務關係。

  • 分佈式服務

    提供高性能、低耦合、易複用、易管理的分佈式服務,在網站實現面向服務架構SOA

  • 分佈式緩存

    通過可伸縮的服務器集羣提供大規模熱點數據的緩存服務,是網站性能優化的重要手段。

  • 分佈式配置

    系統運行需要配置許多參數,如果這些參數需要修改,比如分佈式緩存集羣加入新的緩存服務器,需要修改應用程序客戶端的緩存服務器列表配置,並重啓應用程序服務器。分佈式配置在系統運行期提供配置動態推送服務,將配置修改實時推送到應用系統,無需重啓服務器。


5存儲層架構


  • 分佈式文件

    網站在線業務需要存儲的文件大部分都是圖片、網頁、視頻等比較小的文件,但是這些文件的數量非常龐大,而且通常都在持續增加,需要伸縮性設計比較好的分佈式文件系統。

  • 關係數據庫

    大部分網站的主要業務是基於關係數據庫開發的,但是關係數據庫對集羣伸縮性的支持比較差。通過在應用程序的數據訪問層增加數據庫訪問路由功能,根據業務配置將數據庫訪問路由到不同的物理數據庫上,可實現關係數據庫的分佈式訪問

  • NoSQL 數據庫

    目前各種NoSQL 數據庫層出不窮,在內存管理、數據模型、集羣分佈式管理等方面各有優勢,不過從社區活躍性角度看,HBase 無疑是目前最好的。

  • 數據同步

    在支持全球範圍內數據共享的分佈式數據庫技術成熟之前,擁有多個數據中心的網站必須在多個數據中心之間進行數據同步,以保證每個數據中心都擁有完整的數據。在實踐中,爲了減輕數據庫壓力,將數據庫的事務日誌(或者NoSQL 的寫操作Log) 同步到其他數據中心,根據Log 進行數據重演,實現數據同步。


6後臺架構


網站應用中,除了要處理用戶的實時訪問請求外,還有一些後臺非實時數據分析要處理。


  • 搜索引擎

    即使是網站內部的搜索引擎,也需要進行數據增量更新及全量更新、構建索引等。

    這些操作通過後臺系統定時執行。

  • 數據倉庫

    根據離線數據,提供數據分析與數據挖掘服務。

  • 推薦系統

    社交網站及購物網站通過挖掘人和人之間的關係,人和商品之間的關係,發掘潛在的人際關係和購物興趣,爲用戶提供個性化推薦服務。


7數據採集、監控

監控網站訪問情況與系統運行情況,爲網站運營決策和運維管理提供支持保障。

  • 瀏覽器數據採集

    通過在網站頁面中嵌入JS 腳本釆集用戶瀏覽器環境與操作記錄,分析用戶行爲。

  • 服務器業務數據採集

    服務器業務數據包括兩種,一種是採集在服務器端記錄的用戶請求操作日誌;一種是釆集應用程序運行期業務數據,比如待處理消息數目等。

  • 服務器性能數據採集

    採集服務器性能數據,如系統負載、內存使用率、網卡流量等。

  • 系統監控

    將前述採集的數據以圖表的方式展示,以便運營和運維人員監控網站運行狀況,做

    到這一步僅僅是系統監視。更先進的做法是根據釆集的數據進行自動化運維,自動處理,系統異常狀況,實現自動化控制。

  • 系統報警

    如果採集來的數據超過預設的正常情況的閾值,比如系統負載過高,就通過郵件、短信、語音電話等方式發出報警信號,等待工程師干預。


8安全架構


保護網站免遭攻擊及敏感信息泄露。

  • Web 攻擊

    以HTTP 請求的方式發起的攻擊,危害最大的就是XSS 和SQL 注入攻擊。但是隻要措施得當,這兩種攻擊都是比較容易防範的。

  • 數據保護

    敏感信息加密傳輸與存儲,保護網站和用戶資產。


9大型網站的特點


高併發、大流量;高可用;海量數據;用戶分佈廣泛且網絡環境複雜;安全環境惡劣;需求快速變更,發佈頻繁;漸進式發展。


10系統的演變


  1. 單機部署

  2. 數據和應用分離

  3. 使用緩存減少數據庫壓力

    網站訪問特點和現實世界的財富分配一樣遵循二八定律:80%的業務訪問集中在20%的數據上

  4. 應用服務器集羣化

    可擴展性,負載均衡

  5. 數據庫讀寫分離

    利用的是數據庫的主從熱備。寫主讀從。

  6. 加速網站訪問速度:CDN和反向代理。

    CDN 和反向代理的基本原理都是緩存,區別在於CDN 部署在網絡提供商的機房,使用戶在請求網站服務時,可以從距離自己最近的網絡提供商機房獲取數據;而反向代理則部署在網站的中心機房,當用戶請求到達中心機房後,首先訪問的服務器是反向代理服務器,如果反向代理服務器中緩存着用戶請求的資源,就將其直接返回給用戶。

  7. 分佈式數據庫和分佈式文件系統

    網站更常用的數據庫拆分手段是業務分庫,將不同業務的數據庫部署在不同的物理服務器上。

  8. 使用NoSQL和搜索引擎

  9. 業務拆分

  10. 分佈式服務


11大型網站架構模式


  1. 分層

    單一職責,上層對下層的依賴關係。

  2. 分割

    業務縱向分割,分佈式部署。

  3. 分佈式

    分層和分割都是爲了便於分佈式部署。

    常用的分佈式方案有:分佈式應用和服務;分佈式靜態資源;分佈式數據和存儲;分佈式計算。

  4. 集羣

  5. 緩存

    緩存是改善軟件性能的第一手段使用緩存有兩個前提條件,一是數據訪問熱點不均衡,某些數據會被更頻繁的訪問,這些數據應該放在緩存中;二是數據在某個時間段內有效,不會很快過期,否則緩存的數據就會因已經失效而產生髒讀,影響結果的正確性。

  6. 異步

    將一個業務操作分成多個階段,每個階段之間通過共享數據的方式異步執行進行協作。在分佈式系統中,多個服務器集羣通過分佈式消息隊列實現異步,分佈式消息隊列可以看作內存隊列的分佈式部署。提高系統可用性。加快網站響應速度。消除併發訪問高峯。

  7. 冗餘


12架構要素

從性能、可用性、伸縮性、擴展性、安全這五個要素。

所謂伸縮性是指通過不斷向集羣中加入服務器的手段來緩解不斷上升的用戶併發訪問壓力和不斷增長的數據存儲需求。

衡量架構伸縮性的主要標準就是是否可以用多臺服務器構建集羣,是否容易向集羣中添加新的服務器。加入新的服務器後是否可以提供和原來的服務器無差別的服務。集羣中可容納的總的服務器數量是否有限制。

關係數據庫雖然支持數據複製,主從熱備等機制,但是很難做到大規模集羣的可伸縮性,因此關係數據庫的集羣伸縮性方案必須在數據庫之外實現,通過路由分區等手段將部署有多個數據庫的服務器組成一個集羣至於大部分NoSQL 數據庫產品,由於其先天就是爲海量數據而生,因此其對伸縮性的支持通常都非常好,可以做到在較少運維參與的情況下實現集羣規模的線性伸縮。

擴展性是指的功能擴展,伸縮是指性能伸縮。

13性能優化


System Load 即系統負載,指當前正在被CPU 執行和等待被CPU 執行的進程數目總和,是反映系統忙閒程度的重要指標。多核CPU 的情況下,完美情況是所有CPU 都在使用,沒有進程在等待處理,所以Load 的理想值是CPU 的數目。當Load 值低於CPU 數目的時候,表示CPU 有空閒,資源存在浪費;當Load 值高於CPU 數目的時候,表示進程在排隊等待CPU 調度,表示系統資源不足,影響應用程序的執行性能。

在Linux 系統中使用top 命令査看,該值是三個浮點數,表示最近1 分鐘,10 分鐘,15 分鐘的運行隊列平均進程數。

性能測試是一個總稱,具體可細分爲性能測試、負載測試、壓力測試、穩定性測試。

排査一個網站的性能瓶頸和排査一個程序的性能瓶頸的手法基本相同:檢査請求處理的各個環節的日誌,分析哪個環節響應時間不合理、超過預期;然後檢査監控數據,分析影響性能的主要因素是內存、磁盤、網絡、還是copy 是代碼問題還是架構設計不合理,或者系統資源確實不足。


14前端性能優化


主要優化手段有優化瀏覽器訪問、使用反向代理、CDN 等。

優化瀏覽器訪問的措施:

  1. 減少http請求。

    HTTP 協議是無狀態的應用層協議,意味着每次HTTP 請求都需要建立通信鏈路、進行數據傳輸,而在服務器端,每個HTTP 都需要啓動獨立的線程去處理。這些通信和服務的開銷都很昂貴,減少HTTP 請求的數目可有效提高訪問性能。

    減少HTTP 的主要手段是合併CSS,合併JavaScript,合併圖片。將瀏覽器一次訪問需要的JavaScript CSS 合併成一個文件,這樣瀏覽器就只需要一次請求。圖片也可以合併,多張圖片合併成一張,如果每張圖片都有不同的超鏈接,可通過CSS 偏移響應鼠標點擊操作,構造不同的URL。

  2. 使用瀏覽器緩存

    對一個網站而言,CSSÿ JavaScript , Logo圖標這些靜態資源文件更新的頻率都比較低,而這些文件又幾乎是每次HTTP 請求都需要的,如果將這些文件緩存在瀏覽器中,可以極好地改善性能。

    通過設置HTTP 頭中Cache-Control 和Expires 的屬性,可設定瀏覽器緩存,緩存時間可以是數天,甚至是幾個月。

    在某些時候,靜態資源文件變化需要及時應用到客戶端瀏覽器,這種情況,可通改變文件名實現,即更新JavaScript 文件並不是更新JavaScript 文件內容,而是生成一個新的JS 文件並更新HTML 文件中的引用。

    使用瀏覽器緩存策略的網站在更新靜態資源時,應採用批量更新的方法,比如需要更新10 個圖標文件,不宜把10 個文件一次全部更新,而是應一個文件一個文件逐步更新,並有一定的間隔時間,以免用戶瀏覽器突然大量緩存失效,集中更新緩存,造成服務器負載驟增、網絡堵塞的情況。

  3. 啓用壓縮

    在服務器端對文件進行壓縮,在瀏覽器端對文件解壓縮,可有效減少通信傳輸的數據量。文本文件的壓縮效率可達80%以上,因此HTMLÿ CSSÿ JavaScript 文件啓用GZip壓縮可達到較好的效果。但是壓縮對服務器和瀏覽器產生一定的壓力,在通信帶寬良好,而服務器資源不足的情況下要權衡考慮。

  4. CSS 放在頁面最上面、JavaScript 放在頁面最下面

    但如果頁面解析時就需要用到JavaScript, 這時放在底部就不合適了。

  5. 減少cookie傳輸


15服務器端性能優化


  1. 分佈式緩存

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

    產品在設計之初就需要一個明確的定位:什麼是產品要實現的功能,什麼

    不是產品提供的特性。在產品漫長的生命週期中,會有形形色色的困難和誘惑來改變產品的發展方向,左右搖擺、什麼都想做的產品,最後有可能成爲一個失去生命力的四不像。緩存預熱、緩存穿透。

  2. 異步

    消息隊列。需要注意的是,由於數據寫入消息隊列後立即返回給用戶,數據在後續的業務校驗、寫數據庫等操作可能失敗,因此在使用消息隊列進行業務異步處理後,需要適當修改業務流程進行配合任何可以晚點做的事情都應該晚點做。

  3. 使用集羣。

  4. 代碼優化

  • 多線程。

    啓動線程數= [任務執行時間/ (任務執行時間-10 等待時間)] xCPU 內核數

    最佳啓動線程數和CPU 內核數量成正比,和IO 阻塞時間成反比。

    如果是計算型任務,那麼線程數最多不超過CPU 內核數,因爲啓動再多線程,CPU 也來不及調度;相反如果是任務需要等待磁盤操作,網絡響應,那麼多啓動線程有助於提高任務併發度,提高系統吞吐能力,改善系統性能。

  • 對象複用。單例和池技術。

  • 數據結果。

  • 垃圾回收。


16存儲性能優化

B+樹,關係型數據庫多采用此數據結構。

NoSql產品多采用LSM樹作爲主要數據結構。

在LSM 樹上進行一次數據更新不需要磁盤訪問,在內存即可完成,速度遠快於B+樹。當數據訪問以寫操作爲主,而讀操作則集中在最近寫入的數據上時,使用LSM樹可以極大程度地減少磁盤的訪問次數,加快訪問速度。

RAID,通過使用RAID 技術,實現數據在多塊磁盤上的併發讀寫和數據備份。

RAID 技術在傳統關係數據庫及文件系統中應用比較廣泛,但是在大型網站比

較喜歡使用的NoSQLÿ 以及分佈式文件系統中,RAID 技術卻遭到冷落。

17高可用性能優化


主要手段是數據和服務的冗餘備份及失效轉移。

分級管理,部署隔離。

超時設置。

異步調用。

服務降級。

冪等性設計。

CAP 原理認爲,一個提供數據服務的存儲系統無法同時滿足數據一致性

(Consistency)、數據可用性(Availibility )、分區耐受性即可擴展性(Patition Toleranceÿ 系統具有跨網絡分區的伸縮性)這三個條件。

通常我們必須去保證A可用性和P擴展性,某種程度上放棄C一致性。

數據最終一致性,這是數據一致性中較弱的一種,數據可能不一致,但經過一段時間的自我恢復和修正,數據達到最終一致。

數據備份,冷備和熱備。熱備又分同步熱備和異步熱備。

失效轉移操作由三部分組成:失效確認、訪問轉移、數據恢復。

18伸縮性優化


實現負載均衡的基礎技術:

  • HTTP 重定向

    這種負載均衡方案的優點是比較簡單。缺點是瀏覽器需要兩次請求服務器才能完成一次訪問,性能較差;重定向服務器自身的處理能力有可能成爲瓶頸,整個集羣的伸縮性規模有限;使用HTTP302 響應碼重定向,有可能使搜索引擎判斷爲SEO 作弊,降低搜索排名。因此實踐中使用這種方案進行負載均衡的案例並不多見。

  • DNS 域名解析負載均衡

    事實上,大型網站總是部分使用DNS 域名解析,利用域名解析作爲第一級負載均衡手段,即域名解析得到的一組服務器並不是實際提供Web 服務的物理服務器,而是同樣提供負載均衡服務的內部服務器,這組內部負載均衡服務器再進行負載均衡,將請求分發到真實的Web 服務器上。

  • 反向代理負載均衡

  • IP 負載均衡

  • 數據鏈路層負載均衡

    這種數據傳輸方式又稱作三角傳輸模式,負載均衡數據分發過程中不修改IP 地址,只修改目的mac 地址,通過配置真實物理服務器集羣所有機器虛擬IP 和負載均衡服務器IP 地址一致,從而達到不修改數據包的源地址和目的地址就可以進行數據分發的目的是目前大型網站使用最廣的一種負載均衡手段。在Linux 平臺上最好的鏈路層負載均衡開源產品是LVS ( Linux Virtual Server )。

19分佈式緩存

一致性哈希

計算機領域有句話:計算機的任何問題都可以通過增加一個虛擬層來解決。

。那麼在實踐中,一臺物理服務器虛擬爲多少個虛擬服務器節點合適呢?太多會影響性能,太少又會導致負載不均衡,一般說來,經驗值是150,當然根據集羣規模和負載均衡的精度需求,這個值應該根據具體情況具體對待。

20NOSQL


NoSQL數據庫產品都放棄了關係數據庫的兩大重要基礎:以關係代數爲基礎的結構化査詢語言( SQL ) 和事務一致性保證(ACID )。而強化其他一些大型網站更關注的特性:高可用性和可伸縮性。

設計網站可擴展架構的核心思想是模塊化,並在此基礎之上,降低模塊間的耦合性,提高模塊的複用性。

  • 利用分佈式消息隊列降低系統耦合性

  • 利用分佈式服務框架,如Dubbo

  • 搭建開放平臺建設網站生態圈

    API接口,協議轉換,安全,審計,路由,流程

21安全架構常見攻擊


XSS,跨站點腳本攻擊。惡意腳本執行。

防禦:消毒(特殊字符轉義)

httponly,防止XSS 攻擊者竊取Cookie。

注入攻擊,消毒,預編譯

CSRF,跨站點請求僞造。其核心是利用了瀏覽器Cookie 或服務器Session 策略,盜取用戶身份。

防禦:表單Token,驗證碼,referer check(請求來源檢查)

web應用防火牆

22加密


  • 單項散列加密

    常用的單向散列算法有MD5ÿ SHA 等。單向散列算法還有一個特點就是輸入的任何微小變化都會導致輸出的完全不同,這個特性有時也會被用來生成信息摘要、計算具有高離散程度的隨機數等用途。

  • 對稱加密

    常用的對稱加密算法有DES 算髮、RC 算法等

  • 非對稱加密

    非對稱加密的常用算法有RSA 算法


23信息過濾


  • 文本匹配

    正則表達式的效率一般較差,僅適用於短文本及低併發場景。

    高併發時使用的公幵的算法有很多,基本上都是Trie 樹的變種,空間和時間複雜度都比較好的有雙數組Trie 算法等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章