2016-08-28 2 views
3

С введением нового режима «swarm» с Docker 1.12 мы пытаемся перенести наше приложение на контейнеры и использовать группы оркестровки роя &.Docker 1.12: Несколько реплик, одна база данных

Для нашего приложения требуется запуск некоторых исходных сценариев базы данных. Мы не упаковываем базу данных внутри нашего докционированного приложения, чтобы она могла следовать безгражданной микросервисной архитектуре, и несколько контейнеров в конечном итоге будут разговаривать с одним экземпляром базы данных (на данный момент).

При создании сервиса мы не можем использовать --replicas с командой create service, поскольку несколько экземпляров будут пытаться создавать таблицы в одной базе данных и терпеть неудачу. Хотя наши скрипты будут проверять, была ли база данных настроена и пропустить создание, но поскольку все контейнеры запускаются одновременно, их нельзя использовать.

Не удалось найти wait-for вид механизма, который мы могли бы использовать с докерами для этой проблемы. Было бы хорошо, если бы мы могли только запустить второй контейнер, когда первый создал базу данных (и разоблачил порты ), но как мы можем настроить межконтейнерную связь для этого?

В качестве альтернативы, могут ли такие инструменты, как flywaydb помочь?

Как это следует использовать в производстве?

+0

Не могли бы вы изменить настройку db, чтобы создать блокировку записи или стиль «блокировки» блокировки записи, который ожидает установка? Тогда только первый контейнер выполняет настройку, а остальные ждут. В качестве альтернативы вы можете отделить настройку db от запуска. – Matt

+0

Если я вас хорошо понимаю, вы хотели бы иметь реплики службы базы данных, подключенные к одному хранилищу данных? Если это так, это действительно нецелесообразно, особенно если все реплики могут записываться в общую память. Базы данных, такие как Postgres, имеют различные параметры для установки на основе master/slave (https://www.postgresql.org/docs/9.2/static/high-availability.html).Если вас больше интересует защита от сбоя узла, вы можете указать только задачу 1 db с использованием тома на каждом узле, который монтирует одно и то же хранилище внешних данных). Если db/node умирает, рой воссоздает его в другом месте. – Alkaline

ответ

0

От Flyway FAQ:

Может несколько узлов мигрировать параллельно? Да! Flyway использует технологию блокировки вашей базы данных для координации нескольких узлов. Это гарантирует, что даже если даже несколько экземпляров вашего приложения попытаются перенести базу данных одновременно, она по-прежнему работает. Конфигурации кластеров полностью поддерживаются.

+0

Я не совсем уверен, работает ли это. Я создал простую многопоточную программу и запускал V1__initial.sql, используя только flyway.migrate(), и все еще не удалось с ошибкой «table already exists». Не могли бы вы дать мне несколько указателей на работу? Благодарю. – user2664256

0

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

В AWS вы можете использовать DynamoDB для этого. DynamoDB поддерживает условное обновление. Сначала контейнер пытается создать ключ блокировки в DynamoDB с атрибутом «attribute_not_exists (yourKey)». Первое творение будет успешным, и другие творения будут отвергнуты. Первый контейнер должен создать другой ключ в DynamoDB, чтобы указать, что db готов. Другие контейнеры просто ждут, пока не будет создан готовый ключ.

Или вы можете сделать это в своем сценарии развертывания службы. Сценарий может создать службу с 1 репликой. Затем продолжайте проверять, создан ли db. Если да, масштабируйте услугу, например docker service update yourservicce --replicas 5.

Смежные вопросы