Ответ
В 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) — это просто приглашение для любого проходимца. Будь недоверчивым, как старый пердун: пусть каждый доказывает, кто он такой.
Вот так, коротко и без соплей. Сделаешь по этой схеме — будет тебе счастье, а не ебать-колотить каждую неделю.