Как масштабировать дискурс горизонтально?

Привет,

Я запутался в инструкциях по установке. Можно ли масштабировать Discourse горизонтально?
Например, запустить 2+ контейнера Docker на разных серверах, каждый из которых будет выполнять Discourse?

В инструкциях с GitHub - discourse/discourse_docker: A Docker image for Discourse · GitHub указано:

Настройка с несколькими контейнерами гораздо более гибкая и надежная, однако её сложнее настроить. Настройка с несколькими контейнерами позволяет вам:

  • Свести к минимуму время простоя при обновлении до новых версий Discourse. Вы можете запустить новые веб-процессы, пока ваш сайт работает, и переключиться на новый образ только после его сборки.
  • Масштабировать ваш форум на несколько серверов.
  • Добавить серверы для резервирования.
  • Запустить некоторые обязательные службы (например, базу данных) на более мощном оборудовании.

Если вы хотите использовать настройку с несколькими контейнерами, обратитесь к шаблонам data.yml и web_only.yml в каталоге samples. Чтобы упростить этот процесс, launcher внедрит переменную окружения DISCOURSE_HOST_IP, которая будет доступна внутри образа.

Есть ли где-то дополнительная информация о том, как запустить контейнеры на разных серверах, а не множество контейнеров на одном сервере?

Спасибо

Существует множество обсуждений на эту тему: Может ли Discourse выпускать частые образы Docker, не требующие начальной настройки?.

Суть в следующем:

  1. Вы предоставляете внешние сервисы для PostgreSQL, Redis и балансировщика нагрузки и настраиваете app.yml для их использования, например, как описано в статье Запуск Discourse с отдельным сервером PostgreSQL.

  2. В любом месте выполните команду ./launcher bootstrap app. В результате будет создан образ контейнера на локальной машине. Загрузите этот образ в ваш сервис реестра контейнеров.

  3. Теперь вы можете запускать любое количество экземпляров, указав всем использовать образ, экспортированный на предыдущем шаге.

Вы можете сделать что-то вроде запуска Discourse в Docker вместе с Apache и создать два веб-контейнера, где один из них выступает в роли обратного прокси-сервера.

Вы можете использовать мультисайт, чтобы один контейнер обслуживал несколько сайтов (используя одни и те же плагины и версию Discourse). Здесь описано, как это сделать без внешнего обратного прокси-сервера. Если вы попробуете это сделать, пожалуйста, оставьте комментарий там и сообщите мне, получилось ли у вас. Я планирую опубликовать это здесь, когда буду достаточно уверен, что это работает.

Запуск контейнеров на нескольких серверах осуществляется так же, как и в любом из вышеописанных случаев. У вас будет несколько контейнеров, использующих общие Redis и Postgres, работающих за балансировщиком нагрузки.

В основном любые действия, отличные от официальной стандартной установки Discourse, не поддерживаются, поскольку существует бесконечное множество способов реализации таких решений.

У меня два вопроса:

  • Первый касается Sidekiq в случае запуска нескольких контейнеров web_only.yml Docker, каждый из которых находится на отдельной виртуальной машине (VM). В этом сценарии разные экземпляры Sidekiq, использующие один и тот же сервер Redis, могут выполнить одну и ту же задачу дважды. Насколько устойчива система Discourse к таким ошибкам? Не надежнее ли использовать один экземпляр Sidekiq на выделенной виртуальной машине (или в отдельном контейнере Docker)? Если да, то как его отделить от веб-интерфейса Discourse?
  • Касательно ваших последних замечаний о поддерживаемых способах установки: я понимаю, что существует бесконечное множество вариантов конфигурации с несколькими контейнерами, но, на мой взгляд, нам необходим поддерживаемый способ запуска нескольких экземпляров для горизонтального масштабирования и/или обеспечения высокой доступности в двух случаях: на основе виртуальных машин (разные контейнеры Discourse web_only на разных VM, а Redis и Postgres установлены на отдельных VM напрямую, без использования Docker) и на основе контейнеров (всё построено на контейнерах).