2 Kasım 2026 Pazartesi

Patroni - High Availability İçindir

Giriş
Açıklaması şöyle. Yani primary_restart_timeout süresi içinde PG ayağa kalkarsa lider değişmez.
Patroni ile yönetilen bir PostgreSQL cluster’ında lider restart olduğu halde lider neden değişmez?

HA denince akla genelde “lider gittiği an replica devreye girer” fikri geliyor. Oysa ister MSSQL Always On olsun ister Patroni, iki tarafta da kısa ve toparlanabilir bir kesinti için hemen failover yapılmıyor. Patroni tarafında bunun nasıl işlediğine bakalım.

Patroni liderliği DCS üzerinde tutulan bir lock ile yönetiyor. Lider node’daki Patroni bu lock’u düzenli olarak yeniledikçe diğer node’lar lider olmaya kalkmıyor. PostgreSQL process’i çökse bile Patroni ayaktaysa lock yenilenmeye devam ediyor ve Patroni PG’yi aynı node üzerinde tekrar başlatıyor. Failover ancak lock’un süresi dolduğunda ya da PG belirlenen süre içinde ayağa kalkamadığında devreye giriyor.

Bu tercih kesintiyi uzatıyor gibi görünse de çoğu zaman tam tersi oluyor. Yerinde bir restart genelde birkaç saniyede tamamlanır. Failover’da ise önce liderin gerçekten gittiğinden emin olmak için beklemek, ardından promote ve trafiğin yeni lidere yönlenmesi gerekir. Asenkron replikasyonda buna bir de veri kaybı riski eklenir.

Failover olduğunda işin bir de timeline tarafı var. Promote olan replica yeni bir timeline açıyor ve eski timeline’dan hangi noktada ayrıldığını bir history dosyasına yazıyor. Eski lider geri döndüğünde Patroni onun son WAL konumunu bu ayrışma noktasıyla karşılaştırıyor.

Eski liderde yeni liderin hiç görmediği kayıtlar yoksa node doğrudan replica olarak devam ediyor. Varsa ve use_pg_rewind açıksa pg_rewind bu kayıtları atıp node’u yeni liderle hizalıyor. Rewind’in çalışabilmesi için data_checksums ya da wal_log_hints açık olmalı. Rewind kapalıysa ya da başarısız olursa geriye reinit, yani replica’yı baştan kopyalamak kalıyor.

Burada sık gözden kaçan bir detay var. Asenkron modda rewind’in attığı kayıtlar, uygulamaya commit onayı verilmiş gerçek veriler olabilir. Senkron modda ise atılan kayıtlar henüz onaylanmamış işlemler. Rewind iki durumda da çalışabilir ama sonuçları aynı değil.

Bir DBA olarak bu LSN karşılaştırmalarını çoğu zaman elle yapmıyoruz, o işi Patroni yapıyor. Bize düşen, patronictl list çıktısını ve Patroni loglarını doğru okumak. Node streaming durumdaysa ve timeline’ı liderle aynıysa sorun yok. Değilse sebebi loglarda 

Hiç yorum yok:

Yorum Gönder