VPS для PostgreSQL: установка и тюнинг под нагрузку
PostgreSQL — самая популярная открытая СУБД для серьёзных проектов. Разберём установку из официального репозитория, базовый тюнинг под объём памяти, безопасный доступ по сети и первый бэкап. Всё рабочими командами для Ubuntu.
Содержание
Почему PostgreSQL требователен к диску
['PostgreSQL — транзакционная СУБД, и почти каждая запись сопровождается синхронной записью в WAL (журнал упреждающей записи). Скорость этих fsync напрямую определяет, сколько транзакций в секунду вы получите. На медленном диске сервер упирается в I/O задолго до того, как закончится CPU.', 'Именно поэтому для базы критичны не гигагерцы, а IOPS и латентность диска. На SATA-SSD и тем более на сетевых томах задержка fsync легко становится узким местом. NVMe даёт на порядок больше операций в секунду и низкую задержку — база дышит свободно.', '- WAL и fsync — каждый commit пишет на диск, важна латентность.
- IOPS важнее частоты CPU — база чаще ждёт диск, чем считает.
- RAM под кэш — горячие страницы должны жить в памяти.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.
Арендовать VPS для PostgreSQLУстановка из официального репозитория
['В репозитории Ubuntu часто устаревшая версия. Подключим официальный APT-репозиторий PostgreSQL и поставим свежую мажорную версию (например 16).', 'sudo apt update && sudo apt install -y curl ca-certificates\nsudo install -d /usr/share/postgresql-common/pgdg\ncurl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | \\\n sudo gpg --dearmor -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.gpg\necho "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.gpg] https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | \\\n sudo tee /etc/apt/sources.list.d/pgdg.list\nsudo apt update && sudo apt install -y postgresql-16', 'Проверим, что сервис поднялся, и зайдём в psql под системным пользователем postgres:', 'sudo systemctl status postgresql\nsudo -u postgres psql -c "SELECT version();"']
Создание базы и пользователя
['Не работайте под суперпользователем postgres из приложения. Заведём отдельную роль и базу под проект, выдав права только на неё.', "sudo -u postgres psql <<'SQL'\nCREATE ROLE appuser WITH LOGIN PASSWORD 'strong_password_here';\nCREATE DATABASE appdb OWNER appuser;\nGRANT ALL PRIVILEGES ON DATABASE appdb TO appuser;\nSQL", 'Проверить подключение новой ролью можно так — пароль запросит интерактивно:', 'psql -h 127.0.0.1 -U appuser -d appdb -W']
Базовый тюнинг под объём RAM
['Дефолтный конфиг PostgreSQL рассчитан на слабое железо и почти всегда недоиспользует память. Основные параметры правятся в postgresql.conf. Ориентиры для сервера с 4 ГБ RAM под выделенную БД:', '# /etc/postgresql/16/main/postgresql.conf\nshared_buffers = 1GB # ~25% RAM\neffective_cache_size = 3GB # ~75% RAM, подсказка планировщику\nwork_mem = 32MB # на операцию сортировки/хеша\nmaintenance_work_mem = 256MB # для VACUUM и CREATE INDEX\nwal_buffers = 16MB\nmax_connections = 100\nrandom_page_cost = 1.1 # для SSD/NVMe, а не 4.0 как для HDD', 'Параметр random_page_cost = 1.1 особенно важен на NVMe: он говорит планировщику, что случайное чтение почти так же дёшево, как последовательное, и тот охотнее использует индексы. После правок перезапускаем сервер.', 'sudo systemctl restart postgresql', 'Не завышайте work_mem бездумно: он выделяется на каждую сортировку каждого соединения, поэтому пиковое потребление = work_mem × число параллельных операций. При 100 коннектах агрессивный work_mem легко приводит к OOM.']
Доступ по сети и автовакуум
['По умолчанию PostgreSQL слушает только localhost — это безопасно. Если к базе ходит приложение с другого сервера, откройте прослушивание и явно разрешите подсеть в pg_hba.conf, не открывая базу всему интернету.', "# postgresql.conf\nlisten_addresses = 'localhost,10.0.0.5'\n\n# pg_hba.conf — доступ только из доверенной подсети по паролю\nhost appdb appuser 10.0.0.0/24 scram-sha-256", 'Автовакуум держит таблицы в форме, убирая мёртвые строки после UPDATE/DELETE. Выключать его нельзя, но под нагрузкой полезно сделать агрессивнее, чтобы не пухли таблицы и не тормозили запросы.', '# postgresql.conf\nautovacuum = on\nautovacuum_vacuum_scale_factor = 0.05\nautovacuum_naptime = 30s']
Бэкап и выбор сервера
['Логический бэкап всей базы делается pg_dump — его удобно класть в крон. Для восстановления просто прогоняете дамп обратно через psql.', '# бэкап со сжатием\npg_dump -U appuser -Fc appdb > /var/backups/appdb_$(date +%F).dump\n# восстановление\npg_restore -U appuser -d appdb --clean /var/backups/appdb_2026-01-01.dump', 'Под PostgreSQL берите сервер с быстрым диском: производительность БД почти всегда упирается в I/O. На тарифах MAATRIX это AMD EPYC + NVMe — высокие IOPS и низкая латентность fsync дают ощутимо больше транзакций в секунду, чем сетевые тома у многих провайдеров. Ежедневные бэкапы MAATRIX страхуют данные, локации UK/США дают низкий пинг, а оплата картой РФ, СБП, криптой или токеном MAAT удобна, когда зарубежные хостеры карты не принимают.', '- Дефолтный конфиг — база не видит вашу RAM, работает медленно.
- Доступ 0.0.0.0/0 в pg_hba — база открыта всему интернету, брутфорс паролей.
- Отключённый автовакуум — распухание таблиц и деградация скорости.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.
Арендовать VPS для PostgreSQLЧастые вопросы
Сколько RAM нужно PostgreSQL?
Зависит от размера рабочего набора. Для небольших проектов хватает 2 ГБ, для нагруженных берут столько, чтобы горячие данные и индексы помещались в память под кэш.
Чем pg_dump отличается от physical backup?
pg_dump делает логический дамп (SQL или архив), удобный для переноса между версиями. Physical backup (pg_basebackup + WAL) быстрее восстанавливается и нужен для PITR на больших базах.
Почему база тормозит на дешёвом VPS?
Чаще всего из-за медленного диска: синхронная запись WAL упирается в низкие IOPS. NVMe-хранилище и достаточный объём RAM под кэш решают проблему.