VPS Üzerinde PostgreSQL: Mimari, Performans Ayarı ve Dağıtım Kılavuzu
PostgreSQL, hem SQL hem de JSON sorgularını, ACID uyumlu işlemleri ve genişletilebilir veri türlerini destekleyen gelişmiş, açık kaynaklı bir nesne-ilişkisel veritabanı yönetim sistemidir (ORDBMS). Bir Sanal Özel Sunucu üzerinde dağıtıldığında, paylaşımlı barındırmanın temelden sağlayamadığı özellikler olan ayrılmış hesaplama kaynakları, tam çekirdek düzeyinde yapılandırma erişimi ve ağ yalıtımı elde eder.
Üretim iş yükleri için bu kombinasyon hemen önem kazanır: paylaşımlı barındırmada yanlış yapılandırılmış bir shared_buffers değeri düzeltilemez, komşu bir örnek üzerindeki kontrolden çıkmış bir sorgu I/O’nuzu tüketebilir ve root erişimi olmadan PostGIS veya pg_partman gibi uzantılar yükleyemezsiniz. Bir VPS bu üç kısıtlamayı aynı anda ortadan kaldırır.
PostgreSQL’in Diğer Açık Kaynaklı RDBMS Seçeneklerinden Neden Daha İyi Performans Gösterdiği
VPS’e özgü avantajları incelemeden önce, karmaşık iş yükleri için PostgreSQL’i MySQL/MariaDB’ye kıyasla tercih edilen motor yapan özellikleri anlamak faydalı olacaktır.
| Özellik | PostgreSQL | MySQL 8.x | MariaDB 10.x |
|---|---|---|---|
| ACID uyumluluğu | DDL dahil tam uyumluluk | Tam | Tam |
| JSON/JSONB indeksleme | GIN indeksli yerel JSONB | JSON (ikili depolama yok) | JSON (ikili depolama yok) |
| Coğrafi uzamsal destek | PostGIS (endüstri standardı) | Sınırlı uzamsal türler | Sınırlı uzamsal türler |
| Tam metin arama | Yerleşik, yapılandırılabilir | Temel FULLTEXT indeksi | Temel FULLTEXT indeksi |
| Tablo bölümleme | Bildirimsel, aralık/liste/karma | Bölümleme desteklenir | Bölümleme desteklenir |
| Paralel sorgu yürütme | Evet (yapılandırılabilir işçiler) | Sınırlı | Sınırlı |
| Özel veri türleri | Evet (CREATE TYPE) | Hayır | Hayır |
| Saklı yordamlar (PL/pgSQL) | Tam prosedürel dil | Temel | Temel |
| Önceden yazma günlüğü (WAL) | Yapılandırılabilir, akış çoğaltması | İkili günlük | İkili günlük |
| Eşzamanlılık modeli | MVCC (okuma kilidi yok) | MVCC | MVCC |
| Mantıksal çoğaltma | Evet (yayın/abonelik) | Evet | Evet |
| Yabancı veri sarmalayıcıları | Evet (postgres_fdw, vb.) | Hayır | Hayır |
PostgreSQL’in Çok Sürümlü Eşzamanlılık Kontrolü (MVCC) modeli özellikle dikkat çekicidir: okuyucular yazıcıları hiçbir zaman engellemez, yazıcılar da okuyucuları hiçbir zaman engellemez. Bu, uzun süren analitik sorguların işlemsel tabloları kilitleyeceği karma OLTP/OLAP iş yükleri için mimari açıdan üstün bir yaklaşımdır.
Maliyet Verimliliği: Aşırı Kaynak Tahsisi Olmadan Kaynak Yönetimi
Bir VPS Hosting planı, çıplak metal donanım maliyetinin çok altında garantili CPU çekirdeği, RAM ve NVMe SSD depolama alanı sağlar. Ekonomik mantık basittir: PostgreSQL’in bellek gereksinimleri max_connections ve work_mem ile ölçeklenir, ham sunucu boyutuyla değil. Varsayılan ayarlarla ve paylaşılan belleği tüketen 200 boşta bağlantıyla çalışan 8 GB RAM’li bir örnek, 50 eşzamanlı bağlantıya hizmet eden ve düzgün ayarlanmış 4 GB RAM’li bir VPS’in gerisinde kalacaktır.
Pratik maliyet verimliliği stratejisi şudur: orta düzey bir VPS ile başlayın, iki haftalık üretim yükünden sonra gerçek pg_stat_activity ve pg_stat_bgwriter metriklerinizi analiz edin, ardından dikey olarak yeniden boyutlandırın. Bu veriye dayalı yaklaşım, başlangıçta aşırı kaynak tahsis etme gibi yaygın bir hatayı önler.
Sıkça göz ardı edilen bir maliyet faktörü: PostgreSQL’in autovacuum arka plan süreci CPU kapasitesi gerektirir. Paylaşımlı barındırmada, autovacuum sağlayıcı tarafından sıkça kısıtlanır ve bu durum zaman içinde tablo şişmesine ve bozulmuş sorgu planlarına yol açar. Bir VPS’te autovacuum_vacuum_cost_delay ve autovacuum_max_workers üzerinde doğrudan kontrole sahip olursunuz.
Tam Root Erişimi ve Ortam Kontrolü
Yönetilen veritabanı hizmetlerinden veya Paylaşımlı Web Hosting‘den farklı olarak, bir VPS size işletim sistemi katmanına kısıtsız erişim sağlar. Bu yalnızca bir kolaylık değil, birçok PostgreSQL özelliği için zorunlu bir gerekliliktir.
Root erişiminin sağladığı ve paylaşımlı ortamların engellediği özellikler:
- PostgreSQL uzantılarının yüklenmesi (
CREATE EXTENSION postgis,CREATE EXTENSION pg_trgm,CREATE EXTENSION timescaledb) - PostgreSQL performansını doğrudan etkileyen çekirdek parametrelerinin değiştirilmesi (
vm.overcommit_memory,vm.swappiness,huge_pages) - Özel kimlik doğrulama yöntemleriyle (SCRAM-SHA-256, LDAP, sertifika tabanlı kimlik doğrulama)
pg_hba.confyapılandırılması - Sağlayıcı müdahalesi olmadan büyük sürüm geçişleri için
pg_upgradeçalıştırılması - İndeksler ve yığın dosyaları arasında I/O ayrımı için ayrı blok aygıtlarına özel tablo alanı birimlerinin bağlanması
Linux’ta PostgreSQL için kritik çekirdek ayarları:
# 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.confBu ayarlar, uygulama düzeyindeki yönetilen veritabanı hizmetlerinde görünmez durumdadır ve bulut tabanlı PostgreSQL örneklerinde açıklanamayan performans düşüşünün sıklıkla temel nedenidir.
Performans Ayarı: Gerçekten Önemli postgresql.conf Parametreleri
Varsayılan PostgreSQL kurulum parametreleri kasıtlı olarak muhafazakârdır — 2000’lerin başındaki 256 MB RAM’li bir makinede çalışacak şekilde tasarlanmıştır. 4–16 GB RAM ve NVMe depolamalı modern bir VPS’te, varsayılan ayarlar donanım kapasitesinin büyük bölümünü kullanılmadan bırakır.
Bellek Yapılandırması
# 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 = trywork_mem tuzağı: work_mem = 256MB ile max_connections = 100 ayarlamak, PostgreSQL’in teorik olarak yalnızca sıralama işlemleri için 25,6 GB RAM tahsis edebileceği anlamına gelir — bu fiziksel belleği çok aşar ve OOM sonlandırmalarını tetikler. work_mem değerini her zaman şu şekilde hesaplayın: (available_RAM - shared_buffers) / (max_connections * 2).
Depolama ve WAL Yapılandırması
# 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 dataBağlantı Yönetimi
# 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 locally50’den fazla eşzamanlı kullanıcıya sahip uygulamalar için PgBouncer zorunludur. Her PostgreSQL arka uç süreci yaklaşık 5–10 MB RAM tüketir. 200 bağlantıda bu, boşta bekleyen süreçler tarafından tüketilen 1–2 GB demektir. İşlem havuzlama modundaki PgBouncer, yüzlerce uygulama bağlantısını küçük bir gerçek PostgreSQL arka uç havuzuna çoğullar.
# 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 = 20Güvenlik Sertleştirme: Varsayılan Kurulumun Ötesinde
Bir VPS üzerindeki yeni bir PostgreSQL kurulumunda, örnek ağdan erişilebilir hale gelmeden önce kapatılması gereken çeşitli güvenlik açıkları bulunmaktadır.
Ağ Düzeyinde Yalıtım
PostgreSQL, kesinlikle gerekli olmadıkça asla genel bir IP üzerinde dinlememeli. Localhost’a bağlayın ve uzaktan yönetim için SSH tünelleme veya VPN kullanın.
# 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'SCRAM-SHA-256 kimlik doğrulamasını zorunlu kılmak için pg_hba.conf yapılandırın (varsayılan md5 kriptografik açıdan zayıftır):
# /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)Uzak Bağlantılar için SSL/TLS Şifrelemesi
Uygulama sunucunuz PostgreSQL’e bir ağ üzerinden bağlanıyorsa, bağlantının şifrelenmesi zorunludur. Bunu uygulama katmanınız için bir SSL Sertifikası ile eşleştirin ve PostgreSQL’in kendi TLS yığınını yapılandırın:
# 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'Rol Tabanlı Erişim Kontrolü
En az ayrıcalık ilkesi veritabanı rolleri için kesinlikle geçerlidir:
-- 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 connectionsGüvenlik Duvarı Kuralları
# 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 verboseYedekleme ve Kurtarma Mimarisi
PostgreSQL, her biri farklı kurtarma hedeflerine uygun iki temel yedekleme mekanizması sağlar.
| Yedekleme Yöntemi | Araç | Kurtarma Türü | RPO | RTO | Kullanım Senaryosu |
|---|---|---|---|---|---|
| Mantıksal yedekleme | pg_dump / pg_dumpall | Nesne düzeyinde geri yükleme | Saatler | Orta | Şema geçişleri, seçici tablo geri yükleme |
| Fiziksel yedekleme | pg_basebackup | Tam küme geri yükleme | Dakikalar (WAL ile) | Hızlı | Felaket kurtarma, bekleme sunucusu oluşturma |
| Sürekli arşivleme | WAL arşivleme + pg_basebackup | Belirli bir noktaya kurtarma | Saniyeler | WAL hacmine bağlı | Sıfır veri kaybı gereksinimi |
| Anlık görüntü | VPS sağlayıcı anlık görüntüsü | Tam sunucu geri yükleme | Anlık görüntü zamanında | Hızlı | Yükseltme öncesi güvenlik ağı |
Sıkıştırmalı mantıksal yedekleme:
# 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.gzFelaket kurtarma için fiziksel yedekleme:
# 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 recoveryCron ile otomatikleştirme:
# /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Ölçeklenebilirlik: Dikey, Yatay ve Okuma Ölçeklendirme
Dikey Ölçeklendirme
Bir VPS’te dikey ölçeklendirme (CPU, RAM, depolama ekleme) genellikle canlı bir işlemdir veya yalnızca kısa bir yeniden başlatma gerektirir. RAM yükseltmesinden sonra shared_buffers, effective_cache_size ve work_mem değerlerini orantılı olarak güncelleyin. CPU çekirdeği ekledikten sonra max_parallel_workers_per_gather ve max_parallel_maintenance_workers değerlerini artırın.
# After upgrading from 4 to 8 CPU cores
max_parallel_workers_per_gather = 4
max_parallel_maintenance_workers = 2
max_parallel_workers = 8Okuma Ölçeklendirme için Akış Çoğaltması
PostgreSQL’in yerleşik akış çoğaltması, okuma sorgularına hizmet edebilen ve analitik iş yüklerini birincil sunucudan boşaltan sıcak bir bekleme sunucusu oluşturur:
# 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 automaticallySeçici Çoğaltma için Mantıksal Çoğaltma
Mantıksal çoğaltma, belirli tabloların başka bir PostgreSQL örneğine çoğaltılmasına olanak tanır ve veri ambarı ardışık düzenleri için kullanışlıdır:
-- 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;Okuma trafiğini işleyen VPS replikaları ile birincil veritabanı için Dedicated Server gerektiren uygulamalar için bu mimari hem performans hem de maliyet verimliliği sağlar.
Etkinleştirmeye Değer Gelişmiş PostgreSQL Özellikleri
Karma İlişkisel/Belge İş Yükleri için 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'));Büyük Veri Kümeleri için Tablo Bölümleme
-- 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 queriesCoğrafi Uzamsal Uygulamalar için PostGIS
# 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;İzleme: Üretim PostgreSQL için Gözlemlenebilirlik Yığını
Reaktif sorun giderme, üretim veritabanları için yetersizdir. Proaktif bir gözlemlenebilirlik yığını, bozulmayı kesintiye dönüşmeden önce yakalar.
Yerleşik PostgreSQL İstatistik Görünümleri
-- 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 Yığını
# 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‘ı bir Grafana panosuyla (grafana.com’dan 9628 numaralı pano tüm kritik PostgreSQL metriklerini kapsar) eşleştirin ve şunlar için uyarılar yapılandırın: 30 saniyeyi aşan çoğaltma gecikmesi, yaklaşan işlem kimliği sarma sorunu, %95’in altına düşen önbellek isabet oranı ve canlı tuple sayısının %10’unu aşan ölü tuple sayısı.
Kullanım Senaryosu Matrisi: PostgreSQL Yapılandırmasını İş Yüküyle Eşleştirme
| İş Yükü | Temel Parametreler | Uzantılar | Ölçeklendirme Stratejisi |
|---|---|---|---|
| OLTP (e-ticaret, SaaS) | Düşük work_mem, PgBouncer, synchronous_commit=on | pg_stat_statements, pgcrypto | Dikey + okuma replikaları |
| Analitik / OLAP | Yüksek work_mem, paralel işçiler, synchronous_commit=off | pg_partman, tablefunc | Bölümleme + sütunsal depolama |
| Zaman serisi IoT | Zamana göre bölümleme, autovacuum ayarı | TimescaleDB, pg_partman | Bölüm budama + sıkıştırma |
| Coğrafi uzamsal / GIS | Uzamsal indeksler, effective_io_concurrency | PostGIS, pg_routing | Büyük veri kümeleri için dedicated server |
| API arka ucu (JSON) | JSONB üzerinde GIN indeksleri, toplamalar için work_mem | pg_trgm, uuid-ossp | GET ağırlıklı API’ler için okuma replikaları |
| Tam metin arama | tsvector sütunları, GIN indeksleri | pg_trgm, unaccent | Yalnızca indeks taramaları, kısmi indeksler |
API arka uçları veya web uygulamaları geliştiren ekipler için PostgreSQL’i bir cPanel’li VPS ile eşleştirmek, tam veritabanı esnekliğinin yanı sıra yönetilen bir kontrol paneli sağlar. CLI odaklı yönetimi tercih eden altyapı ekipleri için VPS Kontrol Panelleri daha geniş bir panel seçeneği sunar.
VPS Üzerinde PostgreSQL Dağıtımından Önce Pratik Karar Kontrol Listesi
Donanım boyutlandırma:
shared_buffersdeğerini toplam RAM’in %25’i olarak hesaplayın- NVMe SSD depolamayı doğrulayın — PostgreSQL’in WAL yazmaları gecikmeye duyarlıdır
- Üretim iş yükleri için en az 2 ayrılmış CPU çekirdeği tahsis edin
Güvenlik temeli:
listen_addressesdeğerini yalnızca özel/localhost olarak bağlayınpg_hba.confdosyasındamd5yerinescram-sha-256kullanın- Uzak bağlantılar için minimum TLS 1.2 ile SSL’i etkinleştirin
- Uygulamaya özgü roller oluşturun — uygulama kodunda asla
postgressüper kullanıcısını kullanmayın - 5432 numaralı bağlantı noktasında yalnızca bilinen kaynak IP’lere izin vermek için
ufwveyaiptablesyapılandırın
Performans temeli:
- İşletim sistemi düzeyinde şeffaf büyük sayfaları devre dışı bırakın
- Paylaşılan arabellek sayfalamasını önlemek için
vm.swappiness=1ayarlayın - Bağlantı sayısı 50’yi aşıyorsa PgBouncer’ı yükleyin ve yapılandırın
- İlk günden itibaren
pg_stat_statementsetkinleştirin — geriye dönük sorgu profili oluşturma mümkün değildir
Yedekleme ve kurtarma:
pg_dumpişlemini cron ile otomatikleştirin, geri yüklemeleri aylık olarak test edin- RPO gereksinimleri 1 saatin altındaysa WAL arşivlemeyi uygulayın
- Katmanlı koruma için uygulama düzeyindeki yedeklemeleri VPS sağlayıcı anlık görüntüleriyle birleştirin
Gözlemlenebilirlik:
- Yayına geçmeden önce
postgres_exporter+ Prometheus + Grafana dağıtın - Çoğaltma gecikmesi, işlem kimliği yaşı ve önbellek isabet oranı için uyarılar ayarlayın
- Kontrol noktası baskısını tespit etmek için
pg_stat_bgwriterdeğerini haftalık olarak inceleyin
SSS
Yeni bir VPS’e hangi PostgreSQL sürümünü kurmalıyım?
Linux dağıtımınızla birlikte gelen sürümü değil, her zaman resmi PGDG deposundan en son kararlı ana sürümü (2024 itibarıyla PostgreSQL 16) yükleyin. Dağıtım paketleri genellikle 1–2 ana sürüm gerisindedir ve yukarı akış özellik geri portları almaz. Kurulum için apt.postgresql.org veya yum.postgresql.org kullanın.
Bir PostgreSQL VPS’inin gerçekte ne kadar RAM’e ihtiyacı var?
50’den az eşzamanlı bağlantıya ve 50 GB’ın altında bir veri kümesine sahip küçük bir üretim uygulaması için 4 GB RAM pratik bir minimumdur. shared_buffers = 1GB, work_mem = 16MB ayarlayın ve PgBouncer kullanın. Kullanılabilir RAM’i aşan veri kümeleri için donanım eklemeden önce indeks kapsamına ve sorgu planı optimizasyonuna odaklanın — 100 GB’lık bir tablodaki eksik indeks, RAM eklenerek çözülemez.
PostgreSQL ve uygulamayı aynı VPS üzerinde çalıştırmak güvenli midir?
Evet, küçük ve orta ölçekli iş yükleri için. Risk, kaynak çekişmesidir: uygulamadaki bir bellek artışı, PostgreSQL’i sonlandıran OOM öldürmelerini tetikleyebilir. Bunu, PostgreSQL’in oom_score_adj değerini negatif bir değere ayarlayarak (öldürülme olasılığını azaltmak için) ve uygulamanın bellek tavanını sınırlamak için cgroups kullanarak hafifletin.
pg_dump ile pg_basebackup arasındaki fark nedir?
pg_dump, tek bir veritabanının mantıksal yedeğini oluşturur — seçici olarak geri yüklenebilen (tek tek tablolar, şemalar) SQL deyimleri veya özel bir ikili biçim dışa aktarır. pg_basebackup, tüm PostgreSQL veri dizinini ikili düzeyde kopyalayarak felaket kurtarma ve bekleme sunucusu başlatma için uygun tam bir küme yedeği oluşturur. Her ikisini de kullanın: ayrıntılı geri yüklemeler için pg_dump, tam kurtarma senaryoları için pg_basebackup.
VPS üzerinde PostgreSQL’i yeni bir ana sürüme güvenli bir şekilde nasıl yükseltebilirim?
Değişiklik yapmadan uyumluluğu doğrulamak için önce --check bayrağıyla pg_upgrade kullanın. Devam etmeden önce tam bir pg_basebackup alın. Yükseltmenin kendisi çevrimdışı gerçekleştirilir (PostgreSQL durdurulmalıdır). Sıfır kesinti süreli ana sürüm yükseltmeleri için mantıksal çoğaltmayı kullanın: PostgreSQL 15 birincil sunucusuna mantıksal abone olarak yeni bir PostgreSQL 16 örneği kurun, yetişmesini bekleyin, ardından minimum kesinti süresiyle koordineli bir geçiş gerçekleştirin.
