Конфиги Postgres

  • postgresql.conf - главный конфиг postgres
  • postgresql.auto.conf - автоматически управляемый конфиг, руками не меняется
  • pg_hba.conf - правила аутентификации и входа
  • pg_ident.conf - маппинг системных пользователей в postgres роли для ident/peer
  • PG_VERSION - major release версия кластера
  • postmaster.pid - pid запущенного сервера
  • postmaster.opts - параметры с какими был запущен сервер
  • current_logfiles - служебный файл с указанием текущих лог файлов

  • base/ - основные файлы таблиц для обычных бд

  • global/ - глобальные системные таблицы кластера (роли, юзеры и тд)
  • pg_tblspc/ - симлинки на tablespace, вынесенные в другие места фс

  • pg_wal/ - wal

  • pg_xact/ - информация о статусе транзакций
  • pg_commit_ts/ - хранение timestamps коммита транзакций
  • pg_subtrans/ - информация о подчиненных транзакциях

  • pg_stat/ - Постоянные файлы статистики/служебного состояния.

  • pg_stat_tmp/ - Временные статистические файлы.
  • pg_snapshots/ - Экспортированные snapshots для pg_export_snapshot().
  • pg_notify/ - Служебные данные механизма LISTEN/NOTIFY.
  • pg_serial/ - Информация для serializable transactions.
  • pg_dynshmem/ - Динамическая shared memory.

  • pg_logical/ - Данные логической репликации и logical decoding.

  • pg_replslot/ - Replication slots. Очень важный каталог: если слоты зависнут, WAL может разрастаться.

  • log/ - логи


postgresql.conf

listen_addresses = '*'
port = 5432
max_connections = 100
superuser_reserved_connections = 3  резерв слотов для администратора, чтобы зайти при полной загрузке

shared_buffers = 8GB                оперативка под кэш страниц бд (25% от RAM)
work_mem = 64MB                     лимит памяти на одну операцию сортировки или хеширования внутри запроса (до сброса на диск)
maintenance_work_mem = 2GB          память для служебных операций (VACUUM, создание индексов, добавление внешних ключей)
effective_cache_size = 24GB         подсказка планировщику: сколько всего памяти (включая кэш ОС) доступно для кэширования (75% от RAM)

wal_level = replica                 уровень записи в WAL-журнал
fsync = on                          принудительная запись данных на физический диск (гарантия сохранности при сбое питания)
synchronous_commit = on             ждать физической записи WAL перед подтверждением транзакции (для надежности)
wal_buffers = 16MB                  объем буфера для несохраненных данных WAL (обычно 16MB достаточно)
checkpoint_timeout = 15min          максимальное время между автоматическими контрольными точками (сбросом грязных страниц)
max_wal_size = 4GB                  максимальный размер файлов WAL, при достижении которого запускается чекпоинт
checkpoint_completion_target = 0.9  растягивать процесс записи чекпоинта на 90% времени, чтобы не грузить диск скачками

random_page_cost = 1.1              стоимость случайного чтения, для SSD - 1.1 (почти равно последовательному чтению 1.0)
effective_io_concurrency = 200      количество одновременных операций ввода-вывода, для SSD - 200

logging_collector = on              включить перехват логов в файлы
log_directory = 'pg_log'            директория куда будут падать файлы логов
log_filename = 'postgresql-%a.log'  имя файла лога
log_rotation_age = 1d               создавать новый файл лога каждые 24 часа
log_min_duration_statement = 1000   записывать в лог все SQL-запросы, которые выполнялись дольше 1000 мс (1 сек).
log_checkpoints = on                записывать в лог информацию о чекпоинтах
log_lock_waits = on                 записывать в лог сессии, которые долго ждут освобождения блокировки

autovacuum = on                     включить автоматическую очистку мусора
autovacuum_max_workers = 3          количество параллельных процессов автовакуума
autovacuum_naptime = 1min           как часто демон автовакуума просыпается и проверяет таблицы
autovacuum_vacuum_scale_factor = 0.05   процент измененных строк (5%), после которого таблица ставится в очередь на очистку
autovacuum_analyze_scale_factor = 0.02  процент измененных строк (2%), после которого обновляется статистика планировщика

pg_hba.conf

TYPE
    local       подключение через Unix-domain socket. Это когда вы пишете psql прямо на сервере без флага -h, самый быстрый способ
    host        подключение через TCP/IP. Работает и для SSL, и для обычного соединения
    hostssl     только зашифрованные (SSL) TCP подключения. Если клиент не умеет SSL - его не пустят
    hostnossl   только незашифрованные TCP подключения. (Редко используется, обычно для отладки)

DATABASE
    all                 ко всем базам данных
    postgres, my_db     конкретное имя базы
    replication         специальное ключевое слово для подключения репликации (WAL streaming)
    samerole            пользователь может подключиться к базе, только если её имя совпадает с его именем
    @filename           можно вынести список баз в отдельный файл

USER
    all                     любой пользователь
    postgres, app_user      конкретное имя пользователя
    +group_name             любой пользователь, входящий в эту группу (роль). Плюс обязателен

ADDRESS
    Заполняется только для типов host....
    IPv4 CIDR: 127.0.0.1/32 (только один IP), 192.168.1.0/24 (вся подсеть).
    IPv6 CIDR: ::1/128 (localhost).
    all         вообще любой IP (0.0.0.0/0).
    hostname    example.com. Не рекомендуется использовать, так как требует DNS-запросов при каждом коннекте (медленно и зависит от DNS-сервера).

METHOD
    trust           Пустить без вопросов. Пароль не нужен. Опасно для сети, нормально для local на машине разработчика.
    reject          Отказать сразу. Полезно для бана конкретных IP.
    scram-sha-256   Стандарт. Самый безопасный метод передачи пароля (Challenge-Response). Пароль не летает по сети.
    md5             Старый стандарт. Хранит хеш MD5. Используй только для совместимости с очень старыми клиентами.
    password        Передает пароль открытым текстом. Использовать только внутри SSL-туннеля, иначе сниффер украдет пароль.
    peer            Работает только для local. Берет имя пользователя операционной системы и пускает, если оно совпадает с именем пользователя БД. Пароль не нужен.
    ident           То же, что peer, но для TCP. Спрашивает у Ident-сервера (порт 113) на машине клиента "кто это?"
    cert            Аутентификация по SSL-сертификату клиента. Пароль не нужен, нужен файл сертификата
    ldap / radius / pam     Для интеграции с корпоративными системами (Active Directory и т.д.)


# TYPE  DATABASE        USER            ADDRESS                 METHOD          [OPTIONS]
host    all             all             192.168.1.0/24          scram-sha-256
# 1. Админ базы (postgres) заходит из консоли сервера без пароля
local   all             postgres                                peer
# 2. Локальные сервисы (cron, скрипты) через сокет - по паролю
local   all             all                                     scram-sha-256
# 3. Приложения с этого же сервера через TCP (127.0.0.1)
host    all             all             127.0.0.1/32            scram-sha-256
host    all             all             ::1/128                 scram-sha-256
# 4. Доступ из офисной подсети (только SSL!)
hostssl all             all             192.168.1.0/24          scram-sha-256
# 5. Репликация (только для спец. пользователя replicator из конкретной подсети)
host    replication     replicator      10.0.0.0/8              scram-sha-256