PostgreSQL pe un VPS: Ghid de Arhitectură, Optimizare a Performanței și Implementare
PostgreSQL este un sistem avansat de gestionare a bazelor de date relaționale orientate pe obiecte (ORDBMS), open-source, care suportă atât interogări SQL, cât și JSON, tranzacții conforme ACID și tipuri de date extensibile. Atunci când este implementat pe un Server Privat Virtual, beneficiază de resurse de calcul dedicate, acces complet la configurare la nivel de kernel și izolare de rețea — capabilități pe care găzduirea partajată nu le poate oferi în mod fundamental.
Pentru sarcinile de producție, această combinație contează imediat: o valoare shared_buffers configurată greșit pe găzduirea partajată nu poate fi corectată, o interogare scăpată de sub control pe instanța unui vecin poate priva I/O-ul tău de resurse, iar extensii precum PostGIS sau pg_partman nu pot fi instalate fără acces root. Un VPS elimină simultan toate cele trei constrângeri.
De ce PostgreSQL depășește alte opțiuni RDBMS open-source
Înainte de a examina avantajele specifice VPS, merită să înțelegem ce face din PostgreSQL motorul preferat față de MySQL/MariaDB pentru sarcini de lucru complexe.
| Funcționalitate | PostgreSQL | MySQL 8.x | MariaDB 10.x |
|---|---|---|---|
| Conformitate ACID | Completă, inclusiv DDL | Completă | Completă |
| Indexare JSON/JSONB | JSONB nativ cu indecși GIN | JSON (fără stocare binară) | JSON (fără stocare binară) |
| Suport geospațial | PostGIS (standard în industrie) | Tipuri spațiale limitate | Tipuri spațiale limitate |
| Căutare full-text | Integrată, configurabilă | Index FULLTEXT de bază | Index FULLTEXT de bază |
| Partiționarea tabelelor | Declarativă, range/list/hash | Partiționare suportată | Partiționare suportată |
| Execuție paralelă a interogărilor | Da (workers configurabili) | Limitată | Limitată |
| Tipuri de date personalizate | Da (CREATE TYPE) | Nu | Nu |
| Proceduri stocate (PL/pgSQL) | Limbaj procedural complet | De bază | De bază |
| Write-ahead logging (WAL) | Configurabil, replicare în flux | Jurnal binar | Jurnal binar |
| Model de concurență | MVCC (fără blocări la citire) | MVCC | MVCC |
| Replicare logică | Da (publicare/abonare) | Da | Da |
| Adaptoare de date externe | Da (postgres_fdw, etc.) | Nu | Nu |
Modelul Multi-Version Concurrency Control (MVCC) al PostgreSQL merită o mențiune specială: cititorii nu blochează niciodată scriitorii și scriitorii nu blochează niciodată cititorii. Aceasta este superioară din punct de vedere arhitectural pentru sarcinile de lucru mixte OLTP/OLAP, unde interogările analitice de lungă durată ar bloca altfel tabelele tranzacționale.
Eficiență a costurilor: Alocarea resurselor fără supraprovizionare
Un plan de Găzduire VPS oferă nuclee CPU garantate, RAM și stocare NVMe SSD la o fracțiune din costul hardware-ului bare-metal. Logica economică este simplă: cerințele de memorie ale PostgreSQL se scalează cu max_connections și work_mem, nu cu dimensiunea brută a serverului. Un VPS cu 4 GB RAM corect configurat, care deservește 50 de conexiuni simultane, va depăși performanța unei instanțe cu 8 GB RAM cu setări implicite și 200 de conexiuni inactive care consumă memorie partajată.
Strategia practică de eficiență a costurilor este să începi cu un VPS de nivel mediu, să profilezi valorile reale pg_stat_activity și pg_stat_bgwriter după două săptămâni de sarcină de producție, și apoi să scalezi vertical. Această abordare bazată pe date previne greșeala comună de supraprovizionare la lansare.
Un factor de cost adesea trecut cu vederea: daemonul autovacuum al PostgreSQL necesită spațiu de manevră CPU. Pe găzduirea partajată, autovacuum este frecvent limitat de furnizor, cauzând umflarea tabelelor și degradarea planurilor de interogare în timp. Pe un VPS, controlezi direct autovacuum_vacuum_cost_delay și autovacuum_max_workers.
Acces root complet și control al mediului
Spre deosebire de serviciile de baze de date gestionate sau Găzduirea Web Partajată, un VPS îți oferă acces nerestricționat la nivelul sistemului de operare. Aceasta nu este doar o comoditate — este o cerință strictă pentru mai multe capabilități PostgreSQL.
Ce permite accesul root și ce blochează mediile partajate:
- Instalarea extensiilor PostgreSQL (
CREATE EXTENSION postgis,CREATE EXTENSION pg_trgm,CREATE EXTENSION timescaledb) - Modificarea parametrilor kernel care afectează direct performanța PostgreSQL (
vm.overcommit_memory,vm.swappiness,huge_pages) - Configurarea
pg_hba.confcu metode de autentificare personalizate (SCRAM-SHA-256, LDAP, autentificare bazată pe certificate) - Rularea
pg_upgradepentru migrări de versiuni majore fără intervenția furnizorului - Montarea volumelor de tablespace dedicate pe dispozitive de bloc separate pentru separarea I/O între indecși și fișierele heap
Ajustare critică a kernel-ului pentru PostgreSQL pe 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.confAceste setări sunt invizibile pentru serviciile de baze de date gestionate la nivel de aplicație și sunt frecvent cauza principală a degradării inexplicabile a performanței în instanțele PostgreSQL găzduite în cloud.
Optimizarea performanței: Parametrii postgresql.conf care contează cu adevărat
Parametrii impliciți ai instalării PostgreSQL sunt intenționat conservatori — sunt proiectați să ruleze pe o mașină cu 256 MB RAM din începutul anilor 2000. Pe un VPS modern cu 4–16 GB RAM și stocare NVMe, valorile implicite lasă neutilizată majoritatea capabilităților hardware.
Configurarea memoriei
# 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 = tryCapcana work_mem: Setarea work_mem = 256MB cu max_connections = 100 înseamnă că PostgreSQL ar putea aloca teoretic 25,6 GB de RAM doar pentru operațiuni de sortare — depășind cu mult memoria fizică și declanșând terminări OOM. Calculează întotdeauna work_mem astfel: (available_RAM - shared_buffers) / (max_connections * 2).
Configurarea stocării și 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 dataGestionarea conexiunilor
# 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 nu este opțional pentru aplicațiile cu mai mult de 50 de utilizatori concurenți. Fiecare proces backend PostgreSQL consumă aproximativ 5–10 MB de RAM. La 200 de conexiuni, aceasta înseamnă 1–2 GB consumați de procese inactive. PgBouncer în modul de grupare a tranzacțiilor multiplexează sute de conexiuni ale aplicației pe un grup mic de backend-uri PostgreSQL reale.
# 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Întărirea securității: Dincolo de instalarea implicită
O instalare proaspătă a PostgreSQL pe un VPS are mai multe vulnerabilități de securitate care trebuie remediate înainte ca instanța să fie accesibilă din rețea.
Izolarea la nivel de rețea
PostgreSQL nu ar trebui să asculte niciodată pe un IP public dacă nu este absolut necesar. Leagă-l la localhost și folosește tunelarea SSH sau un VPN pentru administrare de la distanță.
# 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'Configurează pg_hba.conf pentru a impune autentificarea SCRAM-SHA-256 (valoarea implicită md5 este criptografic slabă):
# /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)Criptare SSL/TLS pentru conexiuni de la distanță
Dacă serverul tău de aplicații se conectează la PostgreSQL printr-o rețea, criptarea conexiunii este obligatorie. Combină aceasta cu un Certificat SSL pentru nivelul aplicației tale și configurează propriul stack TLS al 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'Control al accesului bazat pe roluri
Principiul privilegiului minim se aplică strict rolurilor de baze de date:
-- 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 connectionsReguli de firewall
# 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 verboseArhitectura de backup și recuperare
PostgreSQL oferă două mecanisme de backup fundamental diferite, fiecare potrivit pentru obiective de recuperare diferite.
| Metodă de backup | Instrument | Tip de recuperare | RPO | RTO | Caz de utilizare |
|---|---|---|---|---|---|
| Backup logic | pg_dump / pg_dumpall | Restaurare la nivel de obiect | Ore | Mediu | Migrări de scheme, restaurare selectivă a tabelelor |
| Backup fizic | pg_basebackup | Restaurare completă a clusterului | Minute (cu WAL) | Rapid | Recuperare în caz de dezastru, creare standby |
| Arhivare continuă | Arhivare WAL + pg_basebackup | Recuperare la un moment în timp | Secunde | Depinde de volumul WAL | Cerință de zero pierdere de date |
| Snapshot | Snapshot furnizor VPS | Restaurare completă a serverului | La momentul snapshot-ului | Rapid | Plasă de siguranță pre-upgrade |
Backup logic cu compresie:
# 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.gzBackup fizic pentru recuperare în caz de dezastru:
# 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 recoveryAutomatizare cu 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 -deleteScalabilitate: Verticală, orizontală și scalarea citirilor
Scalare verticală
Pe un VPS, scalarea verticală (adăugarea de CPU, RAM, stocare) este de obicei o operațiune live sau necesită doar o repornire scurtă. După actualizarea RAM, actualizează shared_buffers, effective_cache_size și work_mem proporțional. După adăugarea de nuclee CPU, crește max_parallel_workers_per_gather și 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 = 8Replicare în flux pentru scalarea citirilor
Replicarea în flux integrată a PostgreSQL creează un standby activ care poate deservi interogări de citire, descărcând sarcinile de lucru analitice de pe primar:
# 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 automaticallyReplicare logică pentru replicare selectivă
Replicarea logică permite replicarea unor tabele specifice către o altă instanță PostgreSQL, utilă pentru pipeline-urile de data warehousing:
-- 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;Pentru aplicațiile care necesită un Server Dedicat pentru baza de date primară cu replici VPS care gestionează traficul de citire, această arhitectură oferă atât performanță, cât și eficiență a costurilor.
Funcționalități avansate PostgreSQL care merită activate
JSONB pentru sarcini de lucru hibride relaționale/document
-- 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'));Partiționarea tabelelor pentru seturi de date mari
-- 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 pentru aplicații geospațiale
# 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;Monitorizare: Stack de observabilitate pentru PostgreSQL în producție
Depanarea reactivă este insuficientă pentru bazele de date de producție. Un stack de observabilitate proactiv detectează degradarea înainte ca aceasta să devină o întrerupere.
Vizualizări statistice integrate 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';Stack 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"Combină postgres_exporter cu un dashboard Grafana (ID-ul dashboard-ului 9628 de pe grafana.com acoperă toate metricile critice PostgreSQL) și configurează alerte pentru: lag de replicare care depășește 30 de secunde, apropierea de limita de wraparound a ID-ului de tranzacție, rata de hit a cache-ului scăzând sub 95% și numărul de tuple moarte depășind 10% din tuplele vii.
Matricea cazurilor de utilizare: Potrivirea configurației PostgreSQL cu sarcina de lucru
| Sarcină de lucru | Parametri cheie | Extensii | Strategie de scalare |
|---|---|---|---|
| OLTP (e-commerce, SaaS) | work_mem scăzut, PgBouncer, synchronous_commit=on | pg_stat_statements, pgcrypto | Vertical + replici de citire |
| Analiză / OLAP | work_mem ridicat, workers paraleli, synchronous_commit=off | pg_partman, tablefunc | Partiționare + stocare columnară |
| IoT serii de timp | Partiționare după timp, ajustare autovacuum | TimescaleDB, pg_partman | Eliminare partiții + compresie |
| Geospațial / GIS | Indecși spațiali, effective_io_concurrency | PostGIS, pg_routing | Server dedicat pentru seturi de date mari |
| Backend API (JSON) | Indecși GIN pe JSONB, work_mem pentru agregări | pg_trgm, uuid-ossp | Replici de citire pentru API-uri cu GET intens |
| Căutare full-text | Coloane tsvector, indecși GIN | pg_trgm, unaccent | Scanări doar pe indecși, indecși parțiali |
Pentru echipele care construiesc backend-uri API sau aplicații web, combinarea PostgreSQL cu un VPS cu cPanel oferă un panou de control gestionat alături de flexibilitate completă a bazei de date. Pentru echipele de infrastructură care preferă gestionarea prin CLI, Panouri de Control VPS oferă o selecție mai largă de opțiuni de panou.
Listă de verificare practică înainte de implementarea PostgreSQL pe un VPS
Dimensionarea hardware:
- Calculează
shared_buffersca 25% din RAM-ul total - Verifică stocarea NVMe SSD — scrierile WAL ale PostgreSQL sunt sensibile la latență
- Alocă cel puțin 2 nuclee CPU dedicate pentru sarcinile de producție
Linie de bază pentru securitate:
- Leagă
listen_addressesdoar la privat/localhost - Înlocuiește
md5cuscram-sha-256înpg_hba.conf - Activează SSL cu minimum TLS 1.2 pentru orice conexiuni de la distanță
- Creează roluri specifice aplicației — nu folosi niciodată superutilizatorul
postgresîn codul aplicației - Configurează
ufwsauiptablespentru a permite doar IP-uri sursă cunoscute pe portul 5432
Linie de bază pentru performanță:
- Dezactivează transparent huge pages la nivelul OS
- Setează
vm.swappiness=1pentru a preveni paginarea bufferelor partajate - Instalează și configurează PgBouncer dacă numărul de conexiuni depășește 50
- Activează
pg_stat_statementsdin prima zi — profilarea retroactivă a interogărilor este imposibilă
Backup și recuperare:
- Automatizează
pg_dumpcu cron, testează restaurările lunar - Implementează arhivarea WAL dacă cerințele RPO sunt sub 1 oră
- Combină backup-urile la nivel de aplicație cu snapshot-urile furnizorului VPS pentru protecție stratificată
Observabilitate:
- Implementează
postgres_exporter+ Prometheus + Grafana înainte de lansare - Setează alerte pentru lag de replicare, vârsta ID-ului de tranzacție și rata de hit a cache-ului
- Revizuiește
pg_stat_bgwritersăptămânal pentru a detecta presiunea checkpoint-ului
Întrebări frecvente
Ce versiune PostgreSQL ar trebui să instalez pe un VPS nou?
Instalează întotdeauna cea mai recentă versiune majoră stabilă (PostgreSQL 16 începând cu 2024) din depozitul oficial PGDG, nu versiunea inclusă în distribuția ta Linux. Pachetele de distribuție sunt adesea cu 1–2 versiuni majore în urmă și nu primesc backport-uri de funcționalități upstream. Folosește apt.postgresql.org sau yum.postgresql.org pentru instalare.
De câtă RAM are nevoie cu adevărat un VPS PostgreSQL?
Pentru o aplicație mică de producție cu sub 50 de conexiuni simultane și un set de date sub 50 GB, 4 GB RAM este un minim practic. Setează shared_buffers = 1GB, work_mem = 16MB și folosește PgBouncer. Pentru seturi de date care depășesc RAM-ul disponibil, concentrează-te pe acoperirea cu indecși și optimizarea planului de interogare înainte de a adăuga hardware — un index lipsă pe un tabel de 100 GB nu va fi rezolvat prin adăugarea de RAM.
Este sigur să rulezi PostgreSQL și aplicația pe același VPS?
Da, pentru sarcini de lucru mici și medii. Riscul este contența resurselor: un vârf de memorie în aplicație poate declanșa terminări OOM care opresc PostgreSQL. Atenuează acest risc setând oom_score_adj al PostgreSQL la o valoare negativă (făcându-l mai puțin probabil să fie terminat) și folosind cgroups pentru a limita plafonul de memorie al aplicației.
Care este diferența dintre pg_dump și pg_basebackup?
pg_dump produce un backup logic al unei singure baze de date — exportă instrucțiuni SQL sau un format binar personalizat care poate fi restaurat selectiv (tabele individuale, scheme). pg_basebackup copiază întregul director de date PostgreSQL la nivel binar, producând un backup complet al clusterului potrivit pentru recuperare în caz de dezastru și inițializarea serverului standby. Folosește ambele: pg_dump pentru restaurări granulare, pg_basebackup pentru scenarii de recuperare completă.
Cum actualizez în siguranță PostgreSQL la o nouă versiune majoră pe un VPS?
Folosește pg_upgrade cu flag-ul --check mai întâi pentru a valida compatibilitatea fără a face modificări. Efectuează un pg_basebackup complet înainte de a continua. Actualizarea în sine se efectuează offline (PostgreSQL trebuie oprit). Pentru actualizări de versiuni majore fără întreruperi, folosește replicarea logică: configurează o nouă instanță PostgreSQL 16 ca abonat logic la primarul PostgreSQL 15, lasă-o să se sincronizeze, apoi efectuează o comutare coordonată cu timp de nefuncționare minim.
