High Availability Cluster İçin Pacemaker İle Virtual / Floating IP Kurulumu

High Availability Cluster kurarken en önemli aşama olan Floating IP veya diğer adıyla Virtual IP aşamasını Pacemaker ile halledeceğiz. Bu sayede Aktif/Pasif bir cluster kurulumunda kümemiz virtual IP adresi üzerinden daima erişilebilir olacaktır.

High Availability, yani yüksek erişebilirlik, günümüzün en popüler ve hayati konularından birisi olmuş durumda. Varlığınızın devamını sağlayabilmek tamamen kaynaklarınızın her daim erişilebilir olması ile birebir ilişkilidir. Bunun için de iyi yapılandırılmış bir High Availability cluster olmazsa olmaz bir bileşen durumundadır. Peki nedir High Availability?

High Availability Nedir?

High Availability, uygulamalarınızın her durumda ulaşılabilir halde olmasıdır ve temelde karşımıza iki yapıyla çıkar. Bunlardan birisi Active/Active yani Load Balancing odaklı, diğeri Active/Passive yani Failover odaklı yapılarıdır. Bu yapıları kısaca özetlersek;

  • Active/Active (Load Balancing): Sunucu kaynaklarınızın aşırı yüklenmesi sonucu artık cevap veremez hale gelmesini engellemek için bir sunucunun yükünü diğer sunucularla paylaşmasıdır. Bu aşırı yüklenme CPU, RAM, IO, Network gibi herhangi bir kaynağı temsil edebilir. Bu cluster yapılandırmasında tüm sunucular aktif durumda ve isteklere cevap verebilir haldedir.
  • Active/Passive (Failover): Çalışan cluster yapılandırmasında bir sunucu daima replikasyon halde hazır ve pasif olarak bekler. Primary veya diğer adıyla Master sunucuda bir hata meydana geldiğinde tüm trafik Secondary veya diğer adıyla Slave sunucuya yönlendirilir ve bu sunucu yeni Master sunucu konumunu alır.

Virtual / Floating IP Nedir?

Çok kısa özetlerle High Availability,yüksek erişebilirlik, teriminin ne olduğuna değindik. Ama asıl önemli nokta uygulamalarımıza daima erişebiliyor olmamızdır. Tabi bunun içinde hangi yapıyı kurarsanız kurun sürekli aktif ve erişilebilir olan bir IP adresine sahip olmamız gerekiyor. İşte bu IP adresi Floating IP veya diğer adıyla Virtual IP adresidir.

Virtual / Floating IP oluşturabilmek için Corosync ve Pacemaker servislerini kullanacağız. Nedir bu servisler dersek;

  • Corosync: Host yani node birimlerinin birbirini keşfetmesini, içlerinden birini Master olarak seçmelerini ve mesaj alışverişinde bulunabilmelerini sağlayan bir cluster layer servisidir.
  • Pacemaker: Corosync tarafından sağlanan kümenin durumu ve kaynak konfigürasyonu verildiğinde, kaynakları nerede durdurup başlatacağını hesaplar. Kümenin durumu (bir ana bilgisayar eklendiğinde veya çıkarıldığında vs.) veya kaynakların durumu (bir servis durduğunda vs.) değiştiğinde Pacemaker ne yapılacağına karar veren (örneğin, bir kaynağı başka bir ana bilgisayara taşımak, servisi yeniden başlatmak vs.) resource layer servisidir. Diğer adıyla cluster resource manager (CRM) dir.

Virtual / Floating Kurulumu

Tanımlarımızı yaptıktan sonra artık cluster kurma ve Pacemaker servisi ile virtual IP adresini aktif etmenin zamanı geldi demektir. Bunun için aşama aşama ilerleyeceğiz. Örnek kümemize bakacak olursakta bu yazımız için şu şekilde bir cluster kuracağız;

  • Active/Passive High Availability Yapısı
  • Master – CentOS 8 – [192.168.8.10]
  • Slave – CentOS 8 – [192.168.8.11]
  • Virtual IP – [192.168.8.100]

1. Sunucu Adreslerinin Hosts Dosyasına Eklenmesi

İlk iş olarak /etc/hosts dosyamıza clusterda kullanacağımız host(node) ip adreslerini ve isimlerini her iki sunucuya da ekleyeceğiz.

echo "192.168.1.10 srv1" >> /etc/hosts
echo "192.168.1.11 srv2" >> /etc/hosts

Böylece sunuculara uzun uzun ip adresleriyle değil, direkt hostnameler ile ulaşabileceğiz.

2. HighAvailability Reposunu Aktif Etme

Pacemaker, corosync, pcs gibi servisler HighAvailability reposu altında bulunur. Bunu dnf info pacemaker komutu ile görebilirsiniz. Tabi default olarak bu repo Centos 8 üzerinde disable halde olduğu için ilk olarak her iki sunucuda da aktif etmemiz gerekiyor. Bunun için şu komutu uygulayınız;

dnf config-manager --set-enabled HighAvailability

Ardından aktif olup olmadığını şu komutla kontrol edebilirsiniz;

dnf repolist all

3. Güvenlik Duvarına HighAvailability Kuralı Ekleme

Cluster için herhangi bir engelle karşılaşmamak için güvenlik duvarımıza gerekli kuralları hemen ekleyelim.

firewall-cmd --permanent --add-service=high-availability
firewall-cmd reload

4. Corosync, Pacemaker ve Pcs Servislerinin Kurulması

Corosync ve Pacemaker servislerinin ne işe yaradıklarına yukarıda değinmiştik. Bunlara ek olarak pcs (Pacemaker/Corosync Configuration System) servisi ile de kümemizin konfigürasyon ayarlarını yapacağız. Öyleyse repomuzu da aktif ettiğimize göre her iki sunucuda bu servisleri kuracağız.

dnf -y install pcs

Neden sadece pcs diye soruyorsanız; pcs servisi dependencies olarak corosync ve pacemaker servislerini de beraberinde kurar.

Kurulum ardından pcs servisinin hem başlangıçta otomatik olarak çalışması hemde şimdi başlaması için aşağıdaki komutu uygulayınız.

systemctl enable --now pcsd

5. hacluster Kullanıcısına Şifre Atanması

Cluster yapımızda sunucular arasında yetkilendirme için hacluster kullanıcısını kullanacağız. Bunun için her iki sunucuda aşağıdaki komutla hacluster kullanıcısında aynı şifreyi oluşturunuz.

passwd hacluster

!! NOT: Buraya kadar olan tüm aşamaları her iki sunucuda da uygulamalısınız. Bundan sonraki adımları ise yalnızca tek sunucuda çalıştırınız.

6. Hostlar Arasında Authentication Oluşturma

Kümemizdeki srv1 ve srv2 hostları arasında hacluster kullanıcısı ve belirlediğimiz şifre ile yetkilendirme oluşturacağız. Bunu şu komutla yapıyoruz;

pcs host auth srv1 srv2

7. Hostlar İle Cluster Oluşturma ve Başlatma

Tüm yetkilendirme işlemlerini tamamladıktan sonra artık ha_cluster ismiyle kümemizi kurabiliriz. Kurulumun ardından da clusterın başlaması için --start parametresini ekleyeceğiz.

pcs cluster setup ha_cluster --start srv1 srv2

Cluster servislerinin tüm hostlarda başlangıçta çalışabilmesi için enable etmemiz gerekiyor. Hemen halledelim.

pcs cluster enable --all

Cluster durumunu kontrol etmek ve kümenin başladığından emin olmak için ise status komutuna bakacağız.

pcs status

8. STONITH ve Quorum Devre Dışı Bırakma

Cluster yöneticisi kümedeki bir düğümün veya düğümdeki bir kaynağın durumunu belirleyemediğinde, kümeyi yeniden bilinen bir duruma getirmek için fencing kullanır. Fencing ve Stonith terimlerinin ne olduğunu öğrenmek için Tıklayınız.

Bir küme, düğümlerin yarısından fazlası çevrimiçi olduğunda yeterli çoğunluğa sahiptir. Pacemaker’ın varsayılan davranışı, kümede çoğunluk yoksa tüm kaynakları durdurmaktır. Ancak, iki düğümlü bir kümede bu mantıklı değildir; küme, bir düğüm başarısız olursa çekirdeği kaybeder. Daha fazla detay için Tıklayınız.

Bu iki özellik High Availability çok önemli olsada biz şimdilik kullanmayacağız. Bunun için ikisini de devre dışı bırakalım.

pcs property set stonith-enabled=false
pcs property set no-quorum-policy=ignore

9. Virtual / Floating IP Resource Oluşturma

Tüm hazırlıklardan sonra geldik asıl kısmımıza. Bu aşamada artık Ipaddr2 agenti ile sanal IP adresimizi oluşturacağız. Bunun için aşağıdaki komutu uygulayalım ve ardından neler yaptığımızı anlatalım.

pcs resource create virtualIP ocf:heartbeat:IPaddr2 ip=192.168.8.100 cidr_netmask=24 nic=enp0s3 op monitor interval=10s meta migration-threshold=1 resource-stickness=INFINITY target-role=Started failure-timeout=1m

Evet uzun bir kod ama ne olduğunu anladığınızda sağlam bir yeri olduğunu anlayacaksınız. Hadi kısaca anlatalım;

  • virtualIP: Kümemizde oluşturduğumuz Virtual IP resource için bir isim. Farklı bir isimde kullanabilirsiniz.
  • ocf:heartbeat:IPaddr2: Resource agentin tam adresi. Direkt Ipaddr2 de yazabilirsiniz.
  • ip=192.168.8.100: Belirlediğimiz sanal IP adresi. Boşta ve aynı blokta olduğundan emin olunuz.
  • cidr_netmask=24: Subnet mask
  • nic=enp0s3: Ip adresi ataması yapacağımız adapter adı. Sizde farklı olabilir, nmcli connection komutuyla sizdeki nic adını öğrenebilirsiniz.
  • op monitor interval=10s: Operation ekleme işlemi. Burada resource durumunu her 10 saniyede bir kotrol etmek için monitor operasyonu ekliyoruz.
  • meta: Resource için ek özellikler tanımlayabiliriz. Burada tanımladığımız özellikler şu şekilde:
  • migration-threshold=1: Resource herhangi bir nedenle durduğunda diğer node üzerine taşımadan önce tekrar çalıştırmayı kaç kere deneyeceğimiz.
  • resource-stickness=INFINITY: Resource’un node üzerinden ne kadar kalacağını belirliyoruz. Bu tanımla virtual ip masterda durmasının ardından slave cihaza taşınıp, master yeniden aktif olduğunda tekrar master üzerine taşınmaması, slave üzerinde çalışmaya devam etmesi sağlanır. Aksi halde bu taşıma esnasında gereksiz bir kesinti meydana gelecektir.
  • target-role=Started: Resource için olması gereken, hedeflenen durum
  • failure-timeout=1m: Resource failed duruma geçtiğinde yeniden işlem uygulanmadan önce beklenecek zaman aşımı.

Tüm bu konfigürasyonu gözden geçirmek isterseniz aşağıdaki komutu çalıştırabilirsiniz;

pcs resource config virtualIP

Son halde ne tekrar pcs status komutu çalıştırdığımızda resource node üzerinde aktif olduğunu göreceksiniz.

10. Test ve Sonuç

Kurulumu tamamladıktan sonra artık küçük bir test yapabiliriz. Şu anda virtual IP adresimize ping atabiliyoruz. Cihazların down olduğu halini simüle edip (bağdaştırıcıyı kapatıp) ip adresinin diğer node üzerine taşındığını görmemiz gerekiyor. Ayrıca her iki cihazda down olduğunda veya bir cihazda fail durumu gerçekleştiğinde tekrar ayağa kaldırma durumunu 1 dakika içinde görebilmeliyiz. Bu testi aşağıdaki videoda izleyebilirsiniz.