Как настроить Postgres в Docker?

Привет!

У меня веб приложение. Используется бд PosgreSQL, для нее выделен отдельный VPS, там сейчас SSD, 1 ядро Intel Xeon E5-2620 и 2гб RAM. Postgres я разворачиваю через docker compose примерно так:
version: '2'

services:
  postgres:
    image: postgres:10
    ports:
      - 5432:5432
    volumes:
      - postgres:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: postgres
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: example
    command: postgres -c shared_buffers=512MB -c effective_cache_size=1536MB -c work_mem=2621kB -c maintenance_work_mem=128MB
    shm_size: '1gb'

volumes:
  postgres:


Наступил мифический хайлоад. БД на большом количестве запросов начинает тормозить. Со структурами индексов и запросов разберусь сам, а по настройке БД хотелось бы спросить:
1. Есть ли специфика использования Postgres в докере? Например, недавно стал получать ошибки типа https://meta.discourse.org/t/pg-throws-could-not-r... , оказалось проблема в докере, а точнее в деталях настройки ОС, что для меня, простого пыхапешника - лес темный.
2. Правильные ли я передал настройки, может чего не хватает.
3. Может имеет смысл просто установить базу без всяких докеров (использую докер для удобства разработки, портирования и т.д.).
4. Будет ли эффект если добавить физических ядер? Нужно ли для этого отдельно настраивать docker?

К базе примерно 95% запросов - селекты. Сейчас процессор в пики загружен на 100%, в то время как память всего на 150мб, что меня удивляет. База на текущий момент весит ~2гб.

Спасибо!
  • Вопрос задан
  • 20895 просмотров
Пригласить эксперта
Ответы на вопрос 2
Melkij
@Melkij
PostgreSQL DBA
Зачем оно вам? Вот скажите, зачем? Пока ни один из встреченных адептов докера не справился с таким простым вопросом "зачем вам база в докере?", может вы справитесь.

Для использования базы вы обязаны предоставить нормальную файловую систему, необходимо предоставить сеть хоста. Изоляция? Так у вас система целиком под базу и так. Миграция на другой хост? Да у вас в этом докере только бинарники базы и есть. Точно такие же как в репозиториях, сама база-то снаружи в нормальной ФС. На другую архитектуру вы datadir не перетащите в принципе. Несколько кластеров баз на одной машине? А докер для этого зачем? На ubuntu/debian есть шикарные скрипты pg_ctlcluster. Про извращения с pg_upgrade обновлением базы не буду перепечатывать ответ с ruSO.

На взгляд postgresql dba вы не передали никаких настроек вообще, а work_mem и вовсе уменьшили, 4мб у него дефолт. Соответственно база будет работать по-умолчанию, т.е. из расчёта запуститься на любом калькуляторе, а не внятно работать. Не хватает, соответственно, всего. Настройки более агрессивных checkpointer, bgwriter и autovacuum в первую очередь.
По запросам смотрите pg_stat_statements
Ответ написан
OnYourLips
@OnYourLips
1. Есть ли специфика использования Postgres в докере?
Есть. Обычно СУБД разворачивают кластерами на голом железе, а докер и средства оркестрации используют для приложений.
stateless контейнеры - наше всё.

3. Да.
Только не забудьте, что СУБД обычно байндятся на локалхост, и надо будет слушать и другие интерфейсы. И файрвол не забудьте.

Базы в докере удобно использовать для разработки, но не в продакшене.

Upd: хотите эффективно использовать докер - забудьте про -v/--volume/volumes и все с ними связанное.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы