PostgreSQL'de hot standby: streaming replikasyon kurulumu adım adım
Ana sunucu çökerse ne olacak? İkinci bir PostgreSQL sunucusunu anlık kopya olarak tutmanın, okuma yükünü dağıtmanın ve gerektiğinde onu ana sunucu yapmanın güncel yolu.
Eğitimlerde "yüksek erişilebilirlik" başlığına geldiğimizde lab notlarımızda trigger dosyaları, recovery.conf ve Slony vardı. O günden bu yana PostgreSQL bu konuda çok yol aldı. Bugün iki sunuculu bir yapı kurmak gerçekten birkaç komut.
Mantık
- Primary (ana) sunucu tüm yazma işlemlerini alır ve değişiklikleri WAL kayıtları olarak üretir.
- Standby (yedek) sunucu bu kayıtları anlık olarak alıp uygular. Hot standby modunda aynı anda salt okunur sorgulara da cevap verir; raporları buraya yönlendirerek ana sunucuyu rahatlatabilirsiniz.
1. Ana sunucuda hazırlık
postgresql.conf (çoğu zaten varsayılan):
wal_level = replica
max_wal_senders = 10
listen_addresses = '*'
Replikasyon için ayrı ve sınırlı yetkili bir kullanıcı açın. Süper kullanıcı vermeye gerek yok:
CREATE ROLE replikator WITH REPLICATION LOGIN PASSWORD 'GucluBirSifre!';
pg_hba.conf:
host replication replikator 10.0.0.12/32 scram-sha-256
Ardından ayarları yeniden yükleyin: SELECT pg_reload_conf();
2. Yedek sunucuyu tek komutla hazırlamak
Yedek sunucuda PostgreSQL servisini durdurun, veri dizinini boşaltın ve:
pg_basebackup -h 10.0.0.11 -U replikator -D /var/lib/postgresql/18/main \
-X stream -C -S standby1 -R -P
-R: Bağlantı bilgisini (primary_conninfo) yazar vestandby.signaldosyasını oluşturur. Eskiden elle yazdığımızrecovery.conf'un yerini bu aldı.-C -S standby1: Ana sunucuda bir replikasyon slotu açar. Yedek sunucu bir süre koparsa, ihtiyaç duyduğu WAL dosyaları ana sunucuda silinmeden bekler.
Servisi başlatın. Hepsi bu.
3. Çalıştığını görmek
Ana sunucuda:
SELECT client_addr, state, sent_lsn, replay_lsn, replay_lag
FROM pg_stat_replication;
Yedek sunucuda:
SELECT pg_is_in_recovery(); -- true dönmeli
SELECT status, sender_host FROM pg_stat_wal_receiver;
Ana sunucuda bir tabloya kayıt ekleyin, yedekte hemen görün. Yedekte INSERT denediğinizde "read-only transaction" hatası almanız da her şeyin yolunda olduğunu gösterir.
4. Yedeği ana sunucu yapmak (failover)
Eskiden trigger_file ile boş bir dosya oluşturup beklerdik. Bugün:
SELECT pg_promote();
ya da komut satırından pg_ctl promote. (Trigger dosyası ayarı PostgreSQL 16'da tamamen kaldırıldı.)
Dikkat: Eski ana sunucu geri geldiğinde onu doğrudan yeniden başlatmayın; iki sunucunun aynı anda yazma kabul etmesi (split-brain) veri tutarsızlığına yol açar. Eski ana sunucuyu pg_rewind ile yeni ana sunucunun yedeği olarak yeniden bağlayın.
Bir adım ötesi
- Otomatik failover için Patroni ya da repmgr gibi araçlar kullanılır.
- Belirli tabloları başka bir sunucuya ya da farklı sürüme aktarmak için yerleşik mantıksal replikasyon (
CREATE PUBLICATION/CREATE SUBSCRIPTION) var. Eğitim notlarımdaki Slony'nin yerini büyük ölçüde bu aldı. - Replikasyon yedeğin yerine geçmez: Ana sunucuda yanlışlıkla silinen tablo, yedek sunucuda da anında silinir. Düzenli yedek ve PITR'yi ayrıca yapın.
Kaynak: PostgreSQL belgeleri, High Availability, Load Balancing, and Replication
Yorumlar (0)