DBAtlas · Veritabanı operasyon atlası

Failover sonrası eski primary'yi pg_rewind ile replica olarak geri kat

PostgreSQLReplikasyon

Komut

# Önkoşul (olaydan ÖNCE ayarlı olmalı): wal_log_hints = on VEYA data checksums; full_page_writes = on
pg_controldata $PGDATA | grep -E 'wal_log_hints|checksum'
# 1) Eski primary kapalı olmalı:
pg_ctl -D $PGDATA stop -m fast
# 2) Önce dry-run:
pg_rewind --target-pgdata=$PGDATA --source-server='host=<new_primary_host> port=5432 user=postgres dbname=postgres' --progress --dry-run
# 3) Gerçek rewind + standby yapılandırması (standby.signal + primary_conninfo):
pg_rewind --target-pgdata=$PGDATA --source-server='host=<new_primary_host> port=5432 user=postgres dbname=postgres' --progress --write-recovery-conf
# 4) Kaynaktan kopyalanan postgresql.auto.conf'u (port, primary_slot_name) gözden geçir, sonra başlat:
pg_ctl -D $PGDATA start

Ne yapar?

Eski primary'nin, timeline ayrıştığı noktadan sonra değişen bloklarını yeni primary'den kopyalayarak veri dizinini yeni primary ile uyumlu hale getirir; tam basebackup almadan dakikalar içinde replica'ya dönüştürür.

Ne zaman kullanılır?

Failover/promote sonrası eski primary geri geldiğinde ve yeni timeline'ın gerisinde kalan, ayrışmış değişiklikler içerdiğinde.

Dikkat

Eski primary'de failover sonrası kalan, yeni primary'ye ulaşmamış transaction'lar kalıcı olarak silinir. pg_rewind config dosyalarını (postgresql.conf, postgresql.auto.conf, pg_hba.conf) da kaynaktan kopyalar; başlatmadan önce port ve slot ayarlarını düzelt. Ayrışma noktasından itibaren gereken WAL kaynakta yoksa -c (--restore-target-wal) ile arşivden çekilmeli. Kaynak bağlantı için superuser veya dokümandaki fonksiyon yetkilerine sahip bir rol gerekir. Patroni'de bu iş use_pg_rewind: true ile otomatik yapılır.

DBAtlas'ta aç →

İlgili