Как настроить 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гб.

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

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

На взгляд postgresql dba вы не передали никаких настроек вообще, а work_mem и вовсе уменьшили, 4мб у него дефолт. Соответственно база будет работать по-умолчанию, т.е. из расчёта запуститься на любом калькуляторе, а не внятно работать. Не хватает, соответственно, всего. Настройки более агрессивных checkpointer, bgwriter и autovacuum в первую очередь.
По запросам смотрите pg_stat_statements
Ответ написан
@Niko_F
Я не адепт докера, но всему есть разумное объяснение. Разворачиваю стэк из десятка приложений, которые используют кафку+зукипер+постгрес и это все в докере или кубере. постгрес на хостовой системе условно бесплатный и вскоре станет платный, использовать другие версии не могу по тз и контракту с заказчиком, нагрузка на базу небольшая. Поэтому на базе хостовой системы делаю контейнер постгреса, и его буду юзать. получается стэк для разработки, тестирования и прода максимально унифицирован, не зависит от хостовой системы. Сейчас стал вопрос автоматизировать бэкапы и их восстановление. Никаких докер волюмов. Файловая система хоста. Кластер и репликацию думал, но пока не решил нужна ли она в принципе и может быть будет достаточно снимать бэкапы чаще ,возможно снэпшоты файловой системы. тут можно накрутить вариантов достаточное количество.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы