# 史詩般的 TripAdvisor 更新:為什么不在云上運行? 盛大的實驗
> 原文: [http://highscalability.com/blog/2012/10/2/an-epic-tripadvisor-update-why-not-run-on-the-cloud-the-gran.html](http://highscalability.com/blog/2012/10/2/an-epic-tripadvisor-update-why-not-run-on-the-cloud-the-gran.html)

*這是 [Shawn Hsiao](http://www.linkedin.com/in/phsiao) , [Luke Massa](http://www.princeton.edu/rocky/people/residential-college-advis/luke-massa/) 和 [Victor Luu](http://www.linkedin.com/pub/victor-luu/57/243/91a) 的來賓帖子。 肖恩負責運行[,TripAdvisor](http://www.tripadvisor.com/) 的技術運營團隊,盧克和維克托在去年夏天加入了他的團隊。 該帖子由 TripAdvisor 的工程負責人 [Andy Gelfond](http://www.linkedin.com/in/andrewgelfond) 介紹。*
距離我們上一篇關于 [TripAdvisor 建筑](http://highscalability.com/blog/2011/6/27/tripadvisor-architecture-40m-visitors-200m-dynamic-page-view.html)的帖子已經過去了一年多。 這是令人興奮的一年。 我們的業務和團隊不斷增長,我們現在是一家獨立的上市公司,隨著我們的發展,我們繼續保持/擴展我們的開發流程和文化-我們仍然經營著數十個獨立團隊,每個團隊繼續在整個 整個堆棧。 唯一改變的是數字:
* 每月 5600 萬訪客
* 每天有 350M +頁的請求
* 120TB +的倉庫數據在大型 Hadoop 集群上運行,并且迅速增長
我們還有一個非常成功的大學實習計劃,該計劃于去年夏天招募了 60 多名實習生,所有這些人很快就入職,并且與我們的全職工程師一樣從事相同的工作。
這里反復出現的一個想法是,為什么不在云上運行? 我們的兩個暑期實習生 Luke Massa 和 Victor Luu 通過在 Amazon Web Services 上部署我們網站的完整版本來認真研究這個問題。 用他們自己的話說,以及很多技術細節,這里是他們去年夏天所做的事情的故事。
## 在 AWS 上運行 TripAdvisor
今年夏天,我們在 TripAdvisor 開展了一個實驗項目,以評估在亞馬遜的彈性云計算(EC2)環境中運行整個生產站點的情況。 當我們第一次嘗試在 EC2 環境中托管 www.tripadvisor.com 和所有國際域時,我們工程組織的許多成員的回應非常簡單:當我們已經擁有自己的硬件時,真的值得向 Amazon 付錢嗎? 而且效果還可以嗎?
幾個月后,隨著我們在云端的偉大實驗即將結束,**答案當然是肯定的,**是。 在這段時間內,我們學到了很多東西,不僅是關于 AWS 的驚人好處和嚴重的陷阱,而且還了解了如何在我們自己的傳統托管環境中改進架構。 盡管我們還沒有準備好翻轉 DNS 并通過 AWS 發送所有流量,但事實證明,它的靈活性是一種非常有用和實用的學習工具!
## 項目目標
* 使用 EC2 構建整個站點,并演示我們可以獲取生產級流量
* 為此操作建立成本模型
* 確定有助于降低成本和提高可伸縮性的體系結構更改
* 使用此遷移到新平臺可以發現我們當前架構的可能改進。
## 建筑
我們的目標是為現場站點建立一個功能完備的鏡像,以實現生產級流量。 我們將其稱為“ Project 700k”,因為我們試圖每分鐘處理 700k HTTP 請求,并且具有與我們的實時站點相同的用戶體驗。 用戶體驗將通過請求響應時間統計信息來衡量。 經過大量的擺弄和調整,我們最終提出了以下系統架構:
**虛擬私有云**-我們所有的服務器都托管在單個 VPC 或虛擬私有云中。 這是亞馬遜在單個地理區域內提供虛擬網絡的方式(我們碰巧在美國東部弗吉尼亞州,但理論上我們可以在加利福尼亞州,愛爾蘭等地啟動一個全新的 VPC),所有實例都使用私有 IP 相互尋址 。
**子網**-在 VPC 內,我們有兩個子網,為簡單起見,每個子網當前位于同一可用區域中,但我們計劃稍后將它們擴展以實現冗余。 第一個子網具有其安全設置,允許來自 Internet(我們稱為公共子網)的傳入和傳出流量。 第二個私有子網,僅允許來自公共子網的流量。 Public Subnet 包含一個登臺服務器,它使我們可以通過 SSH 進入私有子網,以及一組稍后將要介紹的負載均衡器。 我們所有的服務器,內存緩存和數據庫都位于專用子網中。
**前端和后端服務器**-前端負責接受用戶請求,處理請求,然后向用戶顯示請求的數據,并提供正確的 HTML,CSS 和 javascript 。 前端使用 Java 處理大多數此類處理,并且可以查詢內存緩存或后端以獲取其他數據。 假設服務器正確地進行了負載平衡,那么所有前端的創建方式都是相同的,并且應該承載相似的流量。
后端實例被配置為托管特定服務,例如媒體或度假租賃。 由于這種分布,一些服務器配置為執行多個較小的作業,而其他服務器配置為執行一個較大的作業。 這些服務器還可以進行內存緩存或數據庫調用來執行其工作。
**負載均衡器**-為了充分利用彈性,我們使用 Amazon 的 ELB(彈性負載均衡器)來管理前端和后端服務器。 前端專門屬于一個池,因此僅在一個負載平衡器下列出。 但是,后端可以執行多種服務,因此在多個負載平衡器下列出。 例如,后端可能負責搜索,論壇和社區服務,然后成為這三個負載平衡器的一部分。 之所以可行,是因為每個服務都在唯一的端口上進行通信。 所有前端服務器和后端服務器都配置為發送和接收來自負載平衡器的請求,而不是直接與其他實例進行通信。
**登臺服務器**-另一個登臺實例,我們稱為 stage01x,用于處理進入 VPC 的請求。 它備份代碼庫,收集時序和錯誤日志,并允許 ssh 進入實例。 由于 stage01x 必須位于公共子網中,因此它會從 Amazon 那里獲得一個彈性 IP,該 IP 還在早期階段就將面向公眾的負載均衡器服務于托管在其背后的 AWS 站點。 stage01x 還會維護一個 Postgresql 數據庫,其中包含服務器的主機名和服務。 這在添加新實例并在其整個生命周期內進行管理方面起著至關重要的作用,我們將在后面討論。
### VPC 站點架構圖

([原尺寸](http://farm9.staticflickr.com/8450/8044909998_04e8375ef7_o.png))
**示例 HTTP 請求**-為了更全面地了解該體系結構,讓我們逐步瀏覽一下互聯網上的 HTTP 請求(用紅線標出)。 它通過彈性 IP 在作為運行 NGinx 的公共子網中的負載平衡器的登臺實例處進入 VPC。 然后,負載平衡器將流量路由到前端負載平衡器之一。 然后,ELB 重定向到它們后面的前端服務器,這些前端服務器開始處理請求。 在這里,我們有兩個負載均衡級別,可以將請求分為不同的池以進行 AB 測試。
然后,前端服務器決定它需要向后端服務發出請求,該服務也由 ELB 后面的許多后端服務器運行。 后端處理該請求(可能向其他后端發出請求)或數據庫服務器(其結果存儲在內存緩存服務器中),然后將信息發送回前端,該信息通過負載均衡器發回 給用戶。
**實例類型**-EC2 具有極好的可擴展性,因此,使用某些腳本,我們能夠快速更改網絡中后端服務器和前端服務器的數量。 因為所有后端和前端都在負載均衡器后面,所以沒有人需要直接解決它們或知道它們是什么。
但是,數據庫更難擴展,因為它們不在負載均衡器的后面。 可以預料,memcache 會根據實例數和每個實例上的 RAM 對鍵值綁定進行哈希處理,并假定兩者都是固定的。 內存緩存的版本允許添加/刪除成員資格,但是我們目前不在應用程序堆棧中使用它。 因此,memcache 的實時擴展將不是簡單或有效的。
我們為前端,后端和內存緩存實例選擇了 m2.xlarge(超大內存)實例,因為它們具有適當的內存量和較高的 CPU。 我們的數據庫使用 cc2.8xlarge(群集計算八個額外的大實例)實例,這些實例需要極高的 iops 才能處理整個站點的空緩存而導致的冷啟動。
## 這個怎么運作
**TACL** -我們的前端和后端服務器通過 TACL(TripAdvisor 配置語言)進行配置,TripAdvisor 配置語言描述了如何設置實例。 本質上,我們創建了一個“ aws.ini”文件,該文件定義了在何處發送和接收某些請求。
例如,論壇數據(DEV_DB_FORUMS_HOST)存儲在 dbs001x 上,社區數據(DEV_DB_COMMUNITY_HOST)存儲在 dbs003x 上。 Memcache 實例通過其主機名直接引用。 
如前所述,每個前端池和后端服務組由一個負載均衡器表示,我們分別以 lbf 或 lb 作為前綴。

每個需要 aws.ini 中信息的服務器都將其主機名添加到文件頭中。 例如,這就是 web110x 的 aws.ini 文件的標題。 設置
TACL,以便服務器在配置,啟動和提供服務時引用此 aws.ini 文件。 為了進行架構更改(例如添加新數據庫),我們將修改并分發此 aws.ini 文件,并啟動相關實例。 通過這種負載均衡器抽象,添加新的前端和后端實例非常容易,因為它們將被適當的 ELB 包含。
**Naming_service DB** -我們當前的活動站點使用托管在托管數據中心中的物理服務器。 因此,擴展或升級實例非常昂貴且耗時。 使用 Amazon EC2 的主要優勢在于,我們可以廉價,快速地做到這一點,以應對流量的逐分鐘變化。 為了對此進行管理,我們在 stage01x 上保留了一個存儲命名數據庫的數據庫。
由于 EC2 實例具有相對短暫的性質,因此該數據庫對于我們的運營需求至關重要。 我們偶爾會終止實例,并可能啟動替換實例。 開發與此數據庫一起使用的 API 可確保正確“重構”系統,例如,將舊實例從負載均衡器中刪除。 當然,通過啟動新實例進行擴展時,此數據庫是必需的。 它為每個給定的前端和后端實例存儲主機名,實例 ID 和服務。 stage01x 上的腳本用于為新啟動的實例查找和分配主機名。


**定制服務器映像**-我們為前端和后端服務器創建了兩個定制的 CentOS 5.7 映像。 在他們的/etc/rc.local 中,我們添加了一個腳本,該腳本負責完全配置和啟動實例。 啟動后,它將在 stage01x 上的命名數據庫中查詢其主機名和服務,將其添加到適當的負載均衡器中,然后對其進行配置和反彈。 “反彈”是指啟動或重新啟動需要在服務器上運行的應用程序的過程。
我們對這種模塊化的啟動感到特別興奮,因為它使測試后端服務更加容易。 從事度假租賃服務的團隊可以在 EC2 上啟動一個度假租賃實例,并專門在不影響整個測試環境的情況下工作,而不是在一個開發人員的工作站上啟動和啟動整個網站。
**時間和錯誤日志**-我們的前端服務器在接收和處理請求時生成日志。 使用 stage01x 和某些 ssh 隧道傳輸,我們可以遠程壓縮這些日志文件,并將它們發送回本地工作站進行分析。
## 一路走來的問題
**停電**-2012 年 6 月 15 日,EC2 美東地區發生故障,我們失去了生產力。 2012 年 6 月 29 日,EC2 US-East 發生故障,我們丟失了一些實例。 Amazon 確實提供了可用區(相隔 20 或 30 英里)以實現冗余,因此這會稍微減輕影響。 但是,總的來說,亞馬遜可能會以其數據一致性而不是數據可用性而聞名。
[](http://technewspedia.com/wp-content/uploads/2012/06/6522_Chaiten-660x350.jpg)
**磁盤空間不足**-如上所述,我們的服務器生成計時,錯誤和許多其他類型的日志。 在測試的早期階段,我們的日志(尤其是錯誤日志)將快速增長,并占用數 GB 的磁盤空間。 我們決定利用 m2.xlarge 的 420GB 臨時存儲空間。 之前,我們完全避免使用臨時存儲,因為它是臨時存儲(重新啟動后數據不會持續存在)。 但是,這對于存儲日志很好。 Cronjobs 每小時都會將日志發送到本地工作站,因此我們仍然能夠收集和備份重要數據。
[](http://kpao.typepad.com/.a/6a015392891771970b01543663249d970c-pi)
**實例不可用**-我們嘗試在 us-east-1b 中使用新的 SSD hi1.4xlarge 實例,但這些實例通常在高峰時段不可用。 我們的 Amazon 聯系人告訴我們,由于需求旺盛,這些實例確實不可用。 我們在 us-east-1d 中遇到了類似的問題,其中我們未能啟動 m1.xlarge 實例。 這提醒我們,EC2 尚不具有無限的服務規模,因此需要在操作模型中建立實例類型及其數量的必需儲備。
作為附帶說明,每個 Amazon AWS 帳戶均以 20 個實例上限開始,隨著我們的實驗的進行,我們需要與我們的 Amazon 聯系人合作以將限制增加到 60 個實例,然后增加到 600 個。 我們的 ELB 遇到了類似的限制。 同樣,我們的聯系很快就使我們獲得了批準,從而使我們可以使用 20-30 個負載均衡器。
[](http://media.amazonwebservices.com/blog/console_ec2_hello_hi1_mndoci_1.png)
**未充分利用的,配置錯誤的數據庫**-簡而言之,我們發現我們需要對 postgresql 數據庫(位于 cc2.8xlarge 實例中)進行其他修改,以使其在 EC2 環境中正常工作。 下面列出了其中一些。 這些變化幫助我們了解了自己的環境與亞馬遜環境相比的工作方式。
* enable_hashjoin = off(最初為 on)
* enable_mergejoin =關(開)
* shared_buffers = 4GB(8GB)
* Effective_cache_size = 48GB(16GB)
**丟失的數據**-EC2 通過 EBS 卷為數據存儲提供了很好的抽象級別。 為了擴展數據庫實例的存儲,我們只需為每個數據庫實例創建 1 TB EBS 卷,將其附加到實例上,然后使用``mkfs''和``mount''Unix 命令將其裝入。
使用 EBS 卷時,我們遇到了一些問題。 當我們將一個 EBS 卷重新裝載到另一個實例時,在將一個 EBS 卷轉移到另一個實例時,云以某種方式刪除了所有還原的成員數據,我們不得不花半天的時間在該實例上還原數據庫。 此外,在嘗試使用“ tunefs”和“ resize2fs”之類的命令從快照調整 EBS 卷大小時,我們遇到了問題。 使用這些調整大小的卷的實例在一天后遇到實例可達性錯誤,我們不得不運行“ e2fsck”幾個小時來清理它們。
當然,我們在安裝和調整大小過程中可能犯了一些嚴重的錯誤,因此不必過分擔心 EC2 的這種行為。 我們發現,一般來說,AMI 和 EBS 快照的可用性有助于我們快速啟動新的數據庫實例。 例如,如果我們想將 dbs001x 上的數據分成兩臺機器,則只需創建 dbs001x 的映像,從中啟動一個新實例,然后適當地重定向流量。 顯然,此功能僅限于只讀數據庫,創建 1 TB 設備的映像通常是一夜之間的工作。 我們仍在尋找提高數據庫冗余性和可伸縮性的其他方法。 我們當前的實時站點使用心跳和 DRDB 進行恢復,并且希望了解如何將其應用于 EC2。
**不相等的實例**-一方面,我們嘗試對前端和后端服務器的 CPU 性能進行基準測試,所有這些服務器的大小均為 m2.xlarge。 我們使用命令 bc 設置了一個簡單的數學運算 2 ^ 2 ^ 20 的時間,發現該時間分為兩組,具有統計意義。 我們在測試的實例上運行 cpuid,更快的組在雙 2.40 GHz 處理器上運行,而較慢的組在雙 2.66 GHz 處理器上運行。 盡管這不是我們網站功能的主要問題,但它使確定我們可以使用的計算能力變得更加困難。
另外,即使我們的前端計算機都具有相同的大小和相同的 AMI,大約 10%的前端計算機也無法正常彈跳。 同樣,這可能是我們配置而不是 Amazon 的無法預料的問題。
**負數時間**-通常情況下,低俗的時間值得慶祝。 但是,當我們分析一些最近的計時日志時,我們發現某些最小服務呼叫時間為負數。 這些計時統計信息是通過調用 Java.currentTimeMillis()來計算的。 我們仍在對此進行調查,并且有興趣嘗試通過一個簡單的 Java 應用程序來復制問題。
**竊取周期**-運行 m2.xlarge 實例時,我們預期竊取周期為 1%或 2%。 但是,當前端處于負載狀態時,我們在一兩分鐘內會遇到高達 7-8%的抖動。 我們的 Amazon 聯系人告訴我們,這僅僅是由于每個實例的負載。
另外,我們在 m1.small 實例上進行了實驗,并通過數學計算接管了它的 CPU 使用率。 跑馬場表明,其中 98%用于數學計算,另有 2%被盜。 但是,在 Amazon 的監視服務 Cloudwatch 上,該實例似乎以 98%的 CPU 利用率運行,而不是 100%的全部利用率。 這可能會導致較大的竊用周期問題,因為無法確定某個實例是否由于竊用周期而被用完,或者是否“未充分利用”。 通常,我們希望看到更多有關 CPU 性能的保證。
**組播**-不支持。 我們使用 JGroups,這取決于它的工作。 有人告訴我們使用 vCider 或 vpncubed 來模擬多播。 vCider 要求我們升級到 CentOS 6,并且 vpncubed 的安裝時間很長。 在我們的優先級列表中,該級別較低,但是我們將來希望進一步探索這些選項。
**ELB 延遲**-盡管我們將所有后端置于特定負載均衡器之后的體系結構對于 50-60k reqs / min 以下的流量非常有效,但我們發現 ELB 大大降低了我們的后端響應時間,尤其是對于 二手服務。 為了測試這一點,我們讓一個前端直接將流量發送到后端,而不是通過 ELB。 我們在下午 4:50 左右更改了此設置,使負載測試流量保持不變,并發現服務時間顯著減少。

我們的亞馬遜聯系人告訴我們,ELB 可能需要預熱。 我們懷疑負載平衡器也是云平臺,默認情況下可能是小型實例。 預熱可能只是將這個給定平臺升級為可以處理更高流量負載的平臺的問題。
## 負載測試
該網站的原始設置存在一些問題。 我們無法在前端使用 Amazon 的 ELB,因為我們的前端實例隱藏在私有 VPC 中。 我們發現有些公司通過將前端實例保留在公共 EC2 網絡中來解決此問題,但是這種架構會使我們的 VPC 設置無效。
我們使用了另一位工程師先前開發的負載測試系統,該系統獲取了真實現場流量的存檔日志,并以一定的請求數/分鐘發送。 最初,我們將此流量定向到 stage01x 實例。 但是,到我們達到 20k reqs / min 時,很明顯我們需要專用的實例來處理流量。 我們將這些實例命名為 lod01x 至 lod04x ,這些實例負責將 HTTP 通信發送到六個前端 ELB。
**VPC 帶寬問題**-在測試的早期階段,我們在 VPC 之外的實例將流量發送到 VPC。 但是,我們發現,無論我們如何擴展站點,負載測試的上限均為每分鐘 5 萬請求。 平均頁面大小為 18KB,看來 VPC 僅接受 100Mbps 的流量。 我們的 Amazon 聯系人向我們保證沒有此限制,但是為了確保所有負載測試都保留在 VPC 中。
**NGinx 問題**-在我們的早期階段,我們還為每個 lod 實例安裝了 NGinx 負載平衡器。 但是,后來發現這成為我們測試的瓶頸,因為小型實例無法處理這么多的“打開文件”。 我們將其抓取,然后將流量直接發送到負載均衡器,而沒有初始的 NGinx 負載均衡。
這是我們網站的配置,最高可達 70 萬請求/分鐘。 在提高請求率的過程中,我們無法保持相同的用戶體驗。 請求響應統計隨著請求率的提高而惡化,我們將在后面詳細討論。

**現場比較**-我們的現場有 80 個前端和 52 個后端,每個都有 24 個核心。 總共增加了 3168 個內核。 在我們的最高 AWS 配置下,每個 270 個前端和 70 個后端分別具有 2 個核心,我們只有 680 個核心。 這導致了后端垃圾回收的問題,我們將在后面討論。
我們的 Amazon 內存緩存的運行情況相當不錯。 我們通過 libmemcached-tools 附帶的 memslap 實用程序進行了基準測試,發現使用 12 個中等的物理服務器,我們最初的 12 個 Amazon memcache 實例的性能大約是我們 Memcache 集群容量的 80-90%。


## 時間和錯誤編號
每個前端服務器都會自動記錄發送和接收的每個請求的計時數據。 壓縮后每小時發送一次到“伐木工人”服務器,在其中計算基本統計信息,并將請求時間細分為各個部分,例如 google,數據庫和 xml 調用。 在評估站點性能時,我們主要關注平均總時間和 cpu 時間。

([原尺寸](http://farm9.staticflickr.com/8320/8044985089_c26e7e7a98_o.png))
[
(](http://farm9.staticflickr.com/8320/8044985089_c26e7e7a98_o.png) [全尺寸](http://farm9.staticflickr.com/8310/8044991710_8b0bdfcd23_o.png))
這兩個圖表顯示了我們從 20k reqs / min 擴展到 60k reqs / min 時,Hotel Reviews Servlet 的時間統計信息(并非所有請求都與酒店評論有關)。 根據數據,向上擴展發生在星期五的 3-4pm 之間,直到 5pm 才穩定下來。 我們關閉了網站過夜,然后在周六中午左右將其恢復,請求數量大約增加了兩倍,請求時間大致保持相同,平均大約 200 毫秒。
在較低的負載下,這些延遲數與我們的實時站點相當,因為我們每分鐘最多擴展 15 萬個請求,因此延遲顯著增加。 我們的主要 servlet(例如,Hotel Reviews 或 Typeahead)的時間比我們的實時站點慢了近 10 倍,后者的運行時間是此請求級別的兩倍,并且在顯示出更高的延遲之前,已經經過了四倍于此請求級別的測試。
ELB 是問題的一部分,如前所述。 但是,我們懷疑根本原因是垃圾回收開銷超過了后端服務器的 CPU 數量。 僅使用兩個內核,我們的 m2.xlarge 實例就沒有足夠的計算能力來跟上高請求速率的 GC 需求,這不足以實現高應用程序吞吐量和低應用程序延遲。 為了解決這個問題,我們很可能需要將后端數量加倍,或者使用功能更強大的實例以及更多的內核。 在這兩種情況下,重點都將放在支持獲得更高請求率并執行更多工作的服務上。
## 成本
### EC2
EC2 的付款包括三個主要部分:實例使用情況,EBS 使用情況和網絡輸出使用情況。 在生產級別上假定網絡輸出率為 200 GB /小時,每小時的成本約為 14.30 美元。 可以預見,前端服務器和后端服務器的實例使用對總成本的貢獻最大。
### 現場比較
我們每個托管數據中心的初始設置約為 220 萬美元,加上每年約 30 萬美元的升級和擴展費用。 如果我們假設初始安裝成本在三年內攤銷,則資本支出每年約為 100 萬美元。 運營支出(包括空間,功率和帶寬)每年約為 30 萬美元。 每個數據中心每年的總成本約為 130 萬美元。 每個數據中心有 200 多臺機器來支持我們的運營。 每臺機器的成本通常為 7,000 美元。
如果我們每年在完整的 EC2 站點上花費 130 萬美元,那么我們可以負擔得起以下架構,前提是我們使用了一年的預留實例。
* 550 前端和后端
* 64 個 Memcache
* 10 個數據庫
的價格為$ 1,486,756.96
這意味著我們可以為當前配置添加更多 60%的容量(340 個前端和后端,32 個內存緩存,5 個數據庫)。
如果我們使用三年的預留實例合同,那么這種配置每年將花費 88 萬美元。 如果我們想在三年內花費 390 萬美元,我們可以負擔得起這樣的架構:
* 880 前端和后端
* 64 個 Memcache
* 20 數據庫
有趣的是,即使有這個數目,我們也只能獲得 1760 個服務器核心(每臺計算機上有 2 個),而我們的現場站點則可以運行 3500 個核心。 **不過,我們有信心,有了這樣的資源,我們將能夠正確解決我們目前在生產級流量**上遇到的垃圾收集和延遲問題。
### 降低總成本
* 預留實例-我們計算出,僅在 1 年的合同上使用預留實例將使我們的年度總費用減少一半。 我們也不需要為高峰流量保留所有實例,而是利用按需或利用率較低的保留實例來降低總成本。
* 僅將實例調整為必要的容量。 現在,這可以通過啟動不同比例的后端來完成。
* 放置組-在我們知道將永遠存在的實例組之間獲得更好的性能。
## 故障點
* 前面有某種“類似于 BigIP”的實例。 當這種情況發生時,我們該怎么辦?
* 我們的負載均衡器由 Amazon 管理,當它們出現故障時會發生什么? 引用完整的 DNS 名稱而不是 IP 地址是有希望的,但這通常是未知的。
* 自動縮放有助于前端池和后端池,確保它們都保持在一定數量。 但是,將內存緩存恢復到命中率將非常耗時,并且我們需要依靠復制的熱備用數據庫。
## 最佳實踐
* 可以通過 AWS 管理控制臺執行的所有操作都可以通過提供的命令行工具來完成。 準備好**來使**盡可能多的啟動過程自動化。
* 在自動化過程中,請確保**等待足夠長的時間,以使實例既運行又可訪問:**
* “ ec2-describe-instances”告訴您實例是否正在運行
* 較新版本的“ ec2-describe-instance-status”會告訴您實例是否已通過實例以及系統可達性狀態檢查
* 早期,**開發了一些用于跟蹤所有實例**的系統。 這與 GUI 問題有關。 盡管您可以使用標簽和名稱來跟蹤所有內容,但通常需要一種更加自動化的方式將所有內容組合在一起。 例如,我們在登臺服務器上有一個 postgresql 數據庫來管理它。
* **停止的實例也可以是終止的實例**。 云計算的優勢在于,當某個實例出現問題時,通常更容易在其位置啟動新實例,而不是重新啟動。 顯然,請嘗試找出潛在的問題!
* 在此注意,請注意,``終止的實例''仍會在您的控制臺中閑逛,并且如果您運行 ec2-describe-instances 將會顯示出來。 如果您使用實例名稱來區分實例,這將是一個問題,因為兩個實例都會出現。
* **清理 EBS 卷**,如站點所建議。 存儲成本會迅速增加。 另外,請確保您清理快照,因為快照的收費與卷的 GB /月價格相同
* **不要忘記短暫存儲**,但不要忘記它的短暫存儲。 對于累積的文件(例如錯誤日志)很有用。 使用 crontabs 保存重要數據。
* **利用圖像和快照快速放大**。
* 詳細的監視非常酷,但是我們發現 CloudWatch / monitoring 的免費層**足夠**。 在 1 分鐘和 5 分鐘之間查看統計信息對于總體擴展決策而言并不那么重要。 但是,當然可以幫助對實例的代表性子集進行詳細監視。
* **ELB 也是監視實例狀態**的好方法,即使它們實際上并沒有使用(在更改架構后我們仍在使用它們)。 適當配置健康檢查/閾值。
* 通過**更加關注安全組設置**,可以解決許多令人沮喪的網絡問題。
時間向后移動是虛擬化的經典問題,特別是如果 VM 從一個物理主機移動到另一物理主機上,或者僅僅是由于 VM 時鐘漂移和重置而造成的。 最好也使用 nanotime API 進行時序實驗-并嘗試查看系統負載是否也很重要-因此生成 IO 和 CPU 負載以查看會發生什么。 如果您可以在測試 VM 的任一端請求其他實例,希望將它們分配在同一物理主機上,則可以查找相關行為
“暫時的(重新啟動后數據不會持續存在)”
臨時磁盤在重新啟動后仍然存在。 當您為實例快照時,它們只是不會被復制。 我在 EC2 上運行 Windows 操作系統,當我重新啟動任何安全補丁時,非啟動驅動器又回來了。
必填:
xkcd on the“ Cloud”
http://xkcd.com/908/
很棒的帖子! 很好地了解了將應用程序完全遷移到云中的成本和收益。
遷移到云+自動化部署的每個部分的另一方面是能夠迫使開發人員在交付給發布代碼流之前,在以 1:1 的生產環境中測試其更改的能力。 自動化整個部署的能力是我對于開發團隊的云所看到的最大好處之一。
感謝您提供的信息非常豐富。 您能否擴展一下創建 TACL 的原因? TACL 提供的 AWS 缺少什么,或者 TACL 有什么更好的表現?
我覺得這是一個非常有趣的概念。 我認為您提出了一些很棒的觀點,即 aws 沒有嬰兒規模,有些跌倒了。 我想用負數來解決您的問題,我不確定您是否跟蹤多個實例的時間,希望您設置 ntp 服務器并定期同步服務器。
我工作的一家公司遇到了一個同樣的問題,即日志時間到處都是,因為用戶將訪問一臺后端服務器,并且它將一個時間寫入 db,然后使用會回來,并再次記錄 db,但是因為第一個服務器關閉了時間同步,所以它寫的數量比第二個服務器大
成本模型中缺少的是建立和管理 DC 基礎結構所需的人員。 而且,它只談論核心,沒有網絡成本。
[摘自 PlanForCloud-RightScale]這篇文章啟發我們寫博客文章,比較在 AWS On-Demand 實例與預留實例上 TripAdvisor 的部署成本:http://blog.planforcloud.com/2012/10/tripadvisor-and -pinterest-costs-on-aws.html
非常翔實! 該實驗需要多長時間才能完成? 兩個暑期實習生 8 周?
您好
我們是否可以獲取實時 xml tripadvisor 供稿?
提前謝謝!
SJ
- LiveJournal 體系結構
- mixi.jp 體系結構
- 友誼建筑
- FeedBurner 體系結構
- GoogleTalk 架構
- ThemBid 架構
- 使用 Amazon 服務以 100 美元的價格構建無限可擴展的基礎架構
- TypePad 建筑
- 維基媒體架構
- Joost 網絡架構
- 亞馬遜建筑
- Fotolog 擴展成功的秘訣
- 普恩斯的教訓-早期
- 論文:Wikipedia 的站點內部,配置,代碼示例和管理問題
- 擴大早期創業規模
- Feedblendr 架構-使用 EC2 進行擴展
- Slashdot Architecture-互聯網的老人如何學會擴展
- Flickr 架構
- Tailrank 架構-了解如何在整個徽標范圍內跟蹤模因
- Ruby on Rails 如何在 550k 網頁瀏覽中幸存
- Mailinator 架構
- Rackspace 現在如何使用 MapReduce 和 Hadoop 查詢 TB 的數據
- Yandex 架構
- YouTube 架構
- Skype 計劃 PostgreSQL 擴展到 10 億用戶
- 易趣建筑
- FaceStat 的禍根與智慧贏得了勝利
- Flickr 的聯合會:每天進行數十億次查詢
- EVE 在線架構
- Notify.me 體系結構-同步性
- Google 架構
- 第二人生架構-網格
- MySpace 體系結構
- 擴展 Digg 和其他 Web 應用程序
- Digg 建筑
- 在 Amazon EC2 中部署大規模基礎架構的六個經驗教訓
- Wolfram | Alpha 建筑
- 為什么 Facebook,Digg 和 Twitter 很難擴展?
- 全球范圍擴展的 10 個 eBay 秘密
- BuddyPoke 如何使用 Google App Engine 在 Facebook 上擴展
- 《 FarmVille》如何擴展以每月收獲 7500 萬玩家
- Twitter 計劃分析 1000 億條推文
- MySpace 如何與 100 萬個并發用戶一起測試其實時站點
- FarmVille 如何擴展-后續
- Justin.tv 的實時視頻廣播架構
- 策略:緩存 404 在服務器時間上節省了洋蔥 66%
- Poppen.de 建筑
- MocoSpace Architecture-一個月有 30 億個移動頁面瀏覽量
- Sify.com 體系結構-每秒 3900 個請求的門戶
- 每月將 Reddit 打造為 2.7 億頁面瀏覽量時汲取的 7 個教訓
- Playfish 的社交游戲架構-每月有 5000 萬用戶并且不斷增長
- 擴展 BBC iPlayer 的 6 種策略
- Facebook 的新實時消息系統:HBase 每月可存儲 135 億條消息
- Pinboard.in Architecture-付費玩以保持系統小巧
- BankSimple 迷你架構-使用下一代工具鏈
- Riak 的 Bitcask-用于快速鍵/值數據的日志結構哈希表
- Mollom 體系結構-每秒以 100 個請求殺死超過 3.73 億個垃圾郵件
- Wordnik-MongoDB 和 Scala 上每天有 1000 萬個 API 請求
- Node.js 成為堆棧的一部分了嗎? SimpleGeo 說是的。
- 堆棧溢出體系結構更新-現在每月有 9500 萬頁面瀏覽量
- Medialets 體系結構-擊敗艱巨的移動設備數據
- Facebook 的新實時分析系統:HBase 每天處理 200 億個事件
- Microsoft Stack 是否殺死了 MySpace?
- Viddler Architecture-每天嵌入 700 萬個和 1500 Req / Sec 高峰
- Facebook:用于擴展數十億條消息的示例規范架構
- Evernote Architecture-每天有 900 萬用戶和 1.5 億個請求
- TripAdvisor 的短
- TripAdvisor 架構-4,000 萬訪客,200M 動態頁面瀏覽,30TB 數據
- ATMCash 利用虛擬化實現安全性-不變性和還原
- Google+是使用您也可以使用的工具構建的:閉包,Java Servlet,JavaScript,BigTable,Colossus,快速周轉
- 新的文物建筑-每天收集 20 億多個指標
- Peecho Architecture-鞋帶上的可擴展性
- 標記式架構-擴展到 1 億用戶,1000 臺服務器和 50 億個頁面視圖
- 論文:Akamai 網絡-70 個國家/地區的 61,000 臺服務器,1,000 個網絡
- 策略:在 S3 或 GitHub 上運行可擴展,可用且廉價的靜態站點
- Pud 是反堆棧-Windows,CFML,Dropbox,Xeround,JungleDisk,ELB
- 用于擴展 Turntable.fm 和 Labmeeting 的數百萬用戶的 17 種技術
- StackExchange 體系結構更新-平穩運行,Amazon 4x 更昂貴
- DataSift 體系結構:每秒進行 120,000 條推文的實時數據挖掘
- Instagram 架構:1400 萬用戶,1 TB 的照片,數百個實例,數十種技術
- PlentyOfFish 更新-每月 60 億次瀏覽量和 320 億張圖片
- Etsy Saga:從筒倉到開心到一個月的瀏覽量達到數十億
- 數據范圍項目-6PB 存儲,500GBytes / sec 順序 IO,20M IOPS,130TFlops
- 99designs 的設計-數以千萬計的綜合瀏覽量
- Tumblr Architecture-150 億頁面瀏覽量一個月,比 Twitter 更難擴展
- Berkeley DB 體系結構-NoSQL 很酷之前的 NoSQL
- Pixable Architecture-每天對 2000 萬張照片進行爬網,分析和排名
- LinkedIn:使用 Databus 創建低延遲更改數據捕獲系統
- 在 30 分鐘內進行 7 年的 YouTube 可擴展性課程
- YouPorn-每天定位 2 億次觀看
- Instagram 架構更新:Instagram 有何新功能?
- 搜索技術剖析:blekko 的 NoSQL 數據庫
- Pinterest 體系結構更新-1800 萬訪問者,增長 10 倍,擁有 12 名員工,410 TB 數據
- 搜索技術剖析:使用組合器爬行
- iDoneThis-從頭開始擴展基于電子郵件的應用程序
- StubHub 體系結構:全球最大的票務市場背后的驚人復雜性
- FictionPress:在網絡上發布 600 萬本小說
- Cinchcast 體系結構-每天產生 1,500 小時的音頻
- 棱柱架構-使用社交網絡上的機器學習來弄清您應該在網絡上閱讀的內容
- 棱鏡更新:基于文檔和用戶的機器學習
- Zoosk-實時通信背后的工程
- WordPress.com 使用 NGINX 服務 70,000 req / sec 和超過 15 Gbit / sec 的流量
- 史詩般的 TripAdvisor 更新:為什么不在云上運行? 盛大的實驗
- UltraDNS 如何處理數十萬個區域和數千萬條記錄
- 更簡單,更便宜,更快:Playtomic 從.NET 遷移到 Node 和 Heroku
- Spanner-關于程序員使用 NoSQL 規模的 SQL 語義構建應用程序
- BigData 使用 Erlang,C 和 Lisp 對抗移動數據海嘯
- 分析數十億筆信用卡交易并在云中提供低延遲的見解
- MongoDB 和 GridFS 用于內部和內部數據中心數據復制
- 每天處理 1 億個像素-少量競爭會導致大規模問題
- DuckDuckGo 體系結構-每天進行 100 萬次深度搜索并不斷增長
- SongPop 在 GAE 上可擴展至 100 萬活躍用戶,表明 PaaS 未通過
- Iron.io 從 Ruby 遷移到 Go:減少了 28 臺服務器并避免了巨大的 Clusterf ** ks
- 可汗學院支票簿每月在 GAE 上擴展至 600 萬用戶
- 在破壞之前先檢查自己-鱷梨的建筑演進的 5 個早期階段
- 縮放 Pinterest-兩年內每月從 0 到十億的頁面瀏覽量
- Facebook 的網絡秘密
- 神話:埃里克·布魯爾(Eric Brewer)談銀行為什么不是堿-可用性就是收入
- 一千萬個并發連接的秘密-內核是問題,而不是解決方案
- GOV.UK-不是你父親的書庫
- 縮放郵箱-在 6 周內從 0 到 100 萬用戶,每天 1 億條消息
- 在 Yelp 上利用云計算-每月訪問量為 1.02 億,評論量為 3900 萬
- 每臺服務器將 PHP 擴展到 30,000 個并發用戶的 5 條 Rockin'Tips
- Twitter 的架構用于在 5 秒內處理 1.5 億活躍用戶,300K QPS,22 MB / S Firehose 以及發送推文
- Salesforce Architecture-他們每天如何處理 13 億筆交易
- 擴大流量的設計決策
- ESPN 的架構規模-每秒以 100,000 Duh Nuh Nuhs 運行
- 如何制作無限可擴展的關系數據庫管理系統(RDBMS)
- Bazaarvoice 的架構每月發展到 500M 唯一用戶
- HipChat 如何使用 ElasticSearch 和 Redis 存儲和索引數十億條消息
- NYTimes 架構:無頭,無主控,無單點故障
- 接下來的大型聲音如何使用 Hadoop 數據版本控制系統跟蹤萬億首歌曲的播放,喜歡和更多內容
- Google 如何備份 Internet 和數十億字節的其他數據
- 從 HackerEarth 用 Apache 擴展 Python 和 Django 的 13 個簡單技巧
- AOL.com 體系結構如何發展到 99.999%的可用性,每天 800 萬的訪問者和每秒 200,000 個請求
- Facebook 以 190 億美元的價格收購了 WhatsApp 體系結構
- 使用 AWS,Scala,Akka,Play,MongoDB 和 Elasticsearch 構建社交音樂服務
- 大,小,熱還是冷-條帶,Tapad,Etsy 和 Square 的健壯數據管道示例
- WhatsApp 如何每秒吸引近 5 億用戶,11,000 內核和 7,000 萬條消息
- Disqus 如何以每秒 165K 的消息和小于 0.2 秒的延遲進行實時處理
- 關于 Disqus 的更新:它仍然是實時的,但是 Go 摧毀了 Python
- 關于 Wayback 機器如何在銀河系中存儲比明星更多的頁面的簡短說明
- 在 PagerDuty 遷移到 EC2 中的 XtraDB 群集
- 擴展世界杯-Gambify 如何與 2 人組成的團隊一起運行大型移動投注應用程序
- 一點點:建立一個可處理每月 60 億次點擊的分布式系統的經驗教訓
- StackOverflow 更新:一個月有 5.6 億次網頁瀏覽,25 臺服務器,而這一切都與性能有關
- Tumblr:哈希處理每秒 23,000 個博客請求的方式
- 使用 HAProxy,PHP,Redis 和 MySQL 處理 10 億個請求的簡便方法來構建成長型啟動架構
- MixRadio 體系結構-兼顧各種服務
- Twitter 如何使用 Redis 進行擴展-105TB RAM,39MM QPS,10,000 多個實例
- 正確處理事情:通過即時重放查看集中式系統與分散式系統
- Instagram 提高了其應用程序的性能。 這是如何做。
- Clay.io 如何使用 AWS,Docker,HAProxy 和 Lots 建立其 10 倍架構
- 英雄聯盟如何將聊天擴大到 7000 萬玩家-需要很多小兵。
- Wix 的 Nifty Architecture 技巧-大規模構建發布平臺
- Aeron:我們真的需要另一個消息傳遞系統嗎?
- 機器:惠普基于憶阻器的新型數據中心規模計算機-一切仍在變化
- AWS 的驚人規模及其對云的未來意味著什么
- Vinted 體系結構:每天部署數百次,以保持繁忙的門戶穩定
- 將 Kim Kardashian 擴展到 1 億個頁面
- HappyPancake:建立簡單可擴展基金會的回顧
- 阿爾及利亞分布式搜索網絡的體系結構
- AppLovin:通過每天處理 300 億個請求向全球移動消費者進行營銷
- Swiftype 如何以及為何從 EC2 遷移到真實硬件
- 我們如何擴展 VividCortex 的后端系統
- Appknox 架構-從 AWS 切換到 Google Cloud
- 阿爾及利亞通往全球 API 的憤怒之路
- 阿爾及利亞通往全球 API 步驟的憤怒之路第 2 部分
- 為社交產品設計后端
- 阿爾及利亞通往全球 API 第 3 部分的憤怒之路
- Google 如何創造只有他們才能創造的驚人的數據中心網絡
- Autodesk 如何在 Mesos 上實施可擴展事件
- 構建全球分布式,關鍵任務應用程序:Trenches 部分的經驗教訓 1
- 構建全球分布式,關鍵任務應用程序:Trenches 第 2 部分的經驗教訓
- 需要物聯網嗎? 這是美國一家主要公用事業公司從 550 萬米以上收集電力數據的方式
- Uber 如何擴展其實時市場平臺
- 優步變得非常規:使用司機電話作為備份數據中心
- 在不到五分鐘的時間里,Facebook 如何告訴您的朋友您在災難中很安全
- Zappos 的網站與 Amazon 集成后凍結了兩年
- 為在現代時代構建可擴展的有狀態服務提供依據
- 細分:使用 Docker,ECS 和 Terraform 重建基礎架構
- 十年 IT 失敗的五個教訓
- Shopify 如何擴展以處理來自 Kanye West 和 Superbowl 的 Flash 銷售
- 整個 Netflix 堆棧的 360 度視圖
- Wistia 如何每小時處理數百萬個請求并處理豐富的視頻分析
- Google 和 eBay 關于構建微服務生態系統的深刻教訓
- 無服務器啟動-服務器崩潰!
- 在 Amazon AWS 上擴展至 1100 萬以上用戶的入門指南
- 為 David Guetta 建立無限可擴展的在線錄制活動
- Tinder:最大的推薦引擎之一如何決定您接下來會看到誰?
- 如何使用微服務建立財產管理系統集成
- Egnyte 體系結構:構建和擴展多 PB 分布式系統的經驗教訓
- Zapier 如何自動化數十億個工作流自動化任務的旅程
- Jeff Dean 在 Google 進行大規模深度學習
- 如今 Etsy 的架構是什么樣的?
- 我們如何在 Mail.Ru Cloud 中實現視頻播放器
- Twitter 如何每秒處理 3,000 張圖像
- 每天可處理數百萬個請求的圖像優化技術
- Facebook 如何向 80 萬同時觀看者直播
- Google 如何針對行星級基礎設施進行行星級工程設計?
- 為 Mail.Ru Group 的電子郵件服務實施反垃圾郵件的貓捉老鼠的故事,以及 Tarantool 與此相關的內容
- The Dollar Shave Club Architecture Unilever 以 10 億美元的價格被收購
- Uber 如何使用 Mesos 和 Cassandra 跨多個數據中心每秒管理一百萬個寫入
- 從將 Uber 擴展到 2000 名工程師,1000 個服務和 8000 個 Git 存儲庫獲得的經驗教訓
- QuickBooks 平臺
- 美國大選期間城市飛艇如何擴展到 25 億個通知
- Probot 的體系結構-我的 Slack 和 Messenger Bot 用于回答問題
- AdStage 從 Heroku 遷移到 AWS
- 為何將 Morningstar 遷移到云端:降低 97%的成本
- ButterCMS 體系結構:關鍵任務 API 每月可處理數百萬個請求
- Netflix:按下 Play 會發生什么?
- ipdata 如何以每月 150 美元的價格為來自 10 個無限擴展的全球端點的 2500 萬個 API 調用提供服務
- 每天為 1000 億個事件賦予意義-Teads 的 Analytics(分析)管道
- Auth0 體系結構:在多個云提供商和地區中運行
- 從裸機到 Kubernetes
- Egnyte Architecture:構建和擴展多 PB 內容平臺的經驗教訓
- 縮放原理
- TripleLift 如何建立 Adtech 數據管道每天處理數十億個事件
- Tinder:最大的推薦引擎之一如何決定您接下來會看到誰?
- 如何使用微服務建立財產管理系統集成
- Egnyte 體系結構:構建和擴展多 PB 分布式系統的經驗教訓
- Zapier 如何自動化數十億個工作流自動化任務的旅程
- Jeff Dean 在 Google 進行大規模深度學習
- 如今 Etsy 的架構是什么樣的?
- 我們如何在 Mail.Ru Cloud 中實現視頻播放器
- Twitter 如何每秒處理 3,000 張圖像
- 每天可處理數百萬個請求的圖像優化技術
- Facebook 如何向 80 萬同時觀看者直播
- Google 如何針對行星級基礎設施進行行星級工程設計?
- 為 Mail.Ru Group 的電子郵件服務實施反垃圾郵件的貓捉老鼠的故事,以及 Tarantool 與此相關的內容
- The Dollar Shave Club Architecture Unilever 以 10 億美元的價格被收購
- Uber 如何使用 Mesos 和 Cassandra 跨多個數據中心每秒管理一百萬個寫入
- 從將 Uber 擴展到 2000 名工程師,1000 個服務和 8000 個 Git 存儲庫獲得的經驗教訓
- QuickBooks 平臺
- 美國大選期間城市飛艇如何擴展到 25 億條通知
- Probot 的體系結構-我的 Slack 和 Messenger Bot 用于回答問題
- AdStage 從 Heroku 遷移到 AWS
- 為何將 Morningstar 遷移到云端:降低 97%的成本
- ButterCMS 體系結構:關鍵任務 API 每月可處理數百萬個請求
- Netflix:按下 Play 會發生什么?
- ipdata 如何以每月 150 美元的價格為來自 10 個無限擴展的全球端點的 2500 萬個 API 調用提供服務
- 每天為 1000 億個事件賦予意義-Teads 的 Analytics(分析)管道
- Auth0 體系結構:在多個云提供商和地區中運行
- 從裸機到 Kubernetes
- Egnyte Architecture:構建和擴展多 PB 內容平臺的經驗教訓