遷移到具有自動擴展功能的 AWS 雲 - 將 Redis 和 ElasticSearch 放在哪裡?
我一直在嘗試研究這個主題,但沒有找到任何地方推薦在遷移到雲框架時安裝 Redis 和 ElasticSearch 等服務的位置。
我目前在兩台靜態伺服器上執行 Symfony2 應用程序——一台執行 MySQL,另一台是面向公眾的 Web 伺服器,它還執行著 Redis 和 ElasticSearch。這兩個伺服器都是虛擬化的,但就目前無法複製而言它們是靜態的(各個方面仍然依賴於本地文件系統)。
目標是遷移到 AWS 並使用自動縮放功能來根據需要啟動和終止 Web 伺服器,但我不清楚應該在每個 EC2 實例上放置什麼。他們應該只是單一職責嗎?即為 Web 伺服器、Redis 和 ElasticSearch 設置單獨的實例,並且很可能為 MySQL 設置一個 RDS 實例,並且只在 Web 伺服器上設置自動縮放?
我預計不會很快擴展 ElasticSearch 伺服器,因為它只是驅動搜尋功能,但 Redis 可能需要在某個時候複製 - 但是否應該手動完成?我不確定如何自動完成此操作,因為據我所知,每個實例都需要配置為了解它的主/從。我很感激這方面的建議。
當我在這裡時,還有一個快速的問題 - 噹噹前有 X Web 伺服器處於活動狀態時,我將如何部署程式碼更改?我正在使用 Capifony 部署腳本(Capistrano 的 Symfony2 版本),我認為它可以通過指定地址數組來輕鬆處理多個伺服器
:domain
……但是當 Web 伺服器的數量可以變化時應該如何處理呢?
我們處理這個問題的方法是在一個分層堆棧中創建多組伺服器(即使一個組目前只需要一個實例)。第一層顯然是您的Elastic Load Balancer。
第二層是 Web 伺服器的Auto Scaling 組(多可用區)。這些啟動一個定制的 AMI,該 AMI 設計為在啟動時為該任務處於適當的就緒狀態。(現在我們的流程更成熟了,我們實際上啟動了一個通用 AMI,它可以使用 Chef 在啟動時自動配置。)但是我們還在
git pull
啟動時創建了一個最新的生產程式碼儲存庫,所以我們不必創建新的每個程式碼部署的 AMI。這也讓我們可以更輕鬆地更改配置,例如數據庫主機、Redis 主機等。第三層用於數據庫和其他服務,例如 ElasticSearch 和 Redis。您可以在一個機器上託管所有三種服務,然後管理您自己的 mysql 從屬伺服器,或者您可以在自己的機器上託管 Redis 和 ElasticSearch,並為您的 Mysql 服務使用 Amazon 的 RDS。您的選擇,取決於您是否要在 MySQL 中管理自己的複制/容錯。
通常最簡單的方法是在多可用區配置中使用Amazon RDS 。我們總是嘗試將所有內容部署到多可用區,因此如果單個可用區出現故障,我們仍然可以正常執行。然後,您執行一個較小的實例來僅託管 Redis 和 ElasticSearch。
使用ElasticSearch,這裡有一個我們用於安裝 rails 的提示:安裝和維護您的應用程序的完整實例以及盒子上的 ElasticSearch。然後為該角色(或 Chef 角色)建構一個 AMI。原因是您可以在啟動時執行實用程序任務,以便在啟動新的 AMI 時從頭開始創建 ElasticSearch 索引。然後,將此實例也放入多可用區 ASG 中,最小和最大一台伺服器。如果那個盒子或 AZ 死了,ASG 將啟動一個替代品,它會在啟動時重建它的索引並準備好為客戶服務。
對於Redis來說,好消息即將到來。
redis-cluster
即將推出,它有望更輕鬆地管理擴展 redis 儲存。同時,您可以處理自己的複製或嘗試 Garantia,這是一種託管的可擴展 redis 伺服器解決方案,它現在使用的是 beta 版本的 redis-cluster(目前僅限於 us-east-1 區域)。這具有為您的配置保留相同 IP 地址的優勢,無論您的實例池發生什麼情況。最後,為了保護進出數據庫的數據,我建議在公共/私有Virtual Private Cloud的私有網路部分中建構它。這將設置您自己的與數據包嗅探器隔離的專用網路。您還可以對 MySQL 數據庫連接使用 SSL 加密。