維基百科的高性能架構(gòu)設(shè)計分析

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

Wikepedia 架構(gòu)圖
  1. GeoDNS:基于開源域名服務(wù)器軟件 BIND(Berkeley Internet Name Domain)的增強版本,可將域名解析到離用戶最近的服務(wù)器。

  2. LVS:基于 Linux 的開源負載均衡服務(wù)器。

  3. Squid:基于 Linux 的開源反向代理服務(wù)器。

  4. Lighttpd:開源的應(yīng)用服務(wù)器,較主流的 Apache 服務(wù)器更輕量、更快速。實踐中,有許多網(wǎng)站使用 Lighttpd 作為圖片服務(wù)器。

  5. PHP:免費的 Web 應(yīng)用程序開發(fā)語言,最流行的網(wǎng)站建設(shè)語言。

  6. Memcached:無中心高性能的開源分布式緩存系統(tǒng),穩(wěn)定、可靠、歷久彌新,是網(wǎng)站分布式緩存服務(wù)必備的。

  7. Lucene:由 Apache 出品,Java 開發(fā)的開源全文搜索引擎。

  8. 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)

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ù)就可以前進一大步。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容