[英]AWS EB: load balancing and containerized database
我有一個在 EBS 實例上與 Docker 一起運行的 Rails 應用程序。 這是一個多容器應用程序,所以我的 Rails 應用程序有一個容器,我的 PostgreSQL 數據庫有另一個容器。
由於每月價格昂貴,我避免將 RDS 用於我的數據庫。
到目前為止,它在開發環境中運行良好,但我想知道這種用於生產的架構,因為我不確定一些事情:
如果我的負載均衡器創建了一個新實例,是否意味着創建了另一個數據庫容器? 在這種情況下,是否會有 2 個不同的數據源不同步?
我在我的 Web 應用程序容器中運行一個 cron 腳本,它每小時備份一次我的數據庫。 如果 2 個實例因為負載均衡器而啟動,腳本是否會執行兩次?
我實際上是負載平衡的真正初學者,因此將不勝感激任何提示! 謝謝閱讀
AWS 負載均衡器本身不包含任何其他實例,因此如果您只是在 EC2 實例前面放置一個 ELB 或 ALB 以使其可從外部訪問,則不會發生任何變化。
+-----------------------------+
R53: myapp.example.com | EC2 |
+-----+ | +-------+ +------------+ |
--------> | ELB | -------> | | Rails | -> | PostgreSQL | |
+-----+ | +-------+ +------------+ |
+-----------------------------+
如果您確實想運行應用程序容器的多個副本(用於冗余、擴展、升級),那么它們必須共享一個數據庫。 這可能意味着不要通過 Docker Compose 啟動數據庫並在config/database.yml
文件中指向它。 你必須決定它在哪里運行; 由於數據庫與應用程序有不同的要求,在較小的實例上運行它但使用本地磁盤可能是有意義的。
+-------+
R53: myapp.example.com +-> | EC2 | --+ +------------+
+-----+ | | Rails | | | EC2 |
--------> | ELB | -----+ +-------+ +-> | PostgreSQL |
+-----+ | +-------+ | +------------+
| | EC2 | |
+-> | Rails | --+
+-------+
假設您尚未使用最小的實例大小,您可以通過選擇較小的實例來降低成本。 如果您之前需要一個 4 核 m5.xlarge 用於此設置,您可以將其拆分為兩個 2 核 m5.large 實例。 最后一張圖看起來也與基於 RDS 的設置非常相似; 關鍵的權衡是您是想向亞馬遜支付更多費用,還是花自己的時間安裝數據庫和管理快照。
您必須確保像 cron 作業這樣的事情只執行一次(或者如果它們運行多次,它們不會相互干擾)。 Docker 和 AWS 都沒有直接幫助解決這個問題。
如果您願意投資學習 Kubernetes,在 EKS 下運行它可以幫助解決這里的一些問題。 您可以使用本地 Kubernetes 概念,如 LoadBalancer 類型服務、StatefulSets 來運行數據庫,以及 Kubernetes CronJobs 以確保它們只運行一次。 這與您可能在 Docker Compose 中所做的設置截然不同,但您可以使用 Docker Desktop Kubernetes 或單節點 Kubernetes 安裝(如 minikube 或 kind)在本地進行試驗。
+-----------------------------+
| EKS |
LoadBalancer Service | |
+.....+ | Deployment StatefulSet |
--------> : ELB : -------> | Rails --> PostgreSQL |
+.....+ | Rails |
| |
| CronJob |
+-----------------------------+
| EC2 | EC2 | EC2 |
+-----------------------------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.