15%

Tüm Hosting Hizmetlerinde %15 indirim

Becerilerini test et ve herhangi bir hosting planında İndirim kazan

Kodu kullanın:

Skills
Başlayın
23.10.2024
2 +1

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.

ÖzellikPostgreSQLMySQL 8.xMariaDB 10.x
ACID uyumluluğuDDL dahil tam uyumlulukTamTam
JSON/JSONB indekslemeGIN indeksli yerel JSONBJSON (ikili depolama yok)JSON (ikili depolama yok)
Coğrafi uzamsal destekPostGIS (endüstri standardı)Sınırlı uzamsal türlerSınırlı uzamsal türler
Tam metin aramaYerleşik, yapılandırılabilirTemel FULLTEXT indeksiTemel FULLTEXT indeksi
Tablo bölümlemeBildirimsel, aralık/liste/karmaBölümleme desteklenirBölümleme desteklenir
Paralel sorgu yürütmeEvet (yapılandırılabilir işçiler)SınırlıSınırlı
Özel veri türleriEvet (CREATE TYPE)HayırHayır
Saklı yordamlar (PL/pgSQL)Tam prosedürel dilTemelTemel
Önceden yazma günlüğü (WAL)Yapılandırılabilir, akış çoğaltmasıİkili günlükİkili günlük
Eşzamanlılık modeliMVCC (okuma kilidi yok)MVCCMVCC
Mantıksal çoğaltmaEvet (yayın/abonelik)EvetEvet
Yabancı veri sarmalayıcılarıEvet (postgres_fdw, vb.)HayırHayı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.conf yapı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.conf

Bu 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 = try

work_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 data

Bağ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 locally

50’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 = 20

Gü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 connections

Gü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 verbose

Yedekleme ve Kurtarma Mimarisi

PostgreSQL, her biri farklı kurtarma hedeflerine uygun iki temel yedekleme mekanizması sağlar.

Yedekleme YöntemiAraçKurtarma TürüRPORTOKullanım Senaryosu
Mantıksal yedeklemepg_dump / pg_dumpallNesne düzeyinde geri yüklemeSaatlerOrtaŞema geçişleri, seçici tablo geri yükleme
Fiziksel yedeklemepg_basebackupTam küme geri yüklemeDakikalar (WAL ile)HızlıFelaket kurtarma, bekleme sunucusu oluşturma
Sürekli arşivlemeWAL arşivleme + pg_basebackupBelirli bir noktaya kurtarmaSaniyelerWAL 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üklemeAnlık görüntü zamanındaHı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.gz

Felaket 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 recovery

Cron 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 = 8

Okuma Ö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 automatically

Seç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 queries

Coğ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 ParametrelerUzantılarÖlçeklendirme Stratejisi
OLTP (e-ticaret, SaaS)Düşük work_mem, PgBouncer, synchronous_commit=onpg_stat_statements, pgcryptoDikey + okuma replikaları
Analitik / OLAPYüksek work_mem, paralel işçiler, synchronous_commit=offpg_partman, tablefuncBölümleme + sütunsal depolama
Zaman serisi IoTZamana göre bölümleme, autovacuum ayarıTimescaleDB, pg_partmanBölüm budama + sıkıştırma
Coğrafi uzamsal / GISUzamsal indeksler, effective_io_concurrencyPostGIS, pg_routingBüyük veri kümeleri için dedicated server
API arka ucu (JSON)JSONB üzerinde GIN indeksleri, toplamalar için work_mempg_trgm, uuid-osspGET ağırlıklı API’ler için okuma replikaları
Tam metin aramatsvector sütunları, GIN indeksleripg_trgm, unaccentYalnı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_buffers değ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_addresses değerini yalnızca özel/localhost olarak bağlayın
  • pg_hba.conf dosyasında md5 yerine scram-sha-256 kullanın
  • Uzak bağlantılar için minimum TLS 1.2 ile SSL’i etkinleştirin
  • Uygulamaya özgü roller oluşturun — uygulama kodunda asla postgres süper kullanıcısını kullanmayın
  • 5432 numaralı bağlantı noktasında yalnızca bilinen kaynak IP’lere izin vermek için ufw veya iptables yapı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=1 ayarlayın
  • Bağlantı sayısı 50’yi aşıyorsa PgBouncer’ı yükleyin ve yapılandırın
  • İlk günden itibaren pg_stat_statements etkinleştirin — geriye dönük sorgu profili oluşturma mümkün değildir

Yedekleme ve kurtarma:

  • pg_dump iş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_bgwriter değ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.

15%

Tüm Hosting Hizmetlerinde %15 indirim

Becerilerini test et ve herhangi bir hosting planında İndirim kazan

Kodu kullanın:

Skills
Başlayın