AWS EB:负载均衡和容器化数据库
AWS EB: load balancing and containerized database
我在 EBS 实例上有一个 Rails 应用 运行 Docker。
这是一个多容器应用程序,所以我有一个容器用于我的 Rails 应用程序,另一个容器用于我的 PostgreSQL 数据库。
由于每月价格昂贵,我避免将 RDS 用于我的数据库。
到目前为止,它在开发环境中运行良好,但我对这种生产架构感到疑惑,因为有几件事我不确定:
如果我的负载均衡器创建了一个新实例,是否意味着创建了另一个数据库容器?那样的话,会不会有2个不同的数据源不同步呢?
我是 运行 我的 Web 应用程序容器中的一个 cron 脚本,它每小时备份一次我的数据库。如果 2 个实例因为负载平衡器而启动,脚本是否要执行两次?
我实际上是负载平衡的真正初学者,所以任何提示都将不胜感激!感谢阅读
AWS 负载均衡器本身不包含任何其他实例,因此如果您只是将 ELB 或 ALB 放在 EC2 实例前面以使其可从外部访问,则不会发生任何变化。
+-----------------------------+
R53: myapp.example.com | EC2 |
+-----+ | +-------+ +------------+ |
--------> | ELB | -------> | | Rails | -> | PostgreSQL | |
+-----+ | +-------+ +------------+ |
+-----------------------------+
如果您确实想要 运行 应用程序容器的多个副本(用于冗余、扩展、升级),那么它们必须共享一个数据库。这可能意味着不通过 Docker Compose 启动数据库并在 config/database.yml
文件中指向它。你必须决定它在哪里 运行s;由于数据库与应用程序有不同的要求,运行在较小的实例上使用本地磁盘可能有意义。
+-------+
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 |
+-----------------------------+
我在 EBS 实例上有一个 Rails 应用 运行 Docker。 这是一个多容器应用程序,所以我有一个容器用于我的 Rails 应用程序,另一个容器用于我的 PostgreSQL 数据库。
由于每月价格昂贵,我避免将 RDS 用于我的数据库。
到目前为止,它在开发环境中运行良好,但我对这种生产架构感到疑惑,因为有几件事我不确定:
如果我的负载均衡器创建了一个新实例,是否意味着创建了另一个数据库容器?那样的话,会不会有2个不同的数据源不同步呢?
我是 运行 我的 Web 应用程序容器中的一个 cron 脚本,它每小时备份一次我的数据库。如果 2 个实例因为负载平衡器而启动,脚本是否要执行两次?
我实际上是负载平衡的真正初学者,所以任何提示都将不胜感激!感谢阅读
AWS 负载均衡器本身不包含任何其他实例,因此如果您只是将 ELB 或 ALB 放在 EC2 实例前面以使其可从外部访问,则不会发生任何变化。
+-----------------------------+
R53: myapp.example.com | EC2 |
+-----+ | +-------+ +------------+ |
--------> | ELB | -------> | | Rails | -> | PostgreSQL | |
+-----+ | +-------+ +------------+ |
+-----------------------------+
如果您确实想要 运行 应用程序容器的多个副本(用于冗余、扩展、升级),那么它们必须共享一个数据库。这可能意味着不通过 Docker Compose 启动数据库并在 config/database.yml
文件中指向它。你必须决定它在哪里 运行s;由于数据库与应用程序有不同的要求,运行在较小的实例上使用本地磁盘可能有意义。
+-------+
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 |
+-----------------------------+