Kaptan üzerinde Patroni Postgresql Sistemi
Tags: liman, postgres, patroni, cluster
Published: 2022-07-28 13:38:00

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.](https://dev.to/aciklab/postgresql-kumelemede-patroni-kullanimi-48mn)

## 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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hzpaujopoevi0eaq2u76.png)


## 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
```
veya
```
sudo apt install etcd
```

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 
```

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
```

### 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
```
Örnek kullanım aşağıdaki gibidir:
![ss komutu kullanımı](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y8puaar1u7gveulc2qz4.png)
 
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
```

Gerekli etcd satırı örnekteki gibi değiştirilir.
```
etcd:
    hosts: HA_IP:2379,KAPTAN1_IP:2379,KAPTAN2_IP:2379
```
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
```
## 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/
```

Postgressql'in 5432'den dinlediğinden emin olun.
```
ss -tlpn | grep postgres
```
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
```

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
```