【问题标题】:AWS EB: load balancing and containerized databaseAWS EB:负载均衡和容器化数据库
【发布时间】:2020-02-21 19:18:19
【问题描述】:

我有一个在 EBS 实例上使用 Docker 运行的 Rails 应用程序。 它是一个多容器应用程序,所以我有一个容器用于我的 Rails 应用程序,另一个容器用于我的 PostgreSQL 数据库。

由于每月价格昂贵,我避免将 RDS 用于我的数据库。

到目前为止,它在开发环境中运行良好,但我想知道这种用于生产的架构,因为有几件事我不确定:

  • 如果我的负载均衡器创建了一个新实例,是否意味着创建了另一个数据库容器?在这种情况下,是否会有 2 个不同的数据源不同步?

  • 我正在我的 Web 应用程序容器中运行一个 cron 脚本,它每小时备份一次我的数据库。如果由于负载均衡器而启动了 2 个实例,脚本是否会执行两次?

我实际上是负载平衡的真正初学者,因此非常感谢任何提示!感谢阅读

【问题讨论】:

    标签: database amazon-web-services docker load-balancing


    【解决方案1】:

    AWS 负载均衡器本身不包含任何其他实例,因此,如果您只是将 ELB 或 ALB 放在 EC2 实例前面以使其外部可访问,则不会发生任何变化。

                               +-----------------------------+
    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 或 minikube 或 kind 等单节点 Kubernetes 安装在本地进行试验。

                               +-----------------------------+
                               | EKS                         |
       LoadBalancer Service    |                             |
              +.....+          | Deployment     StatefulSet  |
    --------> : ELB : -------> |   Rails    -->   PostgreSQL |
              +.....+          |   Rails                     |
                               |                             |
                               | CronJob                     |
                               +-----------------------------+
                               |    EC2   |  EC2   |   EC2   |
                               +-----------------------------+
    

    【讨论】:

    • 非常感谢 David 的见解,我将研究 Kubernetes,因为这里的附加值可能会产生很大的不同。
    猜你喜欢
    • 1970-01-01
    • 2020-08-19
    • 2014-12-18
    • 2019-07-17
    • 2012-11-19
    • 2018-04-14
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多