Как настраивал PostgreSQL для высокой нагрузки

Ответ

В DevOps-контексте настройка PostgreSQL — это не только правка postgresql.conf, но и обеспечение отказоустойчивости, мониторинга и автоматического восстановления. Моя типичная конфигурация для сервиса под нагрузкой:

1. Архитектура: Разворачивал Patroni для управления кластером с автоматическим фейловером. Хранилище — либо сетевой SSD (в облаке), либо локальные диски с репликацией.

2. Ключевые параметры тюнинга (postgresql.conf):

# Память (для сервера с 16 ГБ ОЗУ)
shared_buffers = 4GB                 # 25% от RAM
effective_cache_size = 12GB          # 75% от RAM
work_mem = 32MB                      # Для сложных сортировок
maintenance_work_mem = 1GB
max_connections = 200

# Write-Ahead Log (WAL) - для надежности и производительности
wal_level = replica
max_wal_size = 4GB
min_wal_size = 1GB
checkpoint_completion_target = 0.9   # Растягиваем checkpoint

# Запросы и планирование
random_page_cost = 1.1               # Для SSD
effective_io_concurrency = 200

3. Мониторинг и обслуживание:

  • Устанавливал pg_stat_statements для анализа медленных запросов.
  • Настраивал pg_cron для регулярных задач (например, очистка старых данных).
  • Интегрировал в Prometheus через экспортер postgres_exporter, отслеживая ключевые метрики: количество подключений, репликационный лаг, рост таблиц.

4. Резервное копирование: Использовал pgbackrest для инкрементальных бэкапов с дедупликацией и потоковой передачей WAL. Бэкапы хранились в S3-совместимом хранилище с политикой ротации.

5. Доступ (pg_hba.conf): Ограничивал доступ только IP-адресами прикладных серверов и сервисов мониторинга, отключая доверенную (trust) аутентификацию.

Ответ 18+ 🔞

А, ну слушай, вот эта тема с PostgreSQL — это вообще отдельная песня, а не просто конфиг поправить. Тут надо так подойти, чтобы потом не орать "ёпта, всё упало!" в три часа ночи. Расскажу, как я обычно делаю, чтобы спать спокойно.

1. Архитектура — основа основ.
Если ты думаешь, что можно просто постгрес на одной тачке запустить и забыть — ты, бля, наивный как дитя. Я всегда разворачиваю Patroni для управления кластером. Эта штука сама фейловер сделает, если что-то пойдёт не так. Хранилище — либо быстрый сетевой SSD в облаке, либо, если локально, то диски с репликацией, чтобы не было ситуации "один диск накрылся — и всем пизда". Доверия ебать ноль к железу, поэтому дублируем всё.

2. Тюнинг конфига — тут без магии, только цифры.
Вот смотри, пример для сервера с 16 ГБ оперативки. Если накосячить с памятью — он будет жрать своп как не в себя, и производительность накроется медным тазом.

# Память
shared_buffers = 4GB                 # Четверть от всей оперативы, больше не надо
effective_cache_size = 12GB          # Остальное под кэш ОС
work_mem = 32MB                      # Для сложных сортировок, если мало — в файл пойдёт
maintenance_work_mem = 1GB           # Для вакуума и индексов
max_connections = 200                # Не распыляйся, пул соединений лучше сделай

# WAL — вот где собака порылась
wal_level = replica
max_wal_size = 4GB
min_wal_size = 1GB
checkpoint_completion_target = 0.9   # Чекпоинты растягиваем, чтобы не дёргало систему

# Планировщик
random_page_cost = 1.1               # Для SSD ставь низко, для HDD — выше
effective_io_concurrency = 200       # Чтобы диск не простаивал

3. Мониторинг и обслуживание — глаза и руки.
Без мониторинга ты как слепой кот: ходишь, на всё надеешься, а потом обосрёшься.

  • Ставь pg_stat_statements — увидишь, какие запросы тормозят, и будешь знать, кого бить.
  • pg_cron — для регулярных задач, типа очистки старых логов. Чтобы не делать это вручную, как лох.
  • Обязательно интегрируй в Prometheus через postgres_exporter. Следи за подключениями, лагом репликации, ростом таблиц. Если что-то пошло не так — алерт придёт раньше, чем пользователи начнут материться.

4. Резервное копирование — твой спасательный круг.
Если у тебя нет бэкапов — ты, прости, ебанько. Я использую pgbackrest: он умеет в инкрементальные бэкапы, дедупликацию и потоковую передачу WAL. Всё это складываю в S3-совместимое хранилище с ротацией. Проверяй восстановление, а то будет как в той истории: "бэкапы есть, но они битые".

5. Доступ — закрывай всё нахуй.
В pg_hba.conf оставляй доступ только с IP прикладных серверов и мониторинга. Выкинь нахуй доверенную аутентификацию (trust) — это просто приглашение для любого проходимца. Будь недоверчивым, как старый пердун: пусть каждый доказывает, кто он такой.

Вот так, коротко и без соплей. Сделаешь по этой схеме — будет тебе счастье, а не ебать-колотить каждую неделю.