深入淺出網站高性能架構設計

性能是網站的重要指標,如果一個網站的訪問速度很慢,就會直接導致大量用戶的流失。所以說,性能是設計網站架構時要考慮的關鍵因素。也因此,網站的性能問題成了網站架構升級、優化的導火索。

目前,爲了優化網站性能,業界出現了很多相關的架構改進方案和技術手段。而包括了這些升級、優化網站性能的方案、技術手段在內的高性能架構設計,是個很大的話題,單單依靠幾篇文章是很難講清楚的。所以,我從中精選了一些對測試工程師比較關鍵的概念和技術,和你展開今天的分享。

如果你想了解更細節的技術實現的話,可以參考我在上一篇文章中推薦的學習資料,也可以直接在留言區給我留言。

從全局來看,網站的高性能架構設計包括兩大部分內容:一是前端性能,二是後端服務器相關的性能優化和架構設計。

前端的高性能架構

關於什麼是前端性能,以及如何設計針對前端性能的測試,你可以直接參考第31篇文章《工欲善其事必先利其器:前端性能測試工具原理與行業常用工具簡介》中的相關內容。

相對來說,前端高性能架構比較直觀易懂,其本質就是通過各種技術手段去優化用戶實際感受到的前端頁面展現時間。

目前,業內的標準實踐是來自於雅虎前端性能團隊提出的35條原則,我已經在第29篇文章《聊聊性能測試的基本方法與應用領域》中,爲你解讀了其中幾個比較典型的規則,你可以再回顧下。同時,你還可以訪問雅虎網站查看經典的35條規則,以及對各規則的詳細解讀。

前端的高性能架構相對於後端來講比較容易實現,因爲前端性能優化的方法是相對標準的。而且,目前的前端性能測試工具,比如我在前面文章中曾經介紹過的WebPageTest和YSlow之類的工具等,都能系統性地分析前端的性能問題,並給出對應的解決方案建議。

可以說,我們只要在項目開發過程中,把前端性能優化納入了測試範圍,那麼一般來講都能獲得比較理想的性能優化結果。

後端服務器的高性能架構

後端服務器的高性能架構,業內採用的最主要的技術手段是緩存。同時,集羣也可以從計算能力的角度,提升後端的處理性能。

緩存

可以說,在計算機的世界中,凡是想要提高性能的場合都會使用到緩存的思想。緩存是指將數據存儲在訪問速度相對較快的存儲介質中,所以從緩存中讀取數據的速度更快。

另外,如果緩存中的數據是經過複雜計算得到的,那麼再次使用被緩存的數據時,就無需再重複計算即可直接使用。從這個意義上講,緩存還具有降低後端運算負載的作用。

可見,緩存在軟件系統和網站架構中幾乎無處不在。當然了,在系統和軟件的不同級別對應有不同層級的緩存:

  • 瀏覽器級別的緩存,會用來存儲之前在網絡上下載過的靜態資源;
  • CDN本質也是緩存,屬於部署在網絡服務供應商機房中的緩存;
  • 反向代理服務器本質上同樣也是緩存,屬於用戶數據中心最前端的緩存;
  • 數據庫中的“熱點”數據,在應用服務器集羣中有一級緩存,在緩存服務集羣中有二級緩存;
  • 甚至是用於URL和服務器IP地址轉換DNS服務器,爲了減少重複查詢的次數也採用了緩存。

啓用了緩存後,當應用程序需要讀取數據時,會先試圖從緩存中讀取:

  • 如果讀取成功,我們稱爲緩存命中,此時就可以在很大程度上降低訪問數據庫的時間開銷。
  • 如果沒有讀取到數據或者緩存中的數據已經過期失效,那麼應用程序就會訪問數據庫去獲取相應的數據。獲取到數據後,在把數據返回給應用程序的同時,還會把該數據寫入到緩存中,以備下次使用。

緩存主要用來存儲那些相對變化較少,並且遵從“二八原則”的數據。這裏的“二八原則”指的是80%的數據訪問會集中在20%的數據上

也就是說,如果我們將這20%的數據緩存起來,那麼這些數據就會具有非常高的讀寫比。讀寫比越高,說明緩存中的數據被使用的次數也就越多,從而節省的數據庫訪問也就越多,緩存的優勢也就越明顯。

需要特別注意的是,緩存技術並不適用於那些需要頻繁修改的數據。對於這種需要頻繁修改的數據來說,經常會出現剛剛寫入緩存的數據還沒來得及被讀取就已經失效了的場景。所以,在這種情況下,緩存不僅不會帶來性能提升,反而會增加系統開銷。

從理論上來講,緩存的作用是輔助提升數據的讀取性能,緩存數據丟失或者緩存不可用不應該影響整個系統的可用性,因爲即使沒有了緩存,數據依舊可以從數據庫中獲得。但是,現在的數據庫已經習慣了有緩存的日子,假如哪天緩存系統奔潰了,就會在短時間內有大量的請求來訪問數據庫,數據庫就很可能會因爲無法承受這樣的併發壓力而宕機。

爲了解決這個問題,有些網站會使用緩存熱備等技術手段來提供緩存的高可用性,即:當某臺緩存服務器宕機的時候,會將緩存訪問切換到熱備的緩存服務器上。

另外,如果你採用了分佈式緩存服務器集羣的話,那麼緩存的數據將被分佈到集羣中的多臺服務器上,當其中一臺服務器宕機的時候,也只會丟失一部分緩存數據,此時通過訪問數據庫來重建這些緩存數據的開銷並不算太大。

目前,分佈式緩存架構的主流技術方案有兩種:

  • 一種是,在企業級應用中廣泛採用的JBoss Cache。JBoss Cache需要在緩存集羣中的每臺機器上同步所有緩存的副本,當集羣規模比較大的時候,同步代價會很高。而且,多份副本也會造成存儲資源的浪費。但其最大的優點是速度非常快,所以JBoss Cache更適用於企業級規模不是很大的緩存集羣。這種企業級的集羣一般在幾臺到十幾臺服務器的規模。
  • 另一種是,在互聯網應用的主流Memcached。Memcached屬於互不通信的分佈式架構,集羣中各個節點緩存的數據都不一樣,緩存使用者基於Hash一致性算法來定位具體的內容到底緩存在集羣中的哪個節點。
    因此,Memcached具有緩存容量大,存儲效率高,可以很方便地支持集羣的擴展,但是速度相對較慢的特點。這些特點決定了Memcached非常適用於現如今的互聯網產品架構,幾乎成爲了網站分佈式緩存架構的代名詞。

互聯網產品架構的應用服務器集羣規模一般都很大,即使小規模的應用集羣也有上百臺機器,規模大的話可以達到上萬臺,這種架構下的緩存集羣規模要求也非常大。

通過上面這些些緩存的基礎知識,再結合着你在平時項目中積累的相關經驗,相信你已經理解了緩存的原理。那麼,接下來我們再從測試人員的視角來看看,在執行測試時需要考慮到哪些與緩存相關的測試場景:

  • 對於前端的測試場景,需要分別考慮緩存命中和緩存不命中情況下的頁面加載時間。
  • 基於緩存過期測試策略的設計,需要考慮到必須要重新獲取數據的測試場景。
  • 需要針對可能存在的緩存“髒數據”,進行有針對性的測試。緩存“髒數據”,是指數據庫中的數據已經更新,但是緩存中的數據還沒來得及更新的場景。
  • 需要針對可能的緩存穿透進行必要的測試。緩存穿透,是指訪問的數據並不存在,所以這部分數據永遠不會有被緩存的機會,因此此類請求會一直重複訪問數據庫。
  • 系統冷啓動後,在緩存預熱階段的數據庫訪問壓力是否會超過數據庫實際可以承載的壓力。
  • 對於分佈式緩存集羣來說,由於各集羣使用的緩存算法不同,那麼如果要在緩存集羣中增加更多節點進行擴容的話,擴容對原本已經緩存數據的影響也會不同。所以,我們需要針對緩存集羣擴容的場景,進行必要的測試和性能評估。

集羣

集羣也是提升網站性能和併發處理能力的典型架構設計方法。

當一臺服務器不足以滿足日益增長的用戶流量時,我們就可以考慮使用多臺服務器來組成一個集羣:外部請求將統一和負載均衡器打交道;負載均衡器根據不同的負載調度算法,將訪問請求傳遞給集羣中的某臺服務器處理。

需要注意的是,在這種模式下,集羣中的任何一臺服務器宕機都不會給整個系統帶來明顯的影響。此時,每臺服務器的地位也都不怎麼高,我們可以直接替換掉出現了問題的某臺服務器。同樣地,當需要支持更大的系統負載時,我們就可以在集羣中添加更多的服務器。

這時,集羣中的每臺服務器都可以被隨時替換或者淘汰掉,就像“牲口”似的可以任人宰割。所以,這種模式,就有點類似於“牲口”模式。

與“牲口”模式對應的是“寵物”模式,比如一些企業級的應用,它們往往不通過集羣來擴展系統的能力和提高系統的性能,而是採用更爲強勁的服務器。

這種性能非常強大的單臺服務器,價格往往十分昂貴,所以通常都會被特別關照,比如給其配備最好的機房和UPS等等。另外,大家都不敢對這樣的服務器有任何大的動作,生怕把它們搞壞了。此時,這些價格昂貴的服務器更像是“寵物”。

綜上所述,現今的互聯網應用採用的都是“牲口”模式。在這種模式下,我們在開展測試時,相應地需要額外關注以下這些測試點:

  • 集羣容量擴展。也就是說,集羣中加入新的節點後,是否會對原有的session產生影響。
  • 對於無狀態應用,是否可以實現靈活的實效轉移。
  • 對於基於session的有狀態應用,需要根據不同的session機制驗證會話是否可以正常保持,即保證同一session始終都有同一個確定的節點在處理。
  • 當集羣中的一個或者多個節點宕機時,對在線用戶的影響是否符合設計預期。
  • 對於無狀態應用來說,系統吞吐量是否能夠隨着集羣中節點的數量呈線性增長。
  • 負載均衡算法的實際效果,是否符合預期。
  • 高併發場景下,集羣能夠承載的最大容量。

總結

今天,我以測試人員的視角,和你分享了網站高性能架構設計中,需要重點關注的點。

首先,網站的性能,在很大程度上和用戶的體量有直接關係。因此,開發人員在設計網站架構時,必須要重點考慮與性能相關的架構設計。相應地,測試人員在測試網站性能時,也要考慮到這其中的架構設計。

其次,網站高性能架構設計,主要包括前端性能優化和後端服務器的性能調優。所以,我從這兩個方面,和你展開了今天的分享。測試人員在理解了兩大部分知識的基礎上,在設計具體的測試時,要考慮到這些網站高性能架構設計的方案、技術手段,以此制定出需要額外增加的測試點,以及對應的測試方法。

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