AWS EC2 實例 Auto Scaling 混淆
所以首先我對 AWS 完全陌生,所以請多多包涵。
我已經有一個實例執行了幾個月,現在我需要自動縮放它,因為我的流量峰值越來越大,並且有時會超載。
所以讓我回顧一下我到目前為止所做的事情,你們可以告訴我我哪裡出錯了,我必須做些什麼不同的事情。
- 首先,我創建了一個負載均衡器,上面有我的一個主實例,稱之為“實例 A”
- 接下來,我在“實例 A”上創建了兩個 CloudWatch 警報,用於監控 CPU 負載。接下來我創建了“實例 A”的圖像
- 接下來,我創建了一個連結到我新創建的 AMI 的啟動配置。
- 接下來,我創建了一個 Auto Scaling 組並將其連結到我的負載均衡器,並設置了我之前設置的兩個 Scaling 警報。
- 我將 AutoScaling 組 Min 設置為 0,Max 設置為 3,因為我只希望它在我的原始實例(實例 A)超出容量時開始啟動實例。
所以基本上我希望我的原始實例始終執行。然後,當它開始超出容量時,我希望 Auto Scaling 組開始啟動實例並讓負載均衡器在它們之間分配負載。我在這裡的想法合理嗎?
其他重要問題。
當我對原始實例進行程式碼和數據更改時,是否必須重新製作啟動配置使用的圖像?
DNS 名稱和 IP 需要關閉什麼?我目前正在使用 Route 53,我是否將這一點指向我的負載均衡器,僅此而已?
多謝你們!
讓我們來看看你的問題。
所以基本上我希望我的原始實例始終執行。然後,當它開始超出容量時,我希望 Auto Scaling 組開始啟動實例並讓負載均衡器在它們之間分配負載。我在這裡的想法合理嗎?
我會說是的,但我確實有一些保留意見。如果我理解正確,您已將“主”實例放置在 Auto Scaling 組之外。從理論上講,這將確保 Auto Scaling 不會殺死您的原始實例。我想提幾點:
- 您沒有充分利用 Auto Scaling 的可能性。Auto Scaling 不僅使您的設置能夠擴展,而且還可以確保限制。如果出於某種原因,您的“主”實例死亡,您的自動擴展策略將不會生效。如果您將實例保留在 a
min-size
為 1 的 Auto Scaling 組中,Auto Scaling 會自動替換失敗的實例。- 在進行自動縮放時,將您的實例視為“一次性”通常是最佳實踐,因為這就是您建構彈性系統的方式。不要依賴一個實例始終可用。
- 您可以為您的 Auto Scaling 組設置終止策略,使其始終首先終止最新的實例。這將確保您的“主要”實例將被保留(只要它是健康的)。我之前的評論仍然適用。
當我對原始實例進行程式碼和數據更改時,是否必須重新製作啟動配置使用的圖像?
我會說不**,但這更多是設計問題。您的圖像應該描述您的伺服器的狀態,但它不應該負責程式碼分發。考慮這樣一種情況,由於緊急錯誤,您必須更新您的應用程序,但您的伺服器處於高負載狀態。更新您的主伺服器、創建一個 AMI、更新您的啟動配置並關閉您的自動擴展伺服器以便它們可以使用最新的 AMI 重新生成聽起來像一個有吸引力的解決方案嗎?我對此的回答是不**(再次)。查看原始碼版本控制和部署策略(例如,我 60% 的時間是 Rails 開發人員並使用
git
andcapistrano
)。在某些情況下,您的方法也可以工作,並且這裡有很多中間立場(我建議您也研究一下
Chef
腳本userdata
)。我自己實際上很少使用自定義 AMI,這要歸功於Chef
.DNS 名稱和 IP 需要關閉什麼?我目前正在使用 Route 53,我是否將這一點指向我的負載均衡器,僅此而已?
基本上,是的。您可以在創建 Auto Scaling 組時選擇應附加到新實例的負載均衡器。我還沒有將 GUI 用於 Auto Scaling,但我很確定它在某個地方。如果不是,CLI 仍然支持它。將您的 Route53 記錄指向您的 ELB
alias
,基本上就是這樣。對其他問題的回應(2014/02/23):
如果您使用 Rails 進行開發,我強烈推薦Capistrano進行部署,它可以在您首選的版本控制系統(如 git)中獲取應用程序的特定版本,並將其部署到特定環境中的多個伺服器。那裡有很多教程,但是 Ryan Bates 的修訂版(和專業版)Railscast 關於這個主題非常簡潔,儘管你需要訂閱他的網站才能觀看它們。大多數其他教程也會讓你繼續前進。使用您的 AMI 和啟動腳本啟動新伺服器,該腳本會拉取 git 儲存庫的臨時複製並執行本地 Capistrano 命令以啟動您的應用程序。這確保了以後,您還可以使用 Capistrano 將新版本的應用程序部署到所有正在執行的伺服器上,只需一個命令。
Capistrano 還提供了其他一些好處,包括使您能夠在所有或僅一個伺服器上執行特定任務並回滾部署,這很難僅使用 git 來完成。