學習Mozilla如何擴展網站
英文原文:Learning to Scale Websites at Mozilla
Mozilla 的 Web 運營工程師 Brandon Burton 透露,通過內部學習的簡易擴展模式,Mozilla 將網站服務能力的規模從支撐數千用戶擴展到支撐數億用戶。這些學習內容包括緩存、橫向擴展 Web 服務器、異步作業和數據庫。在洛杉磯舉行的 DevOps 集會中,Brandon 代表 Mozilla 對這些主題進行了深入分析。此外,他還分享了 Mozilla 對 DevOps 能力未來的技術規劃,包括自服務部署、平臺即服務(PaaS)和公有云的使用。以下是 Brandon 的演講要點:
緩存:使網站能夠高效運行的緩存主要有三種:內存數據緩存、本地資源緩存和全局資源緩存。內存數據緩存(例如針對會話狀態的 memcache)最適宜于存儲那些本身是無狀態協議一部分的 HTTP 請求之間的狀態。接下來是直接位于網站前方的本地資源緩存/代理,它能夠存儲圖像及其他靜態文件,使網絡服務器不必處理相關的請求就能夠快速檢索,此類工具包括 Stingray、Varnish 和 Squid。最后是全局資源緩存(例如,內容分發網絡,簡稱 CDN),它的作用和之前介紹的本地資源緩存相似,但它會存儲更貼近最終用戶的緩存文件。此外,這些全局資源緩存(CDN)會根據每個用戶的位置動態選擇最佳網絡路由。Brandon 介紹說 Mozilla 同時使用 Akamai 和 EdgeCast 作為他們的 CDN。
橫向擴展 Web 服務器:Web 服務器的橫向擴展可通過自動化工具釋放和配置。所有的 Web 服務器都不會為自己或者其他的 Web 服務器將 HTTP 請求過程中有持久性要求的狀態存儲在本地,基本上“沒有分享任何內容”。Web 服務器通過使用像 memcache、NFS 或 S3這樣的技術將它們的狀態存儲在自己的外部。因此,Web 服務器可以被釋放或添加到池中,而不會對其他的 Web 服務器產生負面影響。自動化工具(例如 cfengine、Opscode Chef 或 Puppet)為網絡服務器約定了一個眾所周知的運轉狀態,可以被添加到待擴展的 Web 服務器池中。這些工具也可以管理全部網絡服務器的更新。
異步作業:在使用網站的過程中,用戶期待快速響應。異步處理用戶的請求能夠減少服務器計算資源的競爭,為最終用戶的各個請求提供更好的響應。在某些情況下,用戶請求了很復雜的任務,為了保持相似的性能,除了異步之外沒有其他的合理方式能夠處理。Brandon 聲稱,Mozilla 通過將諸如 Celery 和 RabbitMQ 等工具協同工作促進了任務的異步處理。
數據庫:Mozilla 使用 multi-master MySQL 來提供高可用性,同時該 MySQL 的從屬(slaves)用于提供數據的只讀訪問。此外,從屬位于負載均衡器之后,這樣讀取請求的處理能夠被分發到不同的服務器,以免某個服務器過載。Fusion-IO 和 Kingston SSD 存儲也有助于提升數據庫的性能。Brandon 還強調了“優秀的 DBA”對 Mozilla 的重要性,他們維護之前提到的數據庫系統。
Brandon 分享了 Mozilla 改進 DevOps 的未來計劃。他們將會通過 Jenkins 構建自服務部署。Mozilla 將基于 ActiveState 的 Stackato 技術為其內部開發團隊建設 PaaS。同時 Mozilla 也在努力擴展到 AWS 公有云上。
Brandon 將在今年 2 月在洛杉磯舉行的 Scale11x 大會上針對這些內容給出更深入的技術分析。他還在幫助推動 hangops,一個每周一度的 Google 聚會,在那里會就 DevOps 話題進行時長一小時的討論。主題包括文化、遠程工作與運營工具。
來自: InfoQ