Мини-гайд по трём ключевым сущностям PostgreSQL: соединения, буфер и WAL

GuDron

dumpz.ws
Admin
Регистрация
28 Янв 2020
Сообщения
9,739
Реакции
1,556
Credits
34,581
Мини-гайд по трём ключевым сущностям PostgreSQL: соединения, буфер и WAL

1. Соединения (Connections)
PostgreSQL по умолчанию позволяет одновременно до 100 соединений (max_connections).
Проблема: слишком много прямых соединений создают нагрузку на память и CPU.
Решение: используйте пуллинг через PgBouncer или Pgpool-II.
INI:
  [databases]
  mydb = host=127.0.0.1 port=5432 dbname=mydb

  [pgbouncer]
  listen_addr = 0.0.0.0
  listen_port = 6432
  pool_mode = transaction
  max_client_conn = 500
  default_pool_size = 20
Совет: на проде стремитесь держать max_connections < 200 и масштабируйте через пуллер.


2. Буфер (Shared Buffers & Work Mem)
PostgreSQL активно использует память для кэширования страниц и сортировок.
shared_buffers – основной буфер кэша:
Код:
shared_buffers = 4GB        # ≈25% от RAM на выделенном сервере
work_mem – память на сортировку/слияние одного потока:
Код:
work_mem = 64MB             # для сложных запросов с сортировками и хэш-джоинами
maintenance_work_mem = 512MB # для VACUUM/CREATE INDEX
Best practice:
Установите shared_buffers ≈ 25% RAM.
Настройте work_mem исходя из числа параллельных операций, не превышайте общий объём памяти.


3. WAL (Write-Ahead Log)

WAL обеспечивает надёжность и репликацию.
wal_level – детальность логирования:
Код:
wal_level = replica       # для потоковой репликации
checkpoint_timeout и max_wal_size:
Код:
checkpoint_timeout = 10min
max_wal_size = 1GB
Архивация WAL для резервных копий:
Bash:
archive_mode = on
archive_command = 'cp %p /mnt/backup/wal/%f'

Рекомендации:
Увеличьте max_wal_size, если у вас большие всплески нагрузки.
Настройте сжатие WAL (pg_wal) для экономии места.