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.
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.
- "/etc/etcd/etcd.conf" dosyası,
- "/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:
- 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)
- ETCD_INITIAL_CLUSTER_TOKEN= Her sunucuda aynı olmak zorundadır. Yoksa iletişim kuramazlar.
- ETCD_INITIAL_CLUSTER= İçerisinde verilen birimlerin isimlerine dikkat edilmelidir. (ha, kaptan1, kaptan2 ve ip adresleri)
- HA_IP_ADRESI yazan yerlere hangi sunucu üzerindeki etcd conf dosyasını düzenliyorsanız o sunucunun ip adresini vermelisiniz.
- 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:
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