2013-10-05 219 views
16

斐伊川有最好的collegue背後,nginx的負載均衡

我在那個Instagram的分享他們與其他開發者的技術實施來找到谷底自己的博客。他們爲遇到的問題提供了一些很好的解決方案。他們提供的解決方案之一就是Amazon上的一個負載均衡器,後面有3個nginx實例。我的問題是這些nginx服務器的任務是什麼?而彈性負載平衡器的任務又是什麼?它們之間的關係是什麼?

有人能解釋一下這個解決方案背後的想法嗎?

Tnx提前。

回答

43

聲明:我不是這方面的專家,也不是我自己學習AWS生態系統的過程。

ELB(彈性負載平衡器)除了接收請求並將其路由到正確的服務器外,其本身沒有功能。服務器可以運行nginx,IIS,Apache,lighthttpd,你可以命名它。

我會給你一個真實的用例。

我有一個運行一個WordPress博客的nginx服務器。就像我說的,這臺服務器是由nginx提供靜態內容和「upstreaming」.php請求給運行在同一臺服務器上的phpfpm。一切都很順利,直到有一天。這個博客曾在電視節目中亮相。我有大量的用戶,服務器無法跟上那麼多的流量。 我的第一反應是隻使用AMI(亞馬遜機器映像)在m1.heavy等更強大的實例上創建我的服務器的副本。問題是我知道在接下來的幾天內會有流量增加。很快,我將不得不旋轉更強大的機器,這意味着更多的停機時間和麻煩。 取而代之,我啓動了一個ELB(彈性負載平衡器)並更新了我的DNS,以將網站流量指向ELB,而不是直接指向服務器。用戶不知道服務器IP或任何東西,他只看到ELB,其他所有東西都在亞馬遜的雲中。 ELB決定流量到達哪個服務器。您可以在當時只有一臺服務器(如果此時流量很低)或數百臺服務器。可以隨時創建服務器並將其添加到服務器陣列(服務器組),也可以配置自動擴展以產生新服務器,並使用亞馬遜命令行將其自動添加到ELB服務器組中,全部自動完成。

ELB and auto scaling

亞馬遜雲表(其他產品和AWS生態系統的重要組成部分)總是看着你的服務器的健康狀況,並決定哪些服務器它將路由用戶。它也知道什麼時候所有的服務器變得過載,並且是提供命令產生另一個服務器的代理(使用你的AMI)。當服務器不再承受重負時,它們會自動銷燬(或停止,我不記得)。

這樣我就可以隨時爲所有用戶提供服務,而且當負載很輕時,我會有ELB和只有一個nginx服務器。當負載很高時,我會讓它決定我需要多少服務器(根據服務器負載)。最少的停機時間。當然,你可以設置限制,你可以同時購買多少服務器,以及類似的東西,所以你不會因爲你可以支付的費用而付費。

你看,Instagram的人說,以下 - 「我們曾經在它們之間運行2個nginx機器和DNS Round-Robin」。與ELB相比,這是低效率的IMO。 DNS循環是DNS將每個請求路由到不同的服務器。所以首先去服務器一,第二去服務器二,繼續。 ELB實際上監視着服務器的健康狀況(cpu使用情況,網絡使用情況),並根據該情況決定向哪個服務器發送流量。你看得到差別嗎?他們說:「這種方法的不足之處在於DNS需要更新的時間,以防其中一臺機器需要退役。」 DNS循環是負載平衡器的一種形式。但是,如果一臺服務器出現故障,並且您需要更新DNS以將該服務器從服務器組中刪除,則會導致停機(DNS需要時間才能更新到整個世界)。一些用戶將被路由到這個不好的服務器。對於ELB,這是自動的 - 如果服務器運行狀況不好,它不會收到更多的流量 - 除非整個服務器組的狀態都不好,並且您沒有任何類型的自動縮放設置。

現在,Instagram的人們說:「最近,我們轉而使用亞馬遜的彈性負載平衡器,其背後有3個NGINX實例,可以交換進出(如果他們健康檢查失敗,會自動失去輪換)「。

我說明的情景是虛構的。它實際上比這更復雜,但沒有什麼不能解決。例如,如果用戶將圖片上傳到您的應用程序,您如何保持服務器組上所有機器的一致性?您需要將圖像存儲在Amazon S3等外部服務上。另一篇關於Instagram工程的文章 - 「這些照片本身直接傳到亞馬遜S3上,亞馬遜S3目前爲我們存儲了幾兆太字節的照片數據。」如果負載平衡器上有3個nginx服務器,並且所有服務器都提供圖像鏈接指向S3的html頁面,則不會有任何問題。如果圖像本地存儲在實例上 - 無法執行此操作。 ELB上的所有服務器也需要一個外部數據庫。對於那個亞馬遜有RDS - 所有的機器可以指向相同的數據庫,並保證數據的一致性。 在上面的圖片中,您可以看到RDS「只讀副本」 - 即RDS負載平衡方式。對此我不太瞭解,對不起。

嘗試和閱讀:http://awsadvent.tumblr.com/post/38043683444/using-elb-and-auto-scaling

最好的問候。

+0

這麼好的解釋,謝謝你太多了。我現在的一切都很清楚。現在我去找出一些關於AWS的其他內容。 最好的問候。 – Navid

+0

祝你好運。 – ddutra

+1

這真是一個很棒的解釋......幫了我很多 – sam

0

您能指出博客條目嗎?

負載均衡器負載平衡。他們監視Web服務器的運行狀況(響應時間等)並在Web服務器之間分配負載。在更復雜的實施中,如果出現流量高峯,可以自動產生新的服務器。當然你需要確保服務器之間的一致性。他們可以共享相同的數據庫。

所以我相信負載平衡器會受到影響,並決定根據服務器的健康狀況決定將哪個服務器路由流量。 。 Nginx是一款非常適合同時在線服務的Web服務器。 動態頁面的請求可以使用cgi卸載到不同的服務器。或者運行nginx的服務器也可以運行phpfpm。 。 很多可能性。我現在正在用手機。明天我可以多寫一點。 此致敬禮。

+1

博客條目是:http://instagram-engineering.tumblr.com/post/13649370142/what-powers-instagram-hundreds-of-instances-dozens-of他們的博客是偉大的和鼓舞人心的。非常感謝你的一個很好的解釋。所以如果我明白自己的平衡器沒有任何功能,它是組織流量的nginx服務器?那麼你在其中一個負載平衡器上安裝了一個nginx網絡服務器?對於缺乏信息感到抱歉。 – Navid

+0

我會給你一個真實的用例,發生在我身上。 – ddutra

0

我知道我遲到了,但我認爲在Istagram blogpost中使用ELB背後的NGINX實例是爲了提供高可用負載平衡器,如here所述。

NGINX實例似乎並未被用作博客帖子中的Web服務器。 對於角色們提及:

接下來談到的是處理我們請求的應用服務器。我們運行Djangoon亞馬遜高CPU超大型機

所以ELB被使用,就像與DNS輪循,這不是提供高可用性NGINX實例之間的舊的解決方案的替代品。