Patroni + etcd + HAProxy ile otomatik failover cluster'ı
PostgreSQLSeviye: İleriSüre: 2–3 saatOtomatik failover'lı PostgreSQL cluster'ını kurar ve işletir: her node'da PostgreSQL'i Patroni yönetir, leader seçimi 3 (ya da 5) üyeli etcd'de yapılır, uygulamalar HAProxy'nin yazma (5000) ve okuma (5001) portlarına, isteğe bağlı keepalived VIP'i üzerinden bağlanır. Kurulumun yanında kurulu cluster için işletim senaryoları vardır: sağlık kontrolü, switchover, eski leader'ı geri katma, reinit, node ekleme/çıkarma, edit-config, pause, Patroni yükseltme, tam kapatma/açma, etcd üye değişimi ve etcd çoğunluğu kaybı. pg-install rehberi Patroni node'larında kullanılmaz (initdb'yi Patroni kendisi yapar); Patroni'siz, failover'ı elle yapılan HA için pg-streaming rehberini kullanın.
Yapı: 3 PostgreSQL + etcd node'u (ortak ya da ayrı) + HAProxy (+ VIP)
Senaryolar
- Kurulum: yeni Patroni cluster'ı — Sıfırdan etcd + Patroni + HAProxy (+ VIP) cluster'ı kurulur. Sunucularda PostgreSQL cluster'ı olmamalı: initdb'yi Patroni yapar (pg-install uygulanmaz).
- İşletim runbook'u: switchover, failover testi, bakım modu, parametre değişikliği — Yeni kurulmuş cluster'da temel işlemleri sırayla dener: durum, switchover, failover testi (lider durdurulur, kısa yazma kesintisi), bakım modu, parametre değişikliği. Bakım penceresinde uygulayın.
- Cluster sağlıklı mı? (sağlık kontrolü) — Salt okunur: roller, gecikme, timeline, REST API, etcd sağlığı, slotlar, bekleyen restart ve bakım modu.
- Planlı switchover (leader'ı başka node'a al) — Bakım öncesi leader rolü kontrollü olarak bir replica'ya geçer; birkaç saniyelik yazma kesintisi, veri kaybı yok.
- Failover oldu, eski leader geri katılmıyor (pg_rewind / reinit) — Çöken eski leader açılınca replica olarak katılmalı; pg_rewind başarısızsa veri dizini leader'dan yeniden kurulur.
- Bir replica'yı sıfırdan yeniden kur (reinit) — Replica bozuk, çok geride ya da WAL'ı kaybetti: veri dizini silinir ve leader'dan (ya da yedekten) yeniden kurulur. Leader etkilenmez.
- Cluster'a yeni node ekle — Yeni node'u formdaki listenin sonuna ekleyin: yazılım kurulur, mevcut node'larda pg_hba ve HAProxy güncellenir, replica olarak katılır.
- Cluster'dan node çıkar — Replica olan bir node kalıcı olarak çıkarılır: Patroni durdurulur, DCS kaydı ve slot temizlenir, HAProxy'den kaldırılır.
- PostgreSQL ya da Patroni ayarını değiştir (edit-config) — Ayar DCS'ye yazılır, tüm node'lara uygulanır; restart gerektiren ayarlarda restart --pending (önce replica'lar).
- Bakım için otomatik failover'ı durdur (pause / resume) — Pause'da Patroni PostgreSQL'e dokunmaz ve failover yapmaz; ağ/etcd bakımı ya da elle müdahale için. İş bitince resume.
- Patroni yazılımını yükselt (rolling) — Cluster pause'a alınır, node node Patroni güncellenip yeniden başlatılır; PostgreSQL kapanmaz, failover olmaz.
- Tüm cluster'ı durdur / başlat (doğru sıra) — Planlı tam kapatma (depolama, veri merkezi bakımı): önce replica'lar, sonra leader, en son etcd; açılış tersi sırada.
- etcd üyesini değiştir ya da ekle (etcdctl member) — Bozulan etcd üyesi çıkarılıp yeni sunucu eklenir (ya da üye sayısı artırılır); Patroni'nin etcd listesi güncellenir.
- etcd çoğunluğu kayboldu: leader salt okunur oldu — etcd quorum'u yoksa Patroni leader'ı salt okunur yapar, failover da olmaz. etcd geri getirilir ya da tek üyeden yeniden kurulur.
Başlamadan önce
- PostgreSQL node'larında çalışan ya da önceden oluşturulmuş bir PostgreSQL cluster'ı yok ve … boş (Patroni cluster'ı kendisi oluşturur). pg-install rehberi bu sunucularda uygulanmadı.
- Tüm sunucular aynı işletim sistemi sürümünde ve güncel; saatler NTP ile eşit (etcd ve Patroni saat kaymasına duyarlıdır).
- PostgreSQL node'larında RAM … GB; … ayrı disk/LV üzerinde ve tüm node'larda aynı boyutta.
- etcd verisi (/var/lib/etcd) düşük gecikmeli diskte (SSD). Yavaş disk lider seçimlerini bozar; yoğun I/O'lu PostgreSQL verisiyle aynı diskte olmaması önerilir.
- Dikkat: etcd node sayısı … (çift). Çift sayı arıza toleransını artırmaz; 3 ya da 5 kullanın.
- Sunucular birbirine şu portlardan erişebiliyor: PostgreSQL …, Patroni REST 8008, etcd 2379/2380, HAProxy 5000/5001/7000…, VRRP (IP protokol 112)…. Aradaki ağ cihazlarında da bu kurallar açık.
- Sunucular PGDG repo'suna (download.postgresql.org…, apt.postgresql.org…) ve etcd için github.com'a HTTPS ile çıkabiliyor ya da kurum içi mirror tanımlı.
- VIP … boş (hiçbir sunucuda kullanılmıyor) ve ağ (sanallaştırma/bulut) VRRP'ye ve aynı IP'nin sunucular arasında taşınmasına izin veriyor. Bulut ortamlarında çoğunlukla izin verilmez; yerine bulut load balancer'ı kullanın.
- Dikkat: VIP için tek HAProxy sunucusu var; sunucu düşerse VIP taşınacak yer olmaz.
- Tüm sunucularda root ya da sudo yetkisi; bakım penceresi ve geri dönüş planı hazır.
- …: diğer node'larla aynı işletim sistemi ve PostgreSQL ana sürümü kurulabilir durumda, … için diğer node'lar kadar disk, saat NTP ile eşit; diğer node'lara …, 8008 ve etcd 2379 erişimi açık.
- … (…): düşük gecikmeli disk (SSD), saat NTP ile eşit, diğer etcd üyelerine 2379/2380 ve PostgreSQL node'larından 2379 erişimi açık; github.com'a erişim ya da etcd arşivi /tmp'de.
Rehberin aşamaları
- Hazırlık (tüm sunucular) — Sunucu adlarını /etc/hosts'a ekle · Saat eşitlemesini (chrony) etkinleştir · Çekirdek ayarları ve THP · Firewall kuralları (PostgreSQL node'ları) · Firewall kuralları (etcd sunucuları) · Firewall kuralları (HAProxy sunucuları)
- etcd cluster'ı — etcd yazılımını kur · etcd yazılımını kur · etcd yapılandırması: … · etcd systemd servisini oluştur · etcd systemd servisini oluştur · etcd'yi başlat (tüm etcd node'larında aynı anda) …
- PostgreSQL ve Patroni yazılımı — PGDG repo'sunu ekle · PGDG repo'sunu ekle · PostgreSQL ve Patroni'yi kur · Bağımsız PostgreSQL servisini kapat ve dizinleri hazırla
- Patroni yapılandırması — Parolaları ortam dosyasına yaz · Patroni servisine ortam dosyasını bağla · patroni.yml: … · Yapılandırmayı doğrula
- Cluster'ı başlat — İlk node'da Patroni'yi başlat · Diğer node'larda Patroni'yi başlat: … · Cluster durumunu kontrol et
- HAProxy — HAProxy'yi kur · HAProxy'yi kur · haproxy.cfg yaz · haproxy.cfg yaz · HAProxy'yi doğrula ve başlat · HAProxy'yi doğrula ve başlat
- keepalived ile VIP — keepalived'i kur · keepalived'i kur · keepalived yapılandırması: … · keepalived'i başlat · keepalived'i başlat
- Uygulama kullanıcısı ve bağlantı testi — Uygulama kullanıcısı ve veritabanı · Uygulama kullanıcısına parola ver · REST API health check uçlarını kontrol et · HAProxy üzerinden bağlantıyı dene · Uygulama bağlantı dizesi
- Kurulum sonrası — etcd snapshot yedeğini al · etcd snapshot yedeğini al · Yedeklemeyi kur (zorunlu) · İzlemeyi bağla
- Cluster durumu — Üyeler, roller ve gecikme
- Planlı switchover — Switchover yap
- Failover testi (lideri durdur) — Lider node'da Patroni'yi durdur · Yeni lideri izle · Eski lideri geri başlat
- Bakım modu (pause) — Cluster'ı bakım moduna al · Bakımı yap · Bakım modundan çık
- Parametre değişikliği — Parametreyi tüm cluster'da değiştir · Bekleyen yeniden başlatmaları uygula
- Sağlık kontrolü (salt okunur) — Üyeler, roller, timeline ve gecikme · Son lider değişimleri (history) · REST API sağlık uçları · etcd sağlığı · Replikasyon gecikmesi, slotlar ve bekleyen restart (leader'da) · Yapılandırma ve bakım modu
- Planlı switchover — Switchover öncesi kontrol · Switchover yap · Yeni leader'ı ve eski leader'ın geri katılmasını doğrula
- Bakım modu (pause / resume) — Pause öncesi kontrol · Cluster'ı bakım moduna al (pause) · Bakımı yap · Bakım modundan çık (resume)
- Patroni yükseltme: hazırlık — Mevcut ve hedef Patroni sürümü · Yapılandırmayı yedekle ve doğrula · Cluster'ı bakım moduna al (pause)
- Patroni yükseltme: bitiş — Bakım modundan çık (resume)
- Cluster'ı durdur (replica → leader → etcd) — Durum ve rolleri kaydet · Uygulamaları durdur · Replica'larda Patroni'yi durdur · Leader'da Patroni'yi durdur · etcd'yi durdur
- Cluster'ı başlat (etcd → son leader → replica'lar) — etcd'yi başlat (tüm etcd üyelerinde aynı anda) · etcd sağlığını doğrula · Önce son leader'da Patroni'yi başlat · Replica'larda Patroni'yi başlat · Cluster'ı doğrula ve uygulamaları aç
- Teşhis: etcd çoğunluğu kaybı — Belirtileri doğrula: leader yok, PostgreSQL salt okunur · etcd üyelerinin durumunu gör
- Yol A: etcd üyelerini geri getir — Yol A: etcd servislerini başlat · Patroni'nin toparlandığını doğrula
- Doğrulama ve önlem — etcd ve Patroni'yi doğrula, failsafe'i değerlendir