PostgreSQL streaming replication + otomatik failover
Belirti
Amaç: PostgreSQL için streaming (akış) replikasyonu ile hot standby kur ve otomatik failover için Patroni/repmgr ekle.
1. Primary'de WAL ve bağlantı parametrelerini ayarla
Streaming replikasyon için wal_level en az 'replica' olmalı. max_wal_senders yeterli replika + yedek sayısını karşılamalı, wal_keep_size veya replication slot ile WAL'ın erken silinmesi engellenmeli. Değişiklikler yeniden başlatma gerektirir.
PostgreSQL
ALTER SYSTEM SET wal_level = 'replica';
ALTER SYSTEM SET max_wal_senders = 10;
ALTER SYSTEM SET max_replication_slots = 10;
ALTER SYSTEM SET hot_standby = on;
-- postgresql.conf değişimi için:
-- systemctl restart postgresql2. Replikasyon rolü ve pg_hba erişimi tanımla
Standby'ın bağlanacağı REPLICATION yetkili bir rol oluşturulur. pg_hba.conf'a standby IP'sinden 'replication' veritabanına erişim satırı eklenir ve pg_reload_conf() ile yeniden yüklenir.
PostgreSQL
CREATE ROLE replikator WITH REPLICATION LOGIN PASSWORD 'gizli';
-- pg_hba.conf'a ekle:
-- host replication replikator 10.0.0.20/32 scram-sha-256
SELECT pg_reload_conf();3. Primary'de kalıcı replication slot oluştur
Fiziksel replication slot, standby geride kaldığında bile primary'nin ihtiyaç duyulan WAL'ı silmesini engeller; slot yönetimi wal_keep_size'a göre daha güvenlidir. Slot ismini standby yapılandırmasında kullanacağız.
PostgreSQL
SELECT pg_create_physical_replication_slot('standby1_slot');
SELECT slot_name, active, restart_lsn FROM pg_replication_slots;4. Standby sunucuda pg_basebackup ile taban yedeği al
Standby'ın veri dizini boşken primary'den tam bir kopya alınır. -R bayrağı standby.signal dosyasını ve primary_conninfo'yu otomatik yazar; -C ile slot da oluşturulabilir. Slot ismi -S ile verilir.
PostgreSQL
pg_basebackup -h 10.0.0.10 -U replikator -D /var/lib/pgsql/data \
-R -X stream -S standby1_slot -P -v5. primary_conninfo ve hot_standby'ı doğrula, standby'ı başlat
-R yazdığı postgresql.auto.conf içindeki primary_conninfo (host, user, slot) kontrol edilir; standby.signal dosyasının varlığı standby modunu belirler. hot_standby=on ise standby salt-okunur sorgulara açılır. Servis başlatılır.
PostgreSQL
-- postgresql.auto.conf içinde beklenen:
-- primary_conninfo = 'host=10.0.0.10 user=replikator password=gizli'
-- primary_slot_name = 'standby1_slot'
-- systemctl start postgresql
SELECT pg_is_in_recovery(); -- standby'da true dönmeli6. Replikasyon gecikmesini primary'den izle
Primary üzerinde pg_stat_replication her standby için gönderilen/uygulanan LSN ve gecikmeyi gösterir. write/flush/replay lag'ler küçük kalmalı; sync_state senkron replika kullanılıyorsa 'sync' olur.
PostgreSQL
SELECT client_addr, state, sync_state,
pg_wal_lsn_diff(sent_lsn, replay_lsn) AS replay_lag_bytes,
write_lag, flush_lag, replay_lag
FROM pg_stat_replication;7. Otomatik failover için Patroni veya repmgr ekle
Çıplak streaming replikasyon manuel promote gerektirir. Otomatik failover için bir küme yöneticisi şarttır: Patroni (etcd/Consul üzerinde lider seçimi + otomatik promote) veya repmgr (repmgrd ile izleme/failover). Uygulama tarafında HAProxy/pgBouncer ile tek endpoint sağlanır. Manuel promote gerekirse: pg_ctl promote. Promote öncesinde eski primary'nin gerçekten durduğundan ve uygulamaların ona yazamadığından emin olun (split-brain riski). Eski primary'yi yeni primary'ye standby olarak geri katmak için pg_rewind gerekir; bunun için wal_log_hints = on ya da data checksums açık olmalıdır.
PostgreSQL
-- Manuel promote (küme yöneticisi yoksa):
pg_ctl promote -D /var/lib/pgsql/data
-- veya SQL:
SELECT pg_promote();
-- Patroni ile: patronictl -c /etc/patroni.yml switchover mycluster