最近幾天一直在讀代震軍的部落格,他是Discuz!NT的設計者,讀了他的一系列關於Discuz!NT的架構設計文章,大呼過癮,特別是Discuz!NT在解決高訪問高並發時所設計的一系列方案,本人尤其感興趣。寫這篇文章的目的,算是對初次閱讀之後的總結備忘吧,以便以後有時間親自測試,如果能在生產環境中得到應用,那就更有參考價值了。
測試方法:
本地類比測試網站高訪問高並發採用的測試載入器是大名鼎鼎的Loadrunner,這個工具做測試的一般都知道。在代震軍的部落格中,有以下幾篇介紹了通過Loadrunner進行壓力並發測試。
當DiscuzNT遇上了Loadrunner(上)
http://www.cnblogs.com/daizhj/archive/2009/09/25/1573926.html
當DiscuzNT遇上了Loadrunner(中)
http://www.cnblogs.com/daizhj/archive/2009/09/27/1574897.html
當DiscuzNT遇上了Loadrunner(下)
http://www.cnblogs.com/daizhj/archive/2009/09/27/1575091.html
Discuz!NT是一個論壇程式,是典型的互連網應用,在設計時本身就考慮了互連網應用情境下高並發高訪問量的需求,在普通開源版本中,主要採用的緩衝機制來提高系統的效能。
一、緩解資料庫讀取壓力
相關文章如下:
Discuz!NT 緩衝設計簡析 [原創]
http://www.cnblogs.com/daizhj/archive/2007/08/15/855163.html
這個緩衝機制使用的是.Net本身提供的緩衝功能,System.Web.Caching.Cache
這個方案可以解決一般訪問量不是很大的網站的需求,更高一級的,可以通過增加Web園背景工作處理序來達到提升效能的需求,而且這個方案裡面,已經解決多進程下緩衝同步的問題。
在Discuz!NT企業版中,提供了更高層次的解決方案,使用了分布式緩衝機制,引入了Memcached、Redis、LLServer,相關文章如下:
Discuz!NT中整合Memcached分布式緩衝
http://www.cnblogs.com/daizhj/archive/2009/03/23/1386652.html
在Discuz!NT中進行緩衝分層(本機快取+memcached)
http://www.cnblogs.com/daizhj/archive/2009/11/17/1604436.html
Discuz!NT中的Redis架構設計
http://www.cnblogs.com/daizhj/archive/2011/02/21/1959511.html
Discuz!NT跨站緩衝同步
http://www.cnblogs.com/daizhj/archive/2010/06/18/discuznt_memcache_syncdata.html
Discuz!NT中的LLServer架構設計
http://www.cnblogs.com/daizhj/archive/2011/08/26/discuznt_llserver_arch.html
Memcached是danga.com(運營LiveJournal的技術團隊)開發的一套分布式記憶體對象緩衝系統,用於在動態系統中減少資料庫負載,提升效能。具體的介紹可以參考:
Memcached深度分析
http://www.cnblogs.com/luluping/archive/2009/01/14/1375456.html
通過以上的方案,能解決大部分高訪問高並發的需求,因為論壇產品的特殊性,讀寫比大概是4:1,所以首先應該在讀資料方面進行減壓最佳化。
二、緩解Web伺服器壓力
Discuz!NT在緩解Web伺服器壓力上採用了如下的方案。
將使用者上傳的附件通過FTP方式傳送到另外一台伺服器上,相關的文章如下:
Discuz!NT中遠程附件的功能實現[FTP協議]
http://www.cnblogs.com/daizhj/archive/2008/07/28/1254648.html
3. 通過SQUID將靜態檔案快取分布
使用SQUID做靜態前端,將論壇中的大部分靜態檔案布署或外鏈到一個新的HTTP連結上,從而給Web伺服器減壓,提升效能。
Discuz!NT靜態檔案快取(SQUID)解決方案
http://www.cnblogs.com/daizhj/archive/2010/06/10/1692758.html
三、負載平衡
通過以上的方案,Web伺服器壓力小了,效能也提升了,但是如果遇到更高的並發訪問量,單台Web伺服器還是不能滿足需求,Discuz!NT採取了負載平衡的方案。使用了LVS+KEEPALIVED、NGINX等。相關文章如下:
Discuz!NT負載平衡解決方案(HA)之---LVS(Linux Virtual Server)
http://www.cnblogs.com/daizhj/archive/2010/06/13/1693673.html
Discuz!NT負載平衡解決方案(HA)之---LVS(Linux Virtual Server)
http://www.cnblogs.com/daizhj/archive/2010/06/13/1693673.html
Discuz!NT負載平衡方案
http://www.cnblogs.com/daizhj/archive/2010/06/24/1667422.html
使用的是nginx,使用nginx作為前端負載平衡,這個確實很有吸引力,有時間能試用下就好。
四、緩解資料庫壓力
在Discuz!NT中,資料庫作為資料持久化工具,必定在並發訪問頻繁且負載壓力較大的情況下成為系統效能的‘瓶頸’。即使使用上面的本機快取等方式來解決頻繁訪問資料庫的問題,但仍舊會有大量的並發請求要訪問動態資料, 其中的‘讀寫分離’方案就是一種被廣泛採用的方案。相關文章:
Discuz!NT資料庫讀寫分離方案
http://www.cnblogs.com/daizhj/archive/2010/06/21/dbsnap_master_slave_database.html
全文檢索搜尋方案:
Discuz!NT企業版之Sphinx全文檢索搜尋(上)
http://www.cnblogs.com/daizhj/archive/2010/06/28/discuznt_entlib_sphinx_one.html
Discuz!NT企業版之Sphinx全文檢索搜尋(下)
http://www.cnblogs.com/daizhj/archive/2010/06/30/discuznt_entlib_sphinx_two.html
處理大資料量:
Discuz!NT千萬級資料量上的兩駕馬車--TokyoCabinet,MongoDB
http://www.cnblogs.com/daizhj/archive/2010/07/22/1781140.html
好了,上面就是Discuz!NT企業版為了提升效能採取的一系列方案,確實對asp.net互連網應用很有參考價值,其中用到的很多開源產品都是基於Linux的,如Memcached、Redis、LLServer、SQUID、NGINX、LVS、Sphinx,雖然有些產品有Windows版本,但是其效能表現能力遠遠比不上Linux上面,看來在Web應用上,效能方面的表現以及開源產品的研究,Linux遠遠的走在了Windows前面。