Patroni kümesinde lider'i elle devretmek, planlı bakımın en sık ihtiyacıdır: birincil düğüme kernel güncellemesi atacaksın, ama kesinti istemiyorsun. Doğru komut failover değil switchover'dır — ve ikisini karıştırmak veri kaybına açılan kapıdır.
switchover ≠ failover
switchover, sağlıklı bir kümede kontrollü devirdir: Patroni önce hedef replica'nın güncel olduğunu doğrular, primary'yi düzgün kapatır, sonra terfi ettirir. Veri kaybı olmaz.
failover, primary zaten çöktüğünde çalışır; "en güncel replica'yı terfi ettir" der ve bir miktar veri kaybını (asenkron replikasyonda) göze alır.
Planlı bakımda her zaman switchover kullan.
Kümenin durumunu gör
Önce mevcut topolojiyi ve replica'ların güncelliğini kontrol et:
patronictl -c /etc/patroni/patroni.yml list
+ Cluster: pg-prod ---+--------------+---------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+--------+-------------+--------------+---------+----+-----------+
| pg-01 | 10.0.0.11 | Leader | running | 8 | |
| pg-02 | 10.0.0.12 | Replica | running | 8 | 0 |
| pg-03 | 10.0.0.13 | Replica | running | 8 | 4 |
+--------+-------------+--------------+---------+----+-----------+
Hedef olarak Lag'i 0 olan replica'yı seç (pg-02). Lag'li bir düğüme devretmek, o farkın kaybı demektir.
switchover
patronictl -c /etc/patroni/patroni.yml switchover \
--leader pg-01 \
--candidate pg-02 \
--scheduled now
Patroni önce pg-02'nin pg-01'i yakalamasını bekler, sonra devreder. Birkaç saniye içinde pg-02 yeni lider olur, list çıktısında timeline (TL) 8'den 9'a çıkar.
switchover sırasında kısa bir yazma kesintisi olur (tipik olarak 1-5 saniye). Uygulama tarafında bir bağlantı havuzu / retry mantığı yoksa, o anki transaction'lar hata alır. "Sıfır kesinti" değil, "kontrollü ve kısa kesinti"dir — uygulamayı buna göre hazırla.
Geri almak
Bakım bitti, lider'i pg-01'e geri almak istiyorsun. Bu da bir switchover'dır — "rollback" diye ayrı bir komut yoktur:
patronictl -c /etc/patroni/patroni.yml switchover \
--leader pg-02 \
--candidate pg-01 \
--scheduled now
Eski primary (pg-01) bu arada replica olarak kümeye geri katılmış ve senkronize olmuş olmalı. list ile Lag'inin 0 olduğunu doğrulamadan geri devretme.
Bakım için: devretmeden düğümü izole etmek
Bazen lider'i devretmek değil, bir replica'yı bakımdan geçirirken Patroni'nin ona failover yapmasını engellemek istersin. Düğümü geçici olarak duraklat:
patronictl -c /etc/patroni/patroni.yml pause --wait
pause moduna alınan kümede Patroni otomatik failover yapmaz; PostgreSQL'i elle durdurup başlatabilirsin. Bittiğinde:
patronictl -c /etc/patroni/patroni.yml resume
pause moduna aldığın kümede otomatik failover devre dışıdır. Bu sırada primary gerçekten çökerse Patroni devralmaz — küme yazılamaz kalır. pause'u en kısa sürede aç ve bu pencerede primary'yi izlemeyi bırakma.
Özet
Planlı işlemde switchover, çökmede failover. Her zaman Lag'i 0 olan adayı seç. Geri alma da bir switchover'dır; eski primary'nin replica olarak senkronize olmasını bekle. Tek düğüm bakımında pause/resume kullan ama otomatik failover'ın kapalı olduğunu unutma.