Wikipedia 網(wǎng)站整體架構(gòu)

GeoDNS:基于開源域名服務(wù)器軟件 BIND(Berkeley Internet Name Domain)的增強版本,可將域名解析到離用戶最近的服務(wù)器。
LVS:基于 Linux 的開源負載均衡服務(wù)器。
Squid:基于 Linux 的開源反向代理服務(wù)器。
Lighttpd:開源的應(yīng)用服務(wù)器,較主流的 Apache 服務(wù)器更輕量、更快速。實踐中,有許多網(wǎng)站使用 Lighttpd 作為圖片服務(wù)器。
PHP:免費的 Web 應(yīng)用程序開發(fā)語言,最流行的網(wǎng)站建設(shè)語言。
Memcached:無中心高性能的開源分布式緩存系統(tǒng),穩(wěn)定、可靠、歷久彌新,是網(wǎng)站分布式緩存服務(wù)必備的。
Lucene:由 Apache 出品,Java 開發(fā)的開源全文搜索引擎。
MySQL:開源的關(guān)系數(shù)據(jù)庫管理系統(tǒng)。
Wikipedia 前端性能優(yōu)化
所謂網(wǎng)站前端是指應(yīng)用服務(wù)器(也就是 PHP 服務(wù)器)之前的部分,包括 DNS 服務(wù)、CDN 服務(wù)、反向代理服務(wù)、靜態(tài)資源服務(wù)等。對 Wikipedia 而言,80% 以上的用戶請求可以通過前端服務(wù)返回,請求根本不會達到應(yīng)用服務(wù)器,這也就使得網(wǎng)站最復(fù)雜、最有挑戰(zhàn)的應(yīng)用服務(wù)端和存儲端壓力驟減。

Wikipedia 前端架構(gòu)的核心是反向代理服務(wù)器 Squid 集群,大約部署有數(shù)十臺服務(wù)器,請求通過 LVS 負載均衡地分發(fā)到每臺 Squid 服務(wù)器,熱點詞條緩存在這里,大量請求可直接返回響應(yīng),請求無需發(fā)送到 Apache 服務(wù)器,減輕應(yīng)用負載壓力。Squid 緩存不能命中的請求再通過 LVS 發(fā)送到 Apache 應(yīng)用服務(wù)器集群,如果有詞條信息更新,應(yīng)用服務(wù)器使用 Invalidation Notification 服務(wù)通知 Squid 緩存失效,重新訪問應(yīng)用服務(wù)器更新詞條。
而在反向代理 Squid 之前,則是被 Wikipedia 技術(shù)團隊稱為"圣杯"的 CDN 服務(wù),CDN服務(wù)對于 Wikipedia 性能優(yōu)化居功至偉。因為用戶查詢的詞條大部分集中在比重很小的熱點詞條上,將這些詞條內(nèi)容頁面緩存在 CDN 返回,響應(yīng)速度非??欤@些請求甚至根本不會到達 Wikipedia 數(shù)據(jù)中心的 Squid 服務(wù)器,服務(wù)器壓力減小,節(jié)省的資源可以更快地處理其他未被 CDN 緩存的請求。
Wikipedia CDN 緩存的幾條準(zhǔn)則為:
內(nèi)容頁面不包含動態(tài)信息,以免頁面內(nèi)容緩存失效或者包含過時信息。
每個內(nèi)容頁面有唯一的 REST 風(fēng)格的 URL,以便 CDN 快速查找并避免重復(fù)緩存。
在 HTML 響應(yīng)頭寫入緩存控制信息,通過應(yīng)用控制內(nèi)容是否緩存及緩存有效期等。
Wikipedia 服務(wù)端性能優(yōu)化
服務(wù)端主要是 PHP 服務(wù)器,這里是網(wǎng)站業(yè)務(wù)邏輯的核心部分,運行的模塊都比較復(fù)雜笨重,需要消耗較多的資源,Wikipedia 將最好的服務(wù)器部署在這里(和數(shù)據(jù)庫配置一樣的服務(wù)器),從硬件上改善性能。
除了硬件改善,Wikipedia 還使用許多其他開源組件對應(yīng)層進行如下優(yōu)化。
使用 APC,這是一個 PHP 字節(jié)碼緩存模塊,可以加速代碼執(zhí)行減少資源消耗。
使用 Imagemagick 進行圖片處理和轉(zhuǎn)化。
使用 Tex 進行文本格式化,特別是將科學(xué)公式內(nèi)容轉(zhuǎn)化成圖片格式。
替換 PHP 的字符串查找函數(shù) strtr(),使用更優(yōu)化的算法重構(gòu)。
Wikipedia 后端性能優(yōu)化
包括緩存、存儲、數(shù)據(jù)庫等被應(yīng)用服務(wù)器依賴的服務(wù)都可以歸類為后端服務(wù)。后端服務(wù)通常是一些有狀態(tài)的服務(wù),即需要提供數(shù)據(jù)存儲服務(wù),這些服務(wù)大多建立在網(wǎng)絡(luò)通信和磁盤操作基礎(chǔ)上,是性能的瓶頸,也是性能優(yōu)化的重災(zāi)區(qū)。
后端優(yōu)化最主要的手段是使用緩存,將熱點數(shù)據(jù)緩存在分布式緩存系統(tǒng)的內(nèi)存中,加速應(yīng)用服務(wù)器的數(shù)據(jù)讀操作速度,減輕存儲和數(shù)據(jù)庫服務(wù)器的負載。Wikipedia 的緩存使用策略如下:
熱點特別集中的數(shù)據(jù)直接緩存到應(yīng)用服務(wù)器的本地內(nèi)存中,因為要占用應(yīng)用服務(wù)器的內(nèi)存且每臺服務(wù)器都需要重復(fù)緩存這些數(shù)據(jù),因此這些數(shù)據(jù)量很小,但是讀取頻率極高。
緩存數(shù)據(jù)的內(nèi)容盡量是應(yīng)用服務(wù)器可以直接使用的格式,比如 HTML 格式,以減少應(yīng)用服務(wù)器從緩存中獲取數(shù)據(jù)后解析構(gòu)造數(shù)據(jù)的代價。
使用緩存服務(wù)器存儲 session 對象。
相比數(shù)據(jù)庫,Memcached 的持久化連接非常廉價,如有需要就創(chuàng)建一個 Memcached 連接。
作為存儲核心資產(chǎn)的 MySQL 數(shù)據(jù)庫,Wikipedia 也做了如下優(yōu)化:
使用較大的服務(wù)器內(nèi)存。在 Wikipedia 應(yīng)用場景中,增加內(nèi)存比增加其他資源更能改善 MySQL 性能。
使用 RAID0 磁盤陣列以加速磁盤訪問,RAID0 雖然加速磁盤訪問,但是卻降低了數(shù)據(jù)庫持久可靠性(一塊盤壞了,整個數(shù)據(jù)庫的數(shù)據(jù)都不完整了)。顯然 Wikipedia 認為性能問題迫在眉睫,而數(shù)據(jù)可靠性問題可以通過其他手段解決(如 MySQL 主從復(fù)制,數(shù)據(jù)一步備份等)。
將數(shù)據(jù)庫事務(wù)一致性設(shè)置在較低水平,加快系統(tǒng)恢復(fù)速度。
如果 Master 數(shù)據(jù)庫死機,立即將應(yīng)用切換到 Slave 數(shù)據(jù)庫,同時關(guān)閉數(shù)據(jù)寫服務(wù),這意味著關(guān)閉詞條編輯功能。Wikipedia 通過約束業(yè)務(wù)獲得更大的技術(shù)方案選擇余地,很多時候業(yè)務(wù)后退一小步,技術(shù)就可以前進一大步。