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

Спасибо!
  • Вопрос задан
  • 21177 просмотров
Пригласить эксперта
Ответы на вопрос 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
Я не адепт докера, но всему есть разумное объяснение. Разворачиваю стэк из десятка приложений, которые используют кафку+зукипер+постгрес и это все в докере или кубере. постгрес на хостовой системе условно бесплатный и вскоре станет платный, использовать другие версии не могу по тз и контракту с заказчиком, нагрузка на базу небольшая. Поэтому на базе хостовой системы делаю контейнер постгреса, и его буду юзать. получается стэк для разработки, тестирования и прода максимально унифицирован, не зависит от хостовой системы. Сейчас стал вопрос автоматизировать бэкапы и их восстановление. Никаких докер волюмов. Файловая система хоста. Кластер и репликацию думал, но пока не решил нужна ли она в принципе и может быть будет достаточно снимать бэкапы чаще ,возможно снэпшоты файловой системы. тут можно накрутить вариантов достаточное количество.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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