千萬級 nTB級 大型網站系統架構分析

开乐彩地址 www.tgbko.com 千萬級的注冊用戶,千萬級的帖子,nTB級的附件,還有巨大的日訪問量,大型網站采用什么系統架構保證性能和穩定性?

首先討論一下大型網站需要注意和考慮的問題。
數據庫海量數據處理:負載量不大的情況下select、delete和update是響應很迅速的,最多加幾個索引就可以搞定,但千萬級的注冊用戶和一個設計不好的多對多關系將帶來非常嚴重的性能問題。另外在高UPDATE的情況下,更新一個聚焦索引的時間基本上是不可忍受的。索引和更新是一對天生的冤家。
高并發死鎖:平時我們感覺不到,但數據庫死鎖在高并發的情況下的出現的概率是非常高的。
文件存儲的問題:大型網站有海量圖片數據、視頻數據、文件數據等等,他們如何存儲并被有效索引?高并發的情況下IO的瓶頸問題會迅速顯現。也許用RAID和專用存貯服務器能解決眼下的問題,但是還有個問題就是各地的訪問問題,也許我們的服務器在北京,可能在云南或者***的訪問速度如何解決?如果做分布式,那么我們的文件索引以及架構該如何規劃。

接下來討論大型網站的底層系統架構,來有效的解決上述問題。

毋庸置疑,對于規模稍大的網站來說,其背后必然是一個服務器集群來提供網站服務,例如,2004年eBay的服務器有2400臺,估計現在更多。當然,數據庫也必然要和應用服務分開,有單獨的數據庫服務器集群。對于像淘寶網這樣規模的網站而言,就是應用也分成很多組。

下面,就從服務器操作系統與Web服務器、數據庫、服務器集群與負載均衡、緩存、獨立的圖片服務器、其它等幾個方面來分析大型網站的系統架構。

服務器操作系統與Web服務器

最底層首先是操作系統。好的操作系統能提高好的性能、穩定性和安全性,而這些對大型網站的性能、安全性和穩定性都是至關重要的。
淘寶網(阿里巴巴): Linux操作系統 + Web 服務器: Apache
新浪:FreeBSD + Web 服務器:Apache
Yahoo:FreeBSD + Web 服務器:自己的
Google: 部分Linux + Web 服務器:自己的
百度:Linux + Web 服務器: Apache
網易:Linux + Web 服務器: Apache
eBay: Windows Server 2003/8 (大量) + Web 服務器:Microsoft IIS
MySpace: Windows Server 2003/8 + Web 服務器:Microsoft IIS

由此可見,開源操作系統做Web應用是首選已經是一個既定事實。在開源操作系統中Linux和FreeBSD差不太多,很難說哪個一定比另外一個要優秀很多、能夠全面的超越對手,應該是各有所長。但熟悉Linux的技術人員更多些,利于系統管理、優化等,所以Linux使用更廣泛。而Windows Server和IIS雖然有的網站使用,但不開源,而且需要購買微軟的一系列應用產品,限制了其使用。總之,開源操作系統,尤其是Linux做Web應用是首選已經是一個既定事實。

常用的系統架構是:
Linux + Apache + PHP + MySQL
Linux + Apache + Java (WebSphere) + Oracle
Windows Server 2003/2008 + IIS + C#/ASP.NET + 數據庫

數據庫

因為是千萬人同時訪問的網站,所以一般是有很多個數據庫同時工作的,說明白一點就是數據庫集群和并發控制,數據分布到地理位置不同的數據中心,以免發生斷電事故。

主流的數據庫有Sun的是MySQL和Oracle。

Oracle是一款優秀的、廣泛采用的商業數據庫管理軟件。有很強大的功能和安全性,可以處理相對海量的數據。而MySQL是一款非常優秀的開源數據庫管理軟件,非常適合用多臺PC Server組成多點的存儲節點陣列(這里我所指的不是MySQL自身提供的集群功能),每單位的數據存儲成本也非常的低廉。用多臺PC Server安裝MySQL組成一個存儲節點陣列,通過MySQL自身的Replication或者應用自身的處理,可以很好的保證容錯(允許部分節點失效),保證應用的健壯性和可靠性??梢哉餉此?,在關系數據庫管理系統的選擇上,可以考慮應用本身的情況來決定。

MySQL數據庫服務器的master-slave模式,利用數據庫服務器在主從服務器間進行同步,應用只把數據寫到主服務器,而讀數據時則根據負載選擇一臺從服務器或者主服務器來讀取,將數據按不同策略劃分到不同的服務器(組)上,分散數據庫壓力。

服務器集群與負載均衡

服務器群集中每個服務結點運行一個所需服務器程序的獨立拷貝,而網絡負載均衡則將工作負載在這些主機間進行分配。負載均衡建立在現有網絡結構之上,它提供了一種廉價有效的方法擴展服務器帶寬和增加吞吐量,加強網絡數據處理能力,提高網絡的靈活性和可用性。它主要完成以下任務:解決網絡擁塞問題,服務就近提供,實現地理位置無關性 ;為用戶提供更好的訪問質量;提高服務器響應速度;提高服務器及其他資源的利用效率;避免了網絡關鍵部位出現單點失效。

常用的服務器集群和數據庫集群負載均衡實現方法:
CitrixNetScaler的硬件負載均衡交換機做服務器集群的負載均衡。
MySQL Proxy做MySQL服務器集群的負載均衡并實現讀寫分離。其實現讀寫分離的基本原理是讓主數據庫處理事務性查詢,而從數據庫處理SELECT查詢。數據庫復制被用來把事務性查詢導致的變更同步到集群中的從數據庫。
CDN: 幾乎在各大網站都有使用該技術。例如,使得你的網站在各省市訪問更快,其原理是采取了分布式網絡緩存結構(即國際上流行的web cache技術),通過在現有的Internet中增加一層新的網絡架構,將網站的內容發布到最接近用戶的cache服務器內,通過DNS負載均衡的技術,判斷用戶來源就近訪問cache服務器取得所需的內容,解決Internet網絡擁塞狀況,提高用戶訪問網站的響應速度,如同提供了多個分布在各地的加速器,以達到快速、可冗余的為多個網站加速的目的。

緩存

眾所周知,使用緩存能有效應對大負載,減少數據庫的壓力,并顯著提高**應用程序的性能,如果某個用戶多次請求同一資源,則可以從緩存返回該資源,從而避免了重新從服務器或數據庫請求該資源而產生的系統開銷?;捍嬋梢醞ü跎倩袢∏肭蟮淖試此璧氖奔?,提高應用程序性能?;捍婊箍梢醞ü跎俚椒衿韉耐蕩問?,降低網絡通信量。盡管緩存可以提高性能,但它也增加了返回到應用程序的資源可能變得陳舊的風險。這意味著,返回的資源可能與假設沒有使用緩存的情況下,服務器有可能發送的資源并不完全相同(即取得“臟數據”)。

即便如此,簡單的緩存策略也能大大提升網站性能。例如,Youtube把首頁最新的視頻列表緩存60秒,也就是說60秒內并發的request都是從緩存讀取的,大大減少了數據庫壓力。再加上CDN,使得Youtube首頁的并發訪問速度很快。

單機內存緩存、文件緩存、數據庫緩存等的策略都是可以很簡單的實現的,例如可以使用微軟的Caching Application Block,但如何在集群環境中使多個緩存、**緩存并保存同步是個重大問題。大型網站一般都使用緩存服務器群,并使用**緩存。業內最常用的有:
Squidcache,Squid服務器群,把它作為web服務器端前置cache服務器緩存相關請求來提高web服務器速度。Squid將大部分靜態資源(圖片,js,css等)緩存起來,直接返回給訪問者,減少應用服務器的負載
memcache,memcache服務器群,一款分布式緩存產品,很多大型網站在應用; 它可以應對任意多個連接,使用非阻塞的網絡IO。由于它的工作機制是在內存中開辟一塊空間,然后建立一個HashTable,Memcached自管理這些HashTable。因為通常網站應用程序中最耗費時間的任務是數據在數據庫的檢索,而多個用戶查詢相同的SQL時,數據庫壓力會增大,而通過memcache的查詢緩存命中,數據直接從memcache內存中取,每次緩存命中將替換到數據庫服務器的一次往返,到達數據庫服務器的請求更少,間接地提高了數據庫服務器的性能,從而使應用程序運行得更快。它通過基于內存緩存對象來減少數據庫查詢的方式改善網站系統的反應,其最吸引人的一個特性就是支持分布式部署。有關memcache,以下文章可以參考:參考1,參考2,參考3官方站點。
e-Accelerator,比較特殊,PHP的緩存和加速器。是一個免費開源的PHP加速、優化、編譯和動態緩存的項目,它可以通過緩存PHP代碼編譯后的結果來提高PHP腳本的性能,使得一向很復雜和離我們很遠的 PHP腳本編譯問題完全得到解決。通過使用eAccelerator,可以優化你的PHP代碼執行速度,降低服務器負載,可以提高PHP應用執行速度最高達10倍。

獨立的圖片服務器

無論從管理上,還是從性能上看,只要有可能,盡量部署獨立的圖片服務器。這幾乎成為常識了。具備獨立的圖片服務器或者服務器集群后,在 Web 服務器上就可以有針對性的進行配置優化。

其他

一個互聯網應用,除了服務器的操作系統,Web Server軟件,應用服務器軟件,數據庫軟件外,我們還會涉及到一些其他的系統,比如一些中間件系統、文件存儲系統(圖片服務器,視頻服務器,管理服務器,RSS和廣告服務器等等)、全文檢索、搜索、等等。

發表評論

電子郵件地址不會被公開。