DEV Community

Turan Kılıç for Açıklab

Posted on

Kaptan üzerinde Patroni Postgresql Sistemi

Ortam içerisinde bulunan makineler:

  • HAProxy Sunucusu,
  • Liman1 Sunucusu,
  • Liman2 Sunucusu,
  • Kaptan1 Sunucusu (Patroni01),
  • Kaptan2 Sunucusu (Patroni02)

Sistemde amaç Liman'ın ve Liman tarafından kullanılan Postgresql'in HA (High Availability) özelliğini kazanmasını sağlamaktır.

Bu yazıda Postgresql'in HA özelliğini kazanması kısmına bakacağız. Halihazırda HAProxy, Liman'lar için çalışmaktadır, Kaptan sunucularında patroni kurulumu yapılmıştır. Eğer bu kurulumları yapmadıysanız şu linkten ulaşabilirsiniz.

Genel Sistem Yapısı ve Mimarisi

Sistemimiz aşağıdaki görseldeki gibi 5 farklı makineden oluşuyor. Bu yazıda HAProxy ve Kaptan sunucuları üzerinden anlatım yapılacaktır.

Patroni Cluster Mimarisi

1. ETCD Servisinin Kurulması ve Konfigürasyonu

İlk olarak mimaride, üzerinde çalışılacak 3 sunucu (HAProxy, Kaptan1, Kaptan2) içerisinde ETCD servisinin kurulu olması gerekmektedir. Bu aşağıdaki komut ile gerçekleştirilebilir:

sudo yum install etcd
Enter fullscreen mode Exit fullscreen mode

veya

sudo apt install etcd
Enter fullscreen mode Exit fullscreen mode

Daha sonra her sunucu üzerinde etcd servisinin conf dosyası üzerinde konfigürasyon yapılır. Bu işlemi servisin içerisinde yazan env-file içerisinde yapmamız gerekiyor. İşlemi garantiye almak için her sunucu üzerinde aşağıdaki iki dosyanın içeriği düzenlenmelidir.

  1. "/etc/etcd/etcd.conf" dosyası,
  2. "/etc/default/etcd" dosyası

Dosyaların içerikleri aşağıdaki gibi düzenlenir:

ETCD_NAME="ha"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://HA_IP_ADRESİ:2380"
ETCD_LISTEN_PEER_URLS="http://localhost:2380,http://HA_IP_ADRESİ:2380"
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://HA_IP_ADRESİ:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://HA_IP_ADRESİ:2379"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_INITIAL_CLUSTER="ha=http://HA_IP_ADRESİ:2380,kaptan1=http://KAPTAN1_IP_ADRESİ:2380,kaptan2=http://KAPTAN2_IP_ADRESİ:2380"
ETCD_INITIAL_CLUSTER_STATE="new"

ETCDCTL_API=2
enable-v2: true 
Enter fullscreen mode Exit fullscreen mode

Kaptan1 ve Kaptan2 sunucusu üzerinde de aynı dosyalar çapraz olarak düzenlenir. Burada dikkat edilmesi gereken hususlar:

  1. ETCD_NAME= Sunucuya özel olmalıdır. Yani bu değişkenin içeriği her sunucuda farklı olmalıdır (Benim durumumda HAProxy üzerinde = ha,Kaptan1 üzerinde= kaptan1, Kaptan2 üzerinde= kaptan2)
  2. ETCD_INITIAL_CLUSTER_TOKEN= Her sunucuda aynı olmak zorundadır. Yoksa iletişim kuramazlar.
  3. ETCD_INITIAL_CLUSTER= İçerisinde verilen birimlerin isimlerine dikkat edilmelidir. (ha, kaptan1, kaptan2 ve ip adresleri)
  4. HA_IP_ADRESI yazan yerlere hangi sunucu üzerindeki etcd conf dosyasını düzenliyorsanız o sunucunun ip adresini vermelisiniz.
  5. Portlara çok dikkat etmelisiniz 2379 ve 2380 portları dinleme - haberleşme ve sistemin çalışması için doğru ayarlanmalıdır.

Eğer 3 sunucu üzerinde de bu işlemleri başarılı bir şekilde yaptıysanız her sunucu üzerindeki etcd servisini başlatabilir ve enable hale getirebilirsiniz.

sudo systemctl enable etcd.service
sudo systemctl start etcd.service
Enter fullscreen mode Exit fullscreen mode

ETCD Kontrolü

ETCD kurulumunun başarılı olduğunu anlamak için aşağıdaki komut sunucu üzerinde çalıştırılır ve portların işlevlerini yerlerine getirip getirmedikleri bakılır.

ss -tlpn | grep etcd
Enter fullscreen mode Exit fullscreen mode

Örnek kullanım aşağıdaki gibidir:
ss komutu kullanımı

Blurlu kısımda sunucunuzun ip adresi yazmalıdır. 3 sunucu üzerinde de bu şekilde sonuç alıyorsanız, etcd kurulumu doğrudur demektir.

Patroninin ETCD ile Eşlenmesi

Bu kısımda kurulumu yapılmış olan patroni servisinin conf dosyası açılır

sudo nano /etc/patroni.yml
Enter fullscreen mode Exit fullscreen mode

Gerekli etcd satırı örnekteki gibi değiştirilir.

etcd:
    hosts: HA_IP:2379,KAPTAN1_IP:2379,KAPTAN2_IP:2379
Enter fullscreen mode Exit fullscreen mode

Gerekli değerin kesinlikle hosts olduğundan emin olun. Bu değer normalde host olarak gelmektedir. Host ise çoklu yapıyı desteklememektedir.

Bu işlemi yaptıktan sonra patroni servisine restart atarak leader olup olmadıklarına bakabilirsiniz.

sudo systemctl restart patroni
sudo systemctl status patroni
Enter fullscreen mode Exit fullscreen mode

Eğer Postgressql İle Sorun Yaşarsanız

Patroni'nin dosyalarının sahipliklerine ve izinlerine dikkat edin. "/data/patroni" dizininin sahiplikleri aşağıdaki komutlar ile ayarlanmalıdır.

sudo chown -R postgres:postgres /data/
sudo chmod -R 700 /data/
Enter fullscreen mode Exit fullscreen mode

Postgressql'in 5432'den dinlediğinden emin olun.

ss -tlpn | grep postgres
Enter fullscreen mode Exit fullscreen mode

Eğer dinleme yapmıyorsa patroni.yml dosyası içerisinde postgresql ayarlarınızı gözden geçirmelisiniz.

Sadece bir patroni üzeride sıkıntı yaşıyorsanız, o node'u yeniden reinit edebilirsiniz. Bu sakıncalı bi işlem olup /data/patroni dizinini yok edebilmektedir. Böyle bir durumda diğer patroninin /data/patroni dizinini kopyalayabilirsiniz.

patronictl -c /etc/patroni.yml reinit patroni_cluster_ismi node_ismi
Enter fullscreen mode Exit fullscreen mode

Kopyalama sonrası sahipliklere ve izinlere dikkat edilmelidir. Eğer ".swp" uzantılı bir sorun yaşıyorsanız postgres çalışmıyor hatasında, o vakit diğer node üzerinden (anlık olarak leader olan node) o gizli dosyayı secondary düğümlere kopyalayabilirsiniz.
Bu işlemlerden sonra servisi yeniden başlatıp çalışırlığını kontrol etmekte fayda var.

sudo systemctl restart patroni
sudo systemctl status patroni
Enter fullscreen mode Exit fullscreen mode

Top comments (1)

Collapse
 
gungordemirhan profile image
gungordemirhan

Merhaba,
Patronictl ile listediğimizde;
Role : sync standby
State : streaming
Olarak görünüyor.
Normalde replice ve running olması gerekmez miydi ?

Teşekkürler.