AWS EB: балансировка нагрузки и контейнерная база данных - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть приложение Rails, работающее с Docker на экземпляре EBS. Это мультиконтейнерное приложение, поэтому у меня есть один контейнер для моего приложения на Rails, а другой - для моей базы данных PostgreSQL.

Я избегал использовать RDS для своей базы данных из-за высокой ежемесячной цены.

Пока что он отлично работает в среде разработки, но мне интересно узнать об этой архитектуре для производства, из-за нескольких вещей, в которых я не уверен:

  • , если моя загрузка Балансировщик создает новый экземпляр, означает ли это, что создан другой контейнер базы данных? В таком случае, будут ли два разных источника данных, которые не синхронизированы?

  • Я запускаю скрипт cron в своем контейнере веб-приложения, который каждый час выполняет резервное копирование базы данных. Если из-за балансировщика нагрузки запущено 2 экземпляра, будет ли скрипт выполняться дважды?

Я на самом деле настоящий новичок с балансировкой нагрузки, поэтому любые советы будут с благодарностью ! Спасибо за чтение

1 Ответ

1 голос
/ 21 февраля 2020

Балансировщик нагрузки 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; существенный компромисс заключается в том, хотите ли вы платить больше Amazon или тратить свое время на установку базы данных и управление снимками.

Вы должны убедиться, что такие вещи, как задания 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   |
                           +-----------------------------+
...