PostgreSQL di VPS: Panduan Arsitektur, Penyetelan Performa, dan Deployment
PostgreSQL adalah sistem manajemen basis data relasional-objek (ORDBMS) open-source tingkat lanjut yang mendukung kueri SQL dan JSON, transaksi yang sesuai dengan ACID, dan tipe data yang dapat diperluas. Ketika digunakan pada Virtual Private Server, sistem ini mendapatkan sumber daya komputasi khusus, akses konfigurasi tingkat kernel penuh, dan isolasi jaringan — kemampuan yang secara fundamental tidak dapat disediakan oleh shared hosting.
Untuk beban kerja produksi, kombinasi ini langsung terasa penting: nilai shared_buffers yang salah dikonfigurasi pada shared hosting tidak dapat diperbaiki, kueri yang berjalan liar pada instance tetangga dapat menghabiskan I/O Anda, dan Anda tidak dapat menginstal ekstensi seperti PostGIS atau pg_partman tanpa akses root. VPS menghilangkan ketiga kendala tersebut sekaligus.
Mengapa PostgreSQL Mengungguli Opsi RDBMS Open-Source Lainnya
Sebelum memeriksa keunggulan spesifik VPS, ada baiknya memahami apa yang membuat PostgreSQL menjadi mesin pilihan dibandingkan MySQL/MariaDB untuk beban kerja yang kompleks.
| Fitur | PostgreSQL | MySQL 8.x | MariaDB 10.x |
|---|---|---|---|
| Kepatuhan ACID | Penuh, termasuk DDL | Penuh | Penuh |
| Pengindeksan JSON/JSONB | JSONB native dengan indeks GIN | JSON (tanpa penyimpanan biner) | JSON (tanpa penyimpanan biner) |
| Dukungan geospasial | PostGIS (standar industri) | Tipe spasial terbatas | Tipe spasial terbatas |
| Pencarian teks lengkap | Bawaan, dapat dikonfigurasi | Indeks FULLTEXT dasar | Indeks FULLTEXT dasar |
| Partisi tabel | Deklaratif, range/list/hash | Partisi didukung | Partisi didukung |
| Eksekusi kueri paralel | Ya (worker yang dapat dikonfigurasi) | Terbatas | Terbatas |
| Tipe data kustom | Ya (CREATE TYPE) | Tidak | Tidak |
| Stored procedure (PL/pgSQL) | Bahasa prosedural penuh | Dasar | Dasar |
| Write-ahead logging (WAL) | Dapat dikonfigurasi, streaming replication | Binary log | Binary log |
| Model konkurensi | MVCC (tanpa read lock) | MVCC | MVCC |
| Logical replication | Ya (publication/subscription) | Ya | Ya |
| Foreign data wrapper | Ya (postgres_fdw, dll.) | Tidak | Tidak |
Model Multi-Version Concurrency Control (MVCC) PostgreSQL layak mendapat perhatian khusus: pembaca tidak pernah memblokir penulis dan penulis tidak pernah memblokir pembaca. Ini secara arsitektur lebih unggul untuk beban kerja OLTP/OLAP campuran di mana kueri analitik yang berjalan lama sebaliknya akan mengunci tabel transaksional.
Efisiensi Biaya: Alokasi Sumber Daya Tanpa Overprovisioning
Paket VPS Hosting menyediakan CPU core, RAM, dan penyimpanan NVMe SSD yang terjamin dengan biaya sebagian kecil dari perangkat keras bare-metal. Logika ekonominya sederhana: kebutuhan memori PostgreSQL berskala dengan max_connections dan work_mem, bukan dengan ukuran server mentah. VPS 4 GB RAM yang dikonfigurasi dengan benar untuk melayani 50 koneksi bersamaan akan mengungguli instance 8 GB RAM dengan pengaturan default dan 200 koneksi idle yang mengonsumsi shared memory.
Strategi efisiensi biaya praktisnya adalah memulai dengan VPS tingkat menengah, memprofilkan metrik pg_stat_activity dan pg_stat_bgwriter aktual Anda setelah dua minggu beban produksi, lalu melakukan resize secara vertikal. Pendekatan berbasis data ini mencegah kesalahan umum berupa overprovisioning saat peluncuran.
Satu faktor biaya yang sering diabaikan: daemon autovacuum PostgreSQL membutuhkan headroom CPU. Pada shared hosting, autovacuum sering dibatasi oleh penyedia, menyebabkan pembengkakan tabel dan rencana kueri yang terdegradasi seiring waktu. Pada VPS, Anda mengontrol autovacuum_vacuum_cost_delay dan autovacuum_max_workers secara langsung.
Akses Root Penuh dan Kontrol Lingkungan
Tidak seperti layanan basis data terkelola atau Shared Web Hosting, VPS memberi Anda akses tak terbatas ke lapisan sistem operasi. Ini bukan sekadar kemudahan — ini adalah persyaratan mutlak untuk beberapa kemampuan PostgreSQL.
Apa yang diaktifkan oleh akses root yang diblokir oleh lingkungan shared:
- Menginstal ekstensi PostgreSQL (
CREATE EXTENSION postgis,CREATE EXTENSION pg_trgm,CREATE EXTENSION timescaledb) - Memodifikasi parameter kernel yang secara langsung memengaruhi performa PostgreSQL (
vm.overcommit_memory,vm.swappiness,huge_pages) - Mengonfigurasi
pg_hba.confdengan metode autentikasi kustom (SCRAM-SHA-256, LDAP, autentikasi berbasis sertifikat) - Menjalankan
pg_upgradeuntuk migrasi versi mayor tanpa intervensi penyedia - Memasang volume tablespace khusus pada perangkat blok terpisah untuk pemisahan I/O antara indeks dan file heap
Tuning kernel kritis untuk PostgreSQL di 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.confPengaturan ini tidak terlihat oleh layanan basis data terkelola tingkat aplikasi dan sering menjadi akar penyebab degradasi performa yang tidak dapat dijelaskan pada instance PostgreSQL yang dihosting di cloud.
Tuning Performa: Parameter postgresql.conf yang Benar-Benar Penting
Parameter instalasi PostgreSQL default sengaja dibuat konservatif — dirancang untuk berjalan pada mesin dengan RAM 256 MB dari awal tahun 2000-an. Pada VPS modern dengan RAM 4–16 GB dan penyimpanan NVMe, pengaturan default membiarkan sebagian besar kemampuan perangkat keras tidak digunakan.
Konfigurasi Memori
# 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 = tryJebakan work_mem: Menetapkan work_mem = 256MB dengan max_connections = 100 berarti PostgreSQL secara teoritis dapat mengalokasikan 25,6 GB RAM hanya untuk operasi pengurutan — jauh melebihi memori fisik dan memicu OOM kill. Selalu hitung work_mem sebagai: (available_RAM - shared_buffers) / (max_connections * 2).
Konfigurasi Penyimpanan dan 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 dataManajemen Koneksi
# 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 bukanlah opsional untuk aplikasi dengan lebih dari 50 pengguna bersamaan. Setiap proses backend PostgreSQL mengonsumsi sekitar 5–10 MB RAM. Pada 200 koneksi, itu berarti 1–2 GB dikonsumsi oleh proses idle. PgBouncer dalam mode transaction-pooling memultipleks ratusan koneksi aplikasi ke dalam pool kecil backend PostgreSQL yang sebenarnya.
# 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 = 20Penguatan Keamanan: Melampaui Instalasi Default
Instalasi PostgreSQL baru pada VPS memiliki beberapa celah keamanan yang harus ditutup sebelum instance dapat dijangkau dari jaringan.
Isolasi Tingkat Jaringan
PostgreSQL tidak boleh mendengarkan pada IP publik kecuali benar-benar diperlukan. Ikat ke localhost dan gunakan SSH tunneling atau VPN untuk administrasi jarak jauh.
# 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'Konfigurasikan pg_hba.conf untuk menerapkan autentikasi SCRAM-SHA-256 (md5 default secara kriptografis lemah):
# /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)Enkripsi SSL/TLS untuk Koneksi Jarak Jauh
Jika server aplikasi Anda terhubung ke PostgreSQL melalui jaringan, mengenkripsi koneksi adalah hal yang wajib. Padukan ini dengan SSL Certificate untuk lapisan aplikasi Anda dan konfigurasikan stack TLS PostgreSQL sendiri:
# 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'Kontrol Akses Berbasis Peran
Prinsip hak akses minimal berlaku secara ketat untuk peran basis data:
-- 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 connectionsAturan 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 verboseArsitektur Backup dan Pemulihan
PostgreSQL menyediakan dua mekanisme backup yang secara fundamental berbeda, masing-masing cocok untuk tujuan pemulihan yang berbeda.
| Metode Backup | Alat | Jenis Pemulihan | RPO | RTO | Kasus Penggunaan |
|---|---|---|---|---|---|
| Backup logis | pg_dump / pg_dumpall | Pemulihan tingkat objek | Jam | Sedang | Migrasi skema, pemulihan tabel selektif |
| Backup fisik | pg_basebackup | Pemulihan cluster penuh | Menit (dengan WAL) | Cepat | Pemulihan bencana, pembuatan standby |
| Pengarsipan berkelanjutan | Pengarsipan WAL + pg_basebackup | Pemulihan point-in-time | Detik | Bergantung pada volume WAL | Persyaratan zero data loss |
| Snapshot | Snapshot penyedia VPS | Pemulihan server penuh | Pada waktu snapshot | Cepat | Jaring pengaman pra-upgrade |
Backup logis dengan kompresi:
# 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 fisik untuk pemulihan bencana:
# 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 recoveryOtomatisasi dengan 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 -deleteSkalabilitas: Vertikal, Horizontal, dan Penskalaan Baca
Penskalaan Vertikal
Pada VPS, penskalaan vertikal (menambah CPU, RAM, penyimpanan) biasanya merupakan operasi langsung atau hanya memerlukan restart singkat. Setelah meningkatkan RAM, perbarui shared_buffers, effective_cache_size, dan work_mem secara proporsional. Setelah menambah CPU core, tingkatkan max_parallel_workers_per_gather dan 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 = 8Streaming Replication untuk Penskalaan Baca
Streaming replication bawaan PostgreSQL membuat hot standby yang dapat melayani kueri baca, memindahkan beban kerja analitik dari primary:
# 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 automaticallyLogical Replication untuk Replikasi Selektif
Logical replication memungkinkan replikasi tabel tertentu ke instance PostgreSQL lain, berguna untuk pipeline 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;Untuk aplikasi yang memerlukan Dedicated Server untuk basis data primary dengan replika VPS yang menangani lalu lintas baca, arsitektur ini memberikan performa sekaligus efisiensi biaya.
Fitur PostgreSQL Lanjutan yang Layak Diaktifkan
JSONB untuk Beban Kerja Relasional/Dokumen Hibrida
-- 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'));Partisi Tabel untuk Dataset Besar
-- 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 untuk Aplikasi Geospasial
# 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;Pemantauan: Stack Observabilitas untuk PostgreSQL Produksi
Pemecahan masalah reaktif tidak memadai untuk basis data produksi. Stack observabilitas proaktif mendeteksi degradasi sebelum menjadi gangguan.
Tampilan Statistik PostgreSQL Bawaan
-- 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"Padukan postgres_exporter dengan dashboard Grafana (ID dashboard 9628 dari grafana.com mencakup semua metrik PostgreSQL kritis) dan konfigurasikan peringatan untuk: lag replikasi melebihi 30 detik, wraparound ID transaksi yang semakin dekat, rasio cache hit turun di bawah 95%, dan jumlah dead tuple melebihi 10% dari live tuple.
Matriks Kasus Penggunaan: Mencocokkan Konfigurasi PostgreSQL dengan Beban Kerja
| Beban Kerja | Parameter Utama | Ekstensi | Strategi Penskalaan |
|---|---|---|---|
| OLTP (e-commerce, SaaS) | work_mem rendah, PgBouncer, synchronous_commit=on | pg_stat_statements, pgcrypto | Vertikal + read replica |
| Analitik / OLAP | work_mem tinggi, parallel worker, synchronous_commit=off | pg_partman, tablefunc | Partisi + columnar storage |
| Time-series IoT | Partisi berdasarkan waktu, tuning autovacuum | TimescaleDB, pg_partman | Partition pruning + kompresi |
| Geospasial / GIS | Indeks spasial, effective_io_concurrency | PostGIS, pg_routing | Dedicated server untuk dataset besar |
| Backend API (JSON) | Indeks GIN pada JSONB, work_mem untuk agregasi | pg_trgm, uuid-ossp | Read replica untuk API yang banyak GET |
| Pencarian teks lengkap | Kolom tsvector, indeks GIN | pg_trgm, unaccent | Index-only scan, partial index |
Untuk tim yang membangun backend API atau aplikasi web, memadukan PostgreSQL dengan VPS dengan cPanel menyediakan panel kontrol terkelola sekaligus fleksibilitas basis data penuh. Untuk tim infrastruktur yang lebih memilih manajemen berbasis CLI, VPS Control Panels menawarkan pilihan panel yang lebih luas.
Daftar Periksa Keputusan Praktis Sebelum Menggunakan PostgreSQL pada VPS
Penentuan ukuran perangkat keras:
- Hitung
shared_bufferssebesar 25% dari total RAM - Verifikasi penyimpanan NVMe SSD — penulisan WAL PostgreSQL sensitif terhadap latensi
- Alokasikan setidaknya 2 CPU core khusus untuk beban kerja produksi
Baseline keamanan:
- Ikat
listen_addresseshanya ke private/localhost - Ganti
md5denganscram-sha-256dipg_hba.conf - Aktifkan SSL dengan minimum TLS 1.2 untuk koneksi jarak jauh apa pun
- Buat peran khusus aplikasi — jangan pernah gunakan superuser
postgresdalam kode aplikasi - Konfigurasikan
ufwatauiptablesuntuk hanya mengizinkan IP sumber yang dikenal pada port 5432
Baseline performa:
- Nonaktifkan transparent huge page di tingkat OS
- Atur
vm.swappiness=1untuk mencegah paging shared buffer - Instal dan konfigurasikan PgBouncer jika jumlah koneksi melebihi 50
- Aktifkan
pg_stat_statementssejak hari pertama — pemrofilan kueri retroaktif tidak mungkin dilakukan
Backup dan pemulihan:
- Otomatiskan
pg_dumpdengan cron, uji pemulihan setiap bulan - Implementasikan pengarsipan WAL jika persyaratan RPO di bawah 1 jam
- Gabungkan backup tingkat aplikasi dengan snapshot penyedia VPS untuk perlindungan berlapis
Observabilitas:
- Terapkan
postgres_exporter+ Prometheus + Grafana sebelum go-live - Atur peringatan pada lag replikasi, usia ID transaksi, dan rasio cache hit
- Tinjau
pg_stat_bgwritersetiap minggu untuk mendeteksi tekanan checkpoint
FAQ
Versi PostgreSQL apa yang harus saya instal pada VPS baru?
Selalu instal rilis mayor stabil terbaru (PostgreSQL 16 per 2024) dari repositori PGDG resmi, bukan versi yang disertakan dengan distribusi Linux Anda. Paket distribusi sering tertinggal 1–2 versi mayor dan tidak menerima backport fitur upstream. Gunakan apt.postgresql.org atau yum.postgresql.org untuk instalasi.
Berapa banyak RAM yang sebenarnya dibutuhkan VPS PostgreSQL?
Untuk aplikasi produksi kecil dengan kurang dari 50 koneksi bersamaan dan dataset di bawah 50 GB, 4 GB RAM adalah minimum yang praktis. Atur shared_buffers = 1GB, work_mem = 16MB, dan gunakan PgBouncer. Untuk dataset yang melebihi RAM yang tersedia, fokus pada cakupan indeks dan optimasi rencana kueri sebelum menambah perangkat keras — indeks yang hilang pada tabel 100 GB tidak akan terselesaikan dengan menambah RAM.
Apakah aman menjalankan PostgreSQL dan aplikasi pada VPS yang sama?
Ya, untuk beban kerja kecil hingga menengah. Risikonya adalah persaingan sumber daya: lonjakan memori dalam aplikasi dapat memicu OOM kill yang menghentikan PostgreSQL. Mitigasi hal ini dengan menetapkan oom_score_adj PostgreSQL ke nilai negatif (membuatnya lebih kecil kemungkinannya untuk dimatikan) dan menggunakan cgroups untuk membatasi batas memori aplikasi.
Apa perbedaan antara pg_dump dan pg_basebackup?
pg_dump menghasilkan backup logis dari satu basis data — mengekspor pernyataan SQL atau format biner kustom yang dapat dipulihkan secara selektif (tabel individual, skema). pg_basebackup menyalin seluruh direktori data PostgreSQL di tingkat biner, menghasilkan backup cluster penuh yang cocok untuk pemulihan bencana dan inisialisasi server standby. Gunakan keduanya: pg_dump untuk pemulihan granular, pg_basebackup untuk skenario pemulihan penuh.
Bagaimana cara melakukan upgrade PostgreSQL ke versi mayor baru pada VPS dengan aman?
Gunakan pg_upgrade dengan flag --check terlebih dahulu untuk memvalidasi kompatibilitas tanpa membuat perubahan. Ambil pg_basebackup penuh sebelum melanjutkan. Upgrade itu sendiri dilakukan secara offline (PostgreSQL harus dihentikan). Untuk upgrade versi mayor tanpa downtime, gunakan logical replication: siapkan instance PostgreSQL 16 baru sebagai logical subscriber ke primary PostgreSQL 15, biarkan mengejar ketertinggalan, lalu lakukan cutover terkoordinasi dengan downtime minimal.
