DEV Community

Abdulkadir Erbas
Abdulkadir Erbas

Posted on • Edited on

Patroni Nedir?

Patroni, PostgreSQL veritabanları için yüksek erişilebilirlik (High Availability - HA) çözümü sağlayan bir açık kaynak projesidir. Patroni, PostgreSQL replikasyonu ve failover (bir sunucunun başarısız olması durumunda otomatik olarak başka bir sunucuya geçiş) süreçlerini yöneterek, veritabanının kesintisiz ve güvenli bir şekilde çalışmasını sağlar.

Not: Replikasyon, yedek veritabanı sunucularının ana sunucudan veri almasına denir.

Not: Failover, ana veritabanı sunucusunun müsait olmadığı durumlarda, müsait olan başka bir sunucunun ana sunucu olarak seçilmesine denir.
 

Zabbix ile Patroni İlişkisi

Zabbix, ağ izleme, sunucu izleme ve sistem yönetimi amacıyla kullanılan açık kaynak kodlu bir yazılımdır. Zabbix'in Patroni'nin sunduğu REST API üzerinden izleme yapabilmesi mümkündür. Bu entegrasyon sayesinde, PostgreSQL kümelerinin sağlık durumu, failover süreçleri ve sistem performansı gibi önemli metrikler izlenebilir ve gerektiğinde uyarılar oluşturulabilir.

Patroni REST API'si

Patroni, PostgreSQL kümelerinin sağlık durumunu ve yönetimini kontrol edebileceğiniz bir REST API sunar. Bu API sayesinde Patroni nodlarının durumu, eşzamanlı yedek olup olmadığı ve küme bilgileri gibi çeşitli verilere ulaşabilirsiniz.

Önemli Endpoint'ler

  • /sync: Patroni'nin bu nodunun synchronous standby olup olmadığını kontrol eder. Eğer bu nod eşzamanlı yedek modunda çalışıyorsa, HTTP 200 yanıtı döner.

  • /patroni: Patroni nodunun genel sağlık durumunu ve yapılandırmasını döner. Bu, nodun doğru çalışıp çalışmadığını öğrenmek için kullanılabilir.

Not: Synchronous standby, veritabanı replikasyonu sırasında kullanılan bir moddur. Bu modda, ana sunucu (primary) veritabanında yapılan bir işlemin (örneğin bir kayıt ekleme, güncelleme, vb.) tamamlanması için bu işlemin en az bir yedek sunucuya (standby) başarılı bir şekilde yazıldığının onaylanması gerekir. Bu, eşzamanlı (synchronous) replikasyon olarak adlandırılır. Yüksek veri güvenliği sağlarken, sistemi yavaşlatabilir.

 

Etcd ve DCS Arasındaki İlişki

Etcd, bir DCS uygulamasıdır. Her iki kavram da dağıtık sistemler için merkezi ve tutarlı yapılandırma amacına hizmet eder. Etcd, DCS'nin bir türü olarak düşünülebilir.

 

Patroni Sağlık Durumları

  1. Healthy Cluster (Sağlıklı Bir Küme):

    Veritabanı replikasyonu ve failover mekanizmaları düzgün çalışmaktadır.

  2. Unlocked Cluster (Kilitlenmemiş Bir Küme):

    Liderlik sürecinin başarıyla tamamlandığını ve kümenin kilitlenme sorunu olmadığını ifade eder.

    Not: Kilitlenme sorunu, Patroni’nin DCS ile etkileşiminde bir aksaklık yaşadığını ve liderliği belirlemek için gerekli kilidi alamadığını gösterir. Bu da lider sunucunun belirlenememesine, aynı anda birden fazla ana sunucunun bulunmasına ve failover'in gerçekleşmemesine neden olabilir.

  3. Unlocked Cluster with DCS Failsafe Mode Enabled (Kilitlenmemiş ve DCS Failsafe Modu Aktif Bir Küme):

    Kilitlenme sorunu yoktur, ancak DCS erişim problemi olduğunda failsafe modu devreye girmiştir.

    Not: DCS (Distributed Configuration Store), Patroni gibi dağıtık sistemlerde veritabanı kümelerini yönetmek için kullanılan merkezi bir yapılandırma deposudur. DCS, kümedeki sunucuların mevcut durumlarını paylaşmalarını sağlar. Her sunucu, kendi durumu ve rolü hakkında bilgiyi DCS'ye yazar. Örneğin, bir sunucu ana sunucu rolünü üstlendiğinde, bu bilgi DCS üzerinden diğer sunuculara dağıtılır.

    Not: DCS Failsafe Modu, Patroni’nin DCS’ye erişimde sorun yaşadığında bile kümenin devam etmesini sağlayan bir güvenlik önlemidir. Bu mod sayesinde küme, DCS'ye erişim olmadan da belirli bir süre çalışmaya devam edebilir.

  4. Cluster with the Pause Mode Enabled (Durdurulmuş Modda Çalışan Bir Küme):

    Kümenin yönetim işlemlerinin geçici olarak askıya alındığı bir durumdur. Küme çalışmaya devam eder, ancak failover ve otomatik yönetim işlemleri durdurulur.

 

Healthy Cluster için örnek bir response

Patroni'nin bir PostgreSQL kümesinin sağlık durumunu ve mevcut durumu hakkında bilgi verir.

$ curl -s http://localhost:8008/patroni | jq .
{
  "state": "running",
  "postmaster_start_time": "2024-08-28 19:39:26.352526+00:00",
  "role": "primary",
  "server_version": 160004,
  "xlog": {
    "location": 67395656
  },
  "timeline": 1,
  "replication": [
    {
      "usename": "replicator",
      "application_name": "patroni2",
      "client_addr": "10.89.0.6",
      "state": "streaming",
      "sync_state": "async",
      "sync_priority": 0
    },
    {
      "usename": "replicator",
      "application_name": "patroni3",
      "client_addr": "10.89.0.2",
      "state": "streaming",
      "sync_state": "async",
      "sync_priority": 0
    }
  ],
  "dcs_last_seen": 1692356718,
  "tags": {
    "clonefrom": true
  },
  "database_system_identifier": "7268616322854375442",
  "patroni": {
    "version": "4.0.0",
    "scope": "demo",
    "name": "patroni1"
  }
}
Enter fullscreen mode Exit fullscreen mode

Bu JSON yanıtı, Patroni'nin veritabanı kümesinin sağlıklı bir durumda olduğunu ve replikasyon süreçlerinin aktif bir şekilde çalıştığını göstermektedir.

Açıklama:

  1. state: "running"

    • Bu, Patroni'nin şu anda çalıştığını gösterir. Küme sağlıklı bir durumda.
  2. postmaster_start_time: "2024-08-28 19:39:26.352526+00:00"

    • PostgreSQL sunucusunun (postmaster) en son ne zaman başlatıldığını belirtir. Bu tarih ve saat, sunucunun ne kadar süreyle çalıştığını anlamaya yardımcı olur.
  3. role: "primary"

    • Bu, bu sunucunun şu anda "ana" (primary) sunucu olduğunu gösterir. Ana sunucu, veritabanı yazma işlemlerini gerçekleştiren sunucudur.
  4. server_version: 160004

    • Bu, PostgreSQL sunucusunun sürüm numarasını belirtir. 160004, PostgreSQL 16.0 sürümüne işaret eder.
  5. xlog:

    • location: 67395656
      • Bu, XLOG'un (yazma işlemleri için kullanılan günlük) mevcut konumunu belirtir. Bu bilgi, veritabanının güncellemelerini takip etmek için kullanılır.
  6. timeline: 1

    • Bu, veritabanının zaman çizelgesini belirtir. Her yeni zaman dilimi, bir veritabanı yedeğinden geri yükleme veya başka bir durum değişikliği olduğunda artırılır.
  7. replication:

    • Bu alan, mevcut replikasyon durumunu gösterir. İki replikatör bilgisi var:
      • usename: replicator
      • Replikasyon işlemlerinde kullanılan kullanıcı adı.
      • application_name: patroni2 ve patroni3
      • Bu replikatörlerin hangi uygulama tarafından kullanıldığını belirtir.
      • client_addr: 10.89.0.6 ve 10.89.0.2
      • Replikatörlerin IP adresleri.
      • state: "streaming"
      • Replikatörlerin şu anda aktif bir şekilde veri akışı sağladığını gösterir.
      • sync_state: "async"
      • Replikatörlerin asenkron modda çalıştığını belirtir. Bu, ana sunucuda yapılan işlemlerin replikatörlere hemen iletilmediği anlamına gelir.
      • sync_priority: 0
      • Asenkron replikasyon durumunda öncelik sırasını belirtir. Bu örnekte, tüm replikatörlerin eşit önceliği vardır.
  8. dcs_last_seen: 1692356718

    • Bu, DCS (Distributed Configuration Store) ile en son etkileşim zamanını UNIX zaman damgası formatında belirtir. Bu, DCS'nin güncel durumunu anlamaya yardımcı olur.
  9. tags:

    • clonefrom: true
      • Bu, bu sunucunun başka bir sunucudan klonlandığını gösterir.
  10. database_system_identifier: "7268616322854375442"

    • Bu, veritabanı sisteminin benzersiz tanımlayıcısını belirtir. Her PostgreSQL sistemi için farklıdır ve sistemin tanımlanmasında kullanılır.
  11. patroni:

    • version: "4.0.0"
      • Patroni'nin sürümünü belirtir.
    • scope: "demo"
      • Bu, Patroni kümesinin kapsamını belirtir; genellikle "demo" veya "production" gibi değerler alır.
    • name: "patroni1"
      • Bu, Patroni node'unun adını belirtir. Bu, küme içinde diğer node'larla tanımlamak için kullanılır.

 
Daha fazla bilgi için Patroni'nin Resmi Sayfası'na göz atabilirsiniz.

Patroni kurulumu hakkında bilgi almak için Patroni ve Etcd Kullanarak Cluster Yapılandırması başlıklı yazıma göz atabilirsiniz.

Top comments (0)