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:

bash
PG 17
patronictl -c /etc/patroni/patroni.yml list
sql
PG 17
+ 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

bash
PG 17
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.

Dikkat

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:

bash
PG 17
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:

bash
PG 17
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:

bash
PG 17
patronictl -c /etc/patroni/patroni.yml resume
Dikkat

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.