VDS sunucularında yüksek erişilebilir, bölünmüş beyin (Split-Brain) korumalı ve sıfır veri kayıplı (RPO=0) PostgreSQL mimarisi planlayın. Patroni, etcd Raft konsensüsü, pg_auto_failover ve CockroachDB için RTO/RPO sürelerini, yazma gecikmesini ve AWS Aurora TCO tasarrufunu simüle edin.
VDS sunucularında etcd Raft konsensüsüyle sıfır veri kayıplı (RPO=0) ve bölünmüş beyin (Split-Brain) korumalı PostgreSQL kümesi kurun.
Lider düğüm etcd üzerindeki anahtarı yenileyemezse (TTL süresi dolunca), etcd liderliği düşürür ve en güncel WAL konumuna sahip standby düğüm yeni lider seçilir.
Kurulumu kolaydır ancak durum makinesi tek bir PostgreSQL monitör düğümüne bağlıdır. Monitör düğümünün ağ izolasyonunda küme kararsız hale gelebilir.
Tüm düğümler yazabilir ancak her yazma işlemi 2PC ve Raft turu gerektirdiği için gecikme PostgreSQL'e göre 3-4 kat daha yüksektir.
Geleneksel Pacemaker/Corosync yapılandırmaları, STONITH (Shoot The Other Node In The Head) donanımsal güç yönetimi olmadığında ağ bölünmelerinde her iki sunucunun da kendini lider ilan etmesi (Split-Brain) riski taşır.
Patroni bu problemi modern dağıtık sistemler teorisiyle çözer. Kümenin liderliği, etcd veya Consul üzerindeki bir anahtardır (key). Lider düğüm her `loop_wait` (ör. 10 saniye) periyodunda bu anahtarı günceller. Eğer lider düğüm kilitlenir veya ağdan koparsa, `ttl` süresi (30 sn) dolduğunda etcd anahtarı serbest bırakır. Standby düğümler arasında en güncel LSN (Log Sequence Number) WAL verisine sahip olan düğüm yeni lider olarak seçilir.
Finans, e-ticaret ve kritik sistemlerde tek bir işlemin dahi kaybolmaması (RPO = 0) zorunludur. PostgreSQL `synchronous_commit = on` modu ile bir transaction commit edildiğinde, en az bir standby düğümün WAL kaydını kendi diske yazdığı teyit edilene kadar istemciye başarılı yanıt verilmez.
Patroni'nin `synchronous_mode_strict: true` ayarı, tek bir standby dahi erişilemez olduğunda veri tutarsızlığını önlemek için ana sunucuyu yazmaya kapatır. Bu sayede hiçbir durumda asenkron sapma veya veri kaybı yaşanmaz.
PostgreSQL kümesinde failover yaşandığında uygulamaların IP adresini manuel değiştirmesi gerekmez. Patroni her düğümde bir REST API (varsayılan 8008 portu) çalıştırır.
Düğüm Lider (Primary) ise HTTP 200 döner; standby ise HTTP 503 döner. Yazma havuzu doğrudan lider düğüme yönlenir.
Düğüm Standby/Replica ise HTTP 200 döner. Okuma (Read-Only) sorguları tüm replikalar arasında dengelenir.
Çöken eski lider geri döndüğünde veritabanını sıfırdan kopyalamak yerine WAL farkını geri sararak (rewind) saniyeler içinde standby olur.