PostgreSQL на VPS: Архітектура, Налаштування Продуктивності та Посібник з Розгортання
PostgreSQL — це вдосконалена об’єктно-реляційна система управління базами даних (ORDBMS) з відкритим вихідним кодом, яка підтримує запити SQL та JSON, ACID-сумісні транзакції та розширювані типи даних. При розгортанні на Віртуальному Приватному Сервері вона отримує виділені обчислювальні ресурси, повний доступ до конфігурації на рівні ядра та мережеву ізоляцію — можливості, які спільний хостинг принципово не може забезпечити.
Для виробничих навантажень ця комбінація має негайне значення: неправильно налаштоване значення shared_buffers на спільному хостингу неможливо виправити, нестримний запит на сусідньому екземплярі може виснажити ваш I/O, і ви не можете встановити розширення на кшталт PostGIS або pg_partman без root-доступу. VPS усуває всі три обмеження одночасно.
Чому PostgreSQL перевершує інші варіанти RDBMS з відкритим вихідним кодом
Перш ніж розглядати переваги, специфічні для VPS, варто зрозуміти, що робить PostgreSQL обраним рушієм порівняно з MySQL/MariaDB для складних навантажень.
| Функція | PostgreSQL | MySQL 8.x | MariaDB 10.x |
|---|---|---|---|
| ACID-сумісність | Повна, включаючи DDL | Повна | Повна |
| Індексування JSON/JSONB | Нативний JSONB з GIN-індексами | JSON (без бінарного зберігання) | JSON (без бінарного зберігання) |
| Геопросторова підтримка | PostGIS (галузевий стандарт) | Обмежені просторові типи | Обмежені просторові типи |
| Повнотекстовий пошук | Вбудований, налаштовуваний | Базовий FULLTEXT-індекс | Базовий FULLTEXT-індекс |
| Партиціонування таблиць | Декларативне, діапазон/список/хеш | Партиціонування підтримується | Партиціонування підтримується |
| Паралельне виконання запитів | Так (налаштовувані воркери) | Обмежено | Обмежено |
| Користувацькі типи даних | Так (CREATE TYPE) | Ні | Ні |
| Збережені процедури (PL/pgSQL) | Повна процедурна мова | Базові | Базові |
| Журналювання з випередженням запису (WAL) | Налаштовуване, потокова реплікація | Бінарний журнал | Бінарний журнал |
| Модель паралельного доступу | MVCC (без блокувань читання) | MVCC | MVCC |
| Логічна реплікація | Так (публікація/підписка) | Так | Так |
| Обгортки зовнішніх даних | Так (postgres_fdw тощо) | Ні | Ні |
Модель Multi-Version Concurrency Control (MVCC) PostgreSQL заслуговує на особливу увагу: читачі ніколи не блокують записувачів, а записувачі ніколи не блокують читачів. Це архітектурно перевершує змішані навантаження OLTP/OLAP, де тривалі аналітичні запити інакше блокували б транзакційні таблиці.
Економічна ефективність: розподіл ресурсів без надмірного виділення
Тарифний план VPS Хостинг надає гарантовані CPU-ядра, RAM та NVMe SSD-сховище за частку вартості фізичного обладнання. Економічна логіка проста: вимоги PostgreSQL до пам’яті масштабуються з max_connections та work_mem, а не з розміром сервера. Правильно налаштований VPS з 4 GB RAM, що обслуговує 50 одночасних підключень, перевершить екземпляр з 8 GB RAM із налаштуваннями за замовчуванням та 200 неактивними підключеннями, що споживають спільну пам’ять.
Практична стратегія економічної ефективності — почати з VPS середнього рівня, проаналізувати фактичні метрики pg_stat_activity та pg_stat_bgwriter після двох тижнів виробничого навантаження, а потім масштабувати вертикально. Такий підхід на основі даних запобігає поширеній помилці надмірного виділення ресурсів під час запуску.
Один часто недооцінений фактор витрат: демон autovacuum PostgreSQL потребує резерву CPU. На спільному хостингу autovacuum часто обмежується провайдером, що спричиняє роздування таблиць та погіршення планів запитів з часом. На VPS ви безпосередньо керуєте autovacuum_vacuum_cost_delay та autovacuum_max_workers.
Повний root-доступ та контроль середовища
На відміну від керованих служб баз даних або Спільного Веб-Хостингу, VPS надає необмежений доступ до рівня операційної системи. Це не просто зручність — це жорстка вимога для кількох можливостей PostgreSQL.
Що дає root-доступ, що блокують спільні середовища:
- Встановлення розширень PostgreSQL (
CREATE EXTENSION postgis,CREATE EXTENSION pg_trgm,CREATE EXTENSION timescaledb) - Зміна параметрів ядра, що безпосередньо впливають на продуктивність PostgreSQL (
vm.overcommit_memory,vm.swappiness,huge_pages) - Налаштування
pg_hba.confз користувацькими методами автентифікації (SCRAM-SHA-256, LDAP, автентифікація на основі сертифікатів) - Запуск
pg_upgradeдля міграцій між основними версіями без втручання провайдера - Монтування виділених томів табличного простору на окремих блочних пристроях для розділення I/O між індексами та heap-файлами
Критичне налаштування ядра для PostgreSQL на Linux:
# Disable transparent huge pages (causes latency spikes in PostgreSQL)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# Set vm.overcommit_memory to allow PostgreSQL shared memory allocation
sysctl -w vm.overcommit_memory=2
sysctl -w vm.overcommit_ratio=80
# Reduce swappiness to prevent paging PostgreSQL shared buffers
sysctl -w vm.swappiness=1
# Persist these settings
echo "vm.overcommit_memory=2" >> /etc/sysctl.conf
echo "vm.overcommit_ratio=80" >> /etc/sysctl.conf
echo "vm.swappiness=1" >> /etc/sysctl.confЦі налаштування недоступні для керованих служб баз даних на рівні застосунків і часто є першопричиною незрозумілого погіршення продуктивності в хмарних екземплярах PostgreSQL.
Налаштування продуктивності: параметри postgresql.conf, які дійсно мають значення
Параметри встановлення PostgreSQL за замовчуванням навмисно консервативні — вони розроблені для роботи на машині з 256 MB RAM початку 2000-х років. На сучасному VPS з 4–16 GB RAM та NVMe-сховищем налаштування за замовчуванням залишають більшість апаратних можливостей невикористаними.
Конфігурація пам’яті
# postgresql.conf — tuned for a 8 GB RAM VPS, OLTP workload
# Set to 25% of total RAM
shared_buffers = 2GB
# Estimate of OS cache available to PostgreSQL (typically 50-75% of RAM)
effective_cache_size = 6GB
# Per-sort/hash operation memory (multiply by max_connections for worst case)
work_mem = 32MB
# For VACUUM, CREATE INDEX, ALTER TABLE operations
maintenance_work_mem = 512MB
# Enable huge pages if kernel supports it
huge_pages = tryПастка work_mem: Встановлення work_mem = 256MB з max_connections = 100 означає, що PostgreSQL теоретично може виділити 25,6 GB RAM лише для операцій сортування — що значно перевищує фізичну пам’ять і спричиняє завершення процесів через OOM. Завжди розраховуйте work_mem як: (available_RAM - shared_buffers) / (max_connections * 2).
Конфігурація сховища та WAL
# For NVMe SSD storage — set to 1 for spinning disks, 200 for NVMe
random_page_cost = 1.1
effective_io_concurrency = 200
# WAL configuration for durability vs. performance tradeoff
wal_buffers = 64MB
checkpoint_completion_target = 0.9
checkpoint_timeout = 10min
# For write-heavy workloads, consider asynchronous commit
# (risk: last ~1 transaction lost on crash, not data corruption)
synchronous_commit = on # Keep 'on' for financial dataУправління підключеннями
# Avoid setting this above what your application actually needs
max_connections = 100
# Use PgBouncer in transaction pooling mode for high-concurrency apps
# A VPS allows you to install and configure PgBouncer locallyPgBouncer не є опціональним для застосунків з більш ніж 50 одночасними користувачами. Кожен фоновий процес PostgreSQL споживає приблизно 5–10 MB RAM. При 200 підключеннях це 1–2 GB, що споживаються неактивними процесами. PgBouncer у режимі пулінгу транзакцій мультиплексує сотні підключень застосунків на невеликий пул фактичних бекендів PostgreSQL.
# Install PgBouncer on Debian/Ubuntu
apt install pgbouncer
# Minimal pgbouncer.ini configuration
cat /etc/pgbouncer/pgbouncer.ini[databases]
mydb = host=127.0.0.1 port=5432 dbname=mydb
[pgbouncer]
listen_port = 6432
listen_addr = 127.0.0.1
auth_type = scram-sha-256
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = transaction
max_client_conn = 1000
default_pool_size = 20Посилення безпеки: за межами стандартного встановлення
Свіже встановлення PostgreSQL на VPS має кілька прогалин у безпеці, які необхідно усунути до того, як екземпляр стане доступним з мережі.
Ізоляція на мережевому рівні
PostgreSQL ніколи не повинен прослуховувати публічну IP-адресу, якщо це не є абсолютно необхідним. Прив’яжіть його до localhost і використовуйте SSH-тунелювання або VPN для віддаленого адміністрування.
# In postgresql.conf
listen_addresses = 'localhost'
# For replication or application servers on a private network only
# listen_addresses = '127.0.0.1,10.0.0.1'Налаштуйте pg_hba.conf для застосування автентифікації SCRAM-SHA-256 (стандартний md5 є криптографічно слабким):
# /etc/postgresql/16/main/pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
local all postgres peer
local all all scram-sha-256
host all all 127.0.0.1/32 scram-sha-256
host all all ::1/128 scram-sha-256
# Reject all other connections by default (no catch-all line)SSL/TLS-шифрування для віддалених підключень
Якщо ваш сервер застосунків підключається до PostgreSQL через мережу, шифрування підключення є обов’язковим. Поєднайте це з SSL-сертифікатом для рівня вашого застосунку та налаштуйте власний TLS-стек PostgreSQL:
# Generate a self-signed certificate for internal use
openssl req -new -x509 -days 365 -nodes
-out /etc/postgresql/16/main/server.crt
-keyout /etc/postgresql/16/main/server.key
chmod 600 /etc/postgresql/16/main/server.key
chown postgres:postgres /etc/postgresql/16/main/server.{crt,key}# postgresql.conf
ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_min_protocol_version = 'TLSv1.2'Контроль доступу на основі ролей
Принцип найменших привілеїв суворо застосовується до ролей бази даних:
-- Create an application role with minimal permissions
CREATE ROLE app_user WITH LOGIN PASSWORD 'strong_password_here';
GRANT CONNECT ON DATABASE mydb TO app_user;
GRANT USAGE ON SCHEMA public TO app_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user;
-- Create a read-only analytics role
CREATE ROLE analytics_reader WITH LOGIN PASSWORD 'another_strong_password';
GRANT CONNECT ON DATABASE mydb TO analytics_reader;
GRANT USAGE ON SCHEMA public TO analytics_reader;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO analytics_reader;
-- Never use the superuser 'postgres' role for application connectionsПравила брандмауера
# Allow PostgreSQL only from specific application server IP
ufw allow from 10.0.0.5 to any port 5432
ufw deny 5432
# Verify
ufw status verboseАрхітектура резервного копіювання та відновлення
PostgreSQL надає два принципово різних механізми резервного копіювання, кожен з яких підходить для різних цілей відновлення.
| Метод резервного копіювання | Інструмент | Тип відновлення | RPO | RTO | Варіант використання |
|---|---|---|---|---|---|
| Логічне резервне копіювання | pg_dump / pg_dumpall | Відновлення на рівні об’єктів | Години | Середнє | Міграції схем, вибіркове відновлення таблиць |
| Фізичне резервне копіювання | pg_basebackup | Повне відновлення кластера | Хвилини (з WAL) | Швидке | Аварійне відновлення, створення резервного сервера |
| Безперервне архівування | Архівування WAL + pg_basebackup | Відновлення до певного моменту часу | Секунди | Залежить від обсягу WAL | Вимога нульової втрати даних |
| Знімок | Знімок провайдера VPS | Повне відновлення сервера | На момент створення знімка | Швидке | Страховка перед оновленням |
Логічне резервне копіювання зі стисненням:
# Dump a single database in custom format (supports parallel restore)
pg_dump -U postgres -Fc -Z 9 mydb > /backup/mydb_$(date +%Y%m%d).dump
# Restore
pg_restore -U postgres -d mydb_restored /backup/mydb_20240115.dump
# Dump all databases including roles and tablespaces
pg_dumpall -U postgres | gzip > /backup/full_cluster_$(date +%Y%m%d).sql.gzФізичне резервне копіювання для аварійного відновлення:
# Take a base backup (can run while PostgreSQL is live)
pg_basebackup -U replication_user -D /backup/base -Ft -z -Xs -P
# This creates base.tar.gz and pg_wal.tar.gz
# Combined with WAL archiving, enables point-in-time recoveryАвтоматизація за допомогою cron:
# /etc/cron.d/postgres-backup
0 2 * * * postgres pg_dump -Fc mydb > /backup/mydb_$(date +%Y%m%d_%H%M).dump
0 3 * * 0 postgres pg_dumpall | gzip > /backup/full_$(date +%Y%m%d).sql.gz
# Prune backups older than 30 days
0 4 * * * root find /backup/ -name "*.dump" -mtime +30 -deleteМасштабованість: вертикальне, горизонтальне масштабування та масштабування читання
Вертикальне масштабування
На VPS вертикальне масштабування (додавання CPU, RAM, сховища) зазвичай є операцією в режимі реального часу або вимагає лише короткого перезапуску. Після збільшення RAM пропорційно оновіть shared_buffers, effective_cache_size та work_mem. Після додавання CPU-ядер збільшіть max_parallel_workers_per_gather та max_parallel_maintenance_workers.
# After upgrading from 4 to 8 CPU cores
max_parallel_workers_per_gather = 4
max_parallel_maintenance_workers = 2
max_parallel_workers = 8Потокова реплікація для масштабування читання
Вбудована потокова реплікація PostgreSQL створює гарячий резервний сервер, який може обслуговувати запити на читання, розвантажуючи аналітичні навантаження з основного сервера:
# On primary: create replication user
psql -U postgres -c "CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'rep_password';"
# In pg_hba.conf on primary
# host replication replicator 10.0.0.2/32 scram-sha-256
# In postgresql.conf on primary
# wal_level = replica
# max_wal_senders = 3
# wal_keep_size = 1GB# On standby: initialize from primary
pg_basebackup -h 10.0.0.1 -U replicator -D /var/lib/postgresql/16/main
-P -Xs -R
# The -R flag creates standby.signal and populates primary_conninfo automaticallyЛогічна реплікація для вибіркової реплікації
Логічна реплікація дозволяє реплікувати певні таблиці на інший екземпляр PostgreSQL, що корисно для конвеєрів сховищ даних:
-- On publisher
CREATE PUBLICATION analytics_pub FOR TABLE orders, customers, products;
-- On subscriber
CREATE SUBSCRIPTION analytics_sub
CONNECTION 'host=10.0.0.1 dbname=mydb user=replicator password=rep_password'
PUBLICATION analytics_pub;Для застосунків, що потребують Виділеного Сервера для основної бази даних з репліками VPS, що обробляють трафік читання, ця архітектура забезпечує як продуктивність, так і економічну ефективність.
Розширені функції PostgreSQL, які варто увімкнути
JSONB для гібридних реляційних/документних навантажень
-- Create a table with JSONB column
CREATE TABLE events (
id BIGSERIAL PRIMARY KEY,
occurred_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
payload JSONB NOT NULL
);
-- Create a GIN index for fast JSONB queries
CREATE INDEX idx_events_payload ON events USING GIN (payload);
-- Query nested JSON efficiently
SELECT * FROM events
WHERE payload @> '{"type": "purchase", "currency": "USD"}';
-- Extract and index a specific JSON key
CREATE INDEX idx_events_user_id ON events ((payload->>'user_id'));Партиціонування таблиць для великих наборів даних
-- Range partitioning by month (ideal for time-series data)
CREATE TABLE measurements (
id BIGSERIAL,
recorded_at TIMESTAMPTZ NOT NULL,
sensor_id INT,
value NUMERIC
) PARTITION BY RANGE (recorded_at);
CREATE TABLE measurements_2024_01
PARTITION OF measurements
FOR VALUES FROM ('2024-01-01') TO ('2024-02-01');
CREATE TABLE measurements_2024_02
PARTITION OF measurements
FOR VALUES FROM ('2024-02-01') TO ('2024-03-01');
-- PostgreSQL automatically routes inserts and prunes partitions in queriesPostGIS для геопросторових застосунків
# Install PostGIS extension
apt install postgresql-16-postgis-3
# Enable in database
psql -U postgres -d mydb -c "CREATE EXTENSION postgis;"-- Store and query geographic coordinates
CREATE TABLE locations (
id SERIAL PRIMARY KEY,
name TEXT,
geom GEOMETRY(Point, 4326)
);
-- Find all locations within 10km of a point
SELECT name, ST_Distance(geom::geography, ST_MakePoint(-73.935242, 40.730610)::geography) AS distance_m
FROM locations
WHERE ST_DWithin(geom::geography, ST_MakePoint(-73.935242, 40.730610)::geography, 10000)
ORDER BY distance_m;Моніторинг: стек спостережуваності для виробничого PostgreSQL
Реактивне усунення несправностей є недостатнім для виробничих баз даних. Проактивний стек спостережуваності виявляє деградацію до того, як вона стає збоєм.
Вбудовані статистичні представлення PostgreSQL
-- Identify slow queries (requires pg_stat_statements extension)
CREATE EXTENSION pg_stat_statements;
SELECT query, calls, total_exec_time / calls AS avg_ms,
rows / calls AS avg_rows
FROM pg_stat_statements
ORDER BY avg_ms DESC
LIMIT 20;
-- Check for table bloat and vacuum status
SELECT schemaname, relname, n_dead_tup, last_autovacuum, last_autoanalyze
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;
-- Monitor replication lag
SELECT client_addr, state, sent_lsn, write_lsn, flush_lsn, replay_lsn,
(sent_lsn - replay_lsn) AS replication_lag_bytes
FROM pg_stat_replication;
-- Find long-running queries
SELECT pid, now() - pg_stat_activity.query_start AS duration, query, state
FROM pg_stat_activity
WHERE (now() - pg_stat_activity.query_start) > interval '5 minutes';Стек Prometheus + postgres_exporter
# Install postgres_exporter
wget https://github.com/prometheus-community/postgres_exporter/releases/download/v0.15.0/postgres_exporter-0.15.0.linux-amd64.tar.gz
tar xzf postgres_exporter-0.15.0.linux-amd64.tar.gz
mv postgres_exporter-0.15.0.linux-amd64/postgres_exporter /usr/local/bin/
# Create a monitoring role in PostgreSQL
psql -U postgres -c "CREATE ROLE postgres_exporter WITH LOGIN PASSWORD 'monitor_pass';"
psql -U postgres -c "GRANT pg_monitor TO postgres_exporter;"
# Run the exporter
export DATA_SOURCE_NAME="postgresql://postgres_exporter:monitor_pass@localhost:5432/postgres?sslmode=disable"
postgres_exporter --web.listen-address=":9187"Поєднайте postgres_exporter з дашбордом Grafana (ID дашборду 9628 з grafana.com охоплює всі критичні метрики PostgreSQL) та налаштуйте сповіщення для: затримки реплікації, що перевищує 30 секунд, наближення до вичерпання ідентифікаторів транзакцій, падіння коефіцієнта влучень кешу нижче 95% та кількості мертвих кортежів, що перевищує 10% від живих кортежів.
Матриця варіантів використання: відповідність конфігурації PostgreSQL навантаженню
| Навантаження | Ключові параметри | Розширення | Стратегія масштабування |
|---|---|---|---|
| OLTP (електронна комерція, SaaS) | Низький work_mem, PgBouncer, synchronous_commit=on | pg_stat_statements, pgcrypto | Вертикальне + репліки для читання |
| Аналітика / OLAP | Високий work_mem, паралельні воркери, synchronous_commit=off | pg_partman, tablefunc | Партиціонування + стовпчасте сховище |
| Часові ряди IoT | Партиціонування за часом, налаштування autovacuum | TimescaleDB, pg_partman | Відсікання партицій + стиснення |
| Геопросторові / GIS | Просторові індекси, effective_io_concurrency | PostGIS, pg_routing | Виділений сервер для великих наборів даних |
| API-бекенд (JSON) | GIN-індекси на JSONB, work_mem для агрегацій | pg_trgm, uuid-ossp | Репліки для читання для API з переважанням GET-запитів |
| Повнотекстовий пошук | Стовпці tsvector, GIN-індекси | pg_trgm, unaccent | Сканування лише за індексом, часткові індекси |
Для команд, що створюють API-бекенди або веб-застосунки, поєднання PostgreSQL з VPS з cPanel надає керовану панель управління разом із повною гнучкістю бази даних. Для команд з інфраструктури, які надають перевагу управлінню через CLI, Панелі управління VPS пропонують ширший вибір варіантів панелей.
Практичний контрольний список перед розгортанням PostgreSQL на VPS
Розмір апаратного забезпечення:
- Розрахуйте
shared_buffersяк 25% від загального обсягу RAM - Переконайтеся в наявності NVMe SSD-сховища — записи WAL PostgreSQL чутливі до затримок
- Виділіть щонайменше 2 виділених CPU-ядра для виробничих навантажень
Базовий рівень безпеки:
- Прив’яжіть
listen_addressesлише до приватного/localhost - Замініть
md5наscram-sha-256уpg_hba.conf - Увімкніть SSL з мінімальним TLS 1.2 для будь-яких віддалених підключень
- Створіть ролі, специфічні для застосунку — ніколи не використовуйте суперкористувача
postgresв коді застосунку - Налаштуйте
ufwабоiptablesдля дозволу лише відомих вихідних IP-адрес на порту 5432
Базовий рівень продуктивності:
- Вимкніть прозорі великі сторінки на рівні ОС
- Встановіть
vm.swappiness=1для запобігання вивантаженню спільних буферів - Встановіть та налаштуйте PgBouncer, якщо кількість підключень перевищує 50
- Увімкніть
pg_stat_statementsз першого дня — ретроактивне профілювання запитів неможливе
Резервне копіювання та відновлення:
- Автоматизуйте
pg_dumpза допомогою cron, щомісяця перевіряйте відновлення - Впровадьте архівування WAL, якщо вимоги до RPO становлять менше 1 години
- Поєднуйте резервні копії на рівні застосунку зі знімками провайдера VPS для багаторівневого захисту
Спостережуваність:
- Розгорніть
postgres_exporter+ Prometheus + Grafana до запуску в продуктивне середовище - Налаштуйте сповіщення про затримку реплікації, вік ідентифікатора транзакції та коефіцієнт влучень кешу
- Щотижня переглядайте
pg_stat_bgwriterдля виявлення тиску на контрольні точки
FAQ
Яку версію PostgreSQL слід встановити на новий VPS?
Завжди встановлюйте останній стабільний основний реліз (PostgreSQL 16 станом на 2024 рік) з офіційного репозиторію PGDG, а не версію, що постачається з вашим дистрибутивом Linux. Пакети дистрибутивів часто відстають на 1–2 основні версії та не отримують бекпортів функцій від розробників. Використовуйте apt.postgresql.org або yum.postgresql.org для встановлення.
Скільки RAM насправді потрібно VPS з PostgreSQL?
Для невеликого виробничого застосунку з менш ніж 50 одночасними підключеннями та набором даних до 50 GB, 4 GB RAM є практичним мінімумом. Встановіть shared_buffers = 1GB, work_mem = 16MB та використовуйте PgBouncer. Для наборів даних, що перевищують доступну RAM, зосередьтеся на покритті індексами та оптимізації плану запитів перед додаванням апаратного забезпечення — відсутній індекс на таблиці 100 GB не буде вирішено додаванням RAM.
Чи безпечно запускати PostgreSQL та застосунок на одному VPS?
Так, для малих та середніх навантажень. Ризик полягає у конкуренції за ресурси: стрибок пам’яті в застосунку може спричинити завершення процесів через OOM, що призведе до зупинки PostgreSQL. Пом’якшіть це, встановивши oom_score_adj PostgreSQL на від’ємне значення (роблячи його менш імовірним для завершення) та використовуючи cgroups для обмеження максимального обсягу пам’яті застосунку.
У чому різниця між pg_dump та pg_basebackup?
pg_dump створює логічну резервну копію однієї бази даних — він експортує SQL-оператори або користувацький бінарний формат, який можна відновити вибірково (окремі таблиці, схеми). pg_basebackup копіює весь каталог даних PostgreSQL на бінарному рівні, створюючи повну резервну копію кластера, придатну для аварійного відновлення та ініціалізації резервного сервера. Використовуйте обидва: pg_dump для детального відновлення, pg_basebackup для сценаріїв повного відновлення.
Як безпечно оновити PostgreSQL до нової основної версії на VPS?
Спочатку використовуйте pg_upgrade з прапором --check для перевірки сумісності без внесення змін. Перед продовженням зробіть повну резервну копію pg_basebackup. Саме оновлення виконується в автономному режимі (PostgreSQL має бути зупинений). Для оновлення основної версії без простою використовуйте логічну реплікацію: налаштуйте новий екземпляр PostgreSQL 16 як логічного підписника до основного PostgreSQL 15, дочекайтеся його синхронізації, а потім виконайте скоординоване перемикання з мінімальним простоєм.
