Сохранять единую статичную большую базу данных Postgres после удаления кластера БД? - PullRequest
0 голосов
/ 22 мая 2019

У меня есть приложение, которое для локальной разработки имеет несколько контейнеров Docker (организованных в Docker Compose).Одним из таких контейнеров является экземпляр Postgres 10, основанный на официальном образе postgres:10.Этот экземпляр имеет свой каталог данных, смонтированный как том Docker, который сохраняет данные во время выполнения контейнера.Пока все в порядке.

В рамках тестирования создания и инициализации кластера postgres часто бывает необходимо удалить том Docker, содержащий данные.(Официальный образ postgres запускает кластер init, если-и-только-если каталог данных оказывается пустым при запуске контейнера.) Это тоже хорошо.

Однако!Теперь у меня есть ситуация, когда для тестирования и использования стороннего расширения Postgres мне нужно загрузить около 6 ГБ (полностью статических) данных поиска геокодирования в базу данных на кластере из файлов резервных копий Postgres.Конечно, возможно загрузить данные из локальной точки монтирования при запуске контейнера, и полученные (очень большие) таблицы сохранятся при перезапуске контейнера в томе, который содержит весь кластер.

К сожалению, они не будутпережить удаление тома док-станции, что, опять же, должно происходить с некоторой частотой. Я ищу способ ускорить или избежать восстановления единой базы данных, содержащей данные геокодирования.

Подходы, которые я рассматривал или рассматриваю в настоящее время:

  1. Использование отдельного тома Docker в том же контейнере для создания постоянного хранилища для отдельного табличного пространства Postgres, которое содержит только базу данных геокодера.Это кажется неработоспособным, потому что, хотя я определенно могу настроить его, официальные документы PG говорят, что табличные пространства и кластеры неразрывно связаны, так что потеря остальной части кластера сделает дополнительное табличное пространство непригодным для использования.Мне бы очень хотелось ошибиться в этом, так как это кажется самым простым решением.
  2. Создание полностью отдельного контейнера с Postgres, который монтирует том для хранения отдельного кластера, содержащего только данные геокодирования.Предположительно, тогда мне нужно было бы сделать что-то нехорошее с сторонними обертками данных (или еще несколько загадочных хитростей администратора postgres, о которых я пока не знаю), чтобы сделать данные легко доступными из кода приложения.

Итак, мой вопрос: Кто-нибудь знает способ сохранения единой базы данных из докеризованного кластера Postgres, не прибегая к стратегии дампирования и перезагрузки?

1 Ответ

0 голосов
/ 22 мая 2019

Если вы хотите ускорить работу, вы можете преобразовать дамп базы данных в каталог данных (импортируйте дамп в чистый контейнер postgres, остановите его и создайте архив данных из каталога данных, а затем загрузите его куда-нибудь).Теперь, когда вам нужно создать новый контейнер postgres, используйте сценарий инициализации, чтобы остановить базу данных, скачать и распаковать ваш tarball в каталог данных и снова запустить базу данных, таким образом вы пропустите весь процесс восстановления базы данных.

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

Если вы хотите еще больше ускорить процесс, создайте собственный образ postgres с помощью tarball и initскрипт включается так, что каждый раз, когда он запускается, он стирает пустой кластер и копирует свой собственный.

Вы можете даже изменить точку входа, чтобы использовать свой собственный скрипт и загрузить данные базы данных, затем вызвать docker-entrypoint.sh, чтобыНет необходимости удалять возможный пустой кластер.

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

...