Docker 1.12: несколько реплик, одна база данных

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

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

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

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

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

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


person user2664256    schedule 28.08.2016    source источник
comment
Не могли бы вы изменить настройку базы данных, чтобы создать блокировку записи или состояние «создания» стиля блокировки записи, которого ждет установка? Затем только первый контейнер выполняет настройку, а остальные ждут. В качестве альтернативы вы можете отделить настройку базы данных от запуска.   -  person Matt    schedule 29.08.2016
comment
Насколько я вас понимаю, вы хотели бы иметь реплики службы базы данных, каждая из которых подключена к одному и тому же хранилищу данных? Если это так, это действительно не рекомендуется, особенно если все реплики могут записывать в общее хранилище. Базы данных, такие как Postgres, имеют различные варианты настройки на основе master/slave (postgresql.org /docs/9.2/static/high-availability.html). Если вас больше интересует защита от сбоя узла, вы можете указать только 1 задачу базы данных, используя том на каждом узле, который монтирует одно и то же внешнее хранилище данных). Если db/node умирает, рой воссоздает его в другом месте.   -  person Bernard    schedule 29.08.2016


Ответы (2)


Из часто задаваемых вопросов о Flyway:

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

person Axel Fontaine    schedule 29.08.2016
comment
Я не совсем уверен, работает ли это. Я создал простую многопоточную программу и запустил V1__initial.sql, используя только flyway.migrate(), и она все еще не удалась с ошибкой таблицы уже существует. Не могли бы вы дать мне несколько советов по работе? Спасибо. - person user2664256; 29.08.2016
comment
Да, это работает, как и ожидалось. Служба ECS, выполняющая 4 задачи со сценарием миграции пролетного пути, работала хорошо. - person Arjun SK; 14.10.2019

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

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

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

person CloudStax    schedule 27.09.2017