Merhaba,

Çoğu sistemi incelediğimde, web ve veritabanı ortamları yedekli çalışacak veya cluster olacak şekilde yapılandırılıyor. Ancak işin üst segmenti olan yük dengeleyici ve dns mimarisinin performans ve erişilebilirliği çok incelenmiyor.

İşte bu anlatımda iki farklı veri merkezi üzerinde çalışan (örneğin 2 İstanbul ve 2 İzmir) HAProxy makinasını hem kendi içinde hem de region bazlı nasıl yedekli çalıştırabileceğinizden bahsedeceğim.

Bu yapı AWS Route53 ve Cloudfront’un benzer yedekliliğine sahiptir. Bu makale iki seriden oluşacak. (İlk kısım Load Balancer zone yedekliliği ve ikinci kısım da DNS yedekliliği.) HAProxy kurulum ve yapılandırmasını anlatırken, kurduğunuz HAProxy’i nasıl HA çalıştırabileceğinizden bahsedeceğim. Önce sunucularınızın hostnamelerini düzenleyin.

hostname haproxy1.vahap.net
vi /etc/hostname

CentOS – RHEL üzerine kurulum yapacağım için yum ile kurulumu başlatıyorum ve haproxy kullanıcısını ekliyorum.

yum install haproxy -y
useradd haproxy

Kurulumu tamamladıktan sonra HAProxy config dosyasını yedeklemelisiniz. Bunun için de /etc/haproxy içindeki haproxy.cfg dosyasını yedekleyin.

cd /etc/haproxy
mv haproxy.cfg haproxy.cfg_yedek
cp haproxy.cfg_yedek haproxy.cfg

Bir metin editörüyle config dosyasını açın. Configi silin. Hazırladığım default config tanımlarım aşağıdadır. Kendi yapınızda kullanabilir ve kendinize göre düzenleyebilirsiniz. Aşağıdaki configi yapıştırın.

#---------------------------------------------------------------------
# Genel ayarlar.
#---------------------------------------------------------------------
global

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy             #HAProxy kullanici ve grup tanimi.
    group       haproxy
    daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# Bu kisimla cok duzenleme yapmayin.
#---------------------------------------------------------------------
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
#---------------------------------------------------------------------
#HAProxy Web Monitor yapilandirmasi.
#---------------------------------------------------------------------
listen haproxy3-monitoring *:8080                #Haproxy Web Monitor.
    mode http
    option forwardfor
    option httpclose
    stats enable
    stats show-legends
    stats refresh 5s
    stats uri /stats                             #Web monitor dizini.
    stats realm Haproxy\ Statistics
    stats auth adm_user:adm_sifre1*            #Kullanici adi ve sifre.
    stats admin if TRUE
    default_backend app-main                    #Backend tanim.
#---------------------------------------------------------------------
# FrontEnd konfigurasyonu.
#---------------------------------------------------------------------
frontend main
    bind *:80
    option http-server-close
    option forwardfor
    default_backend app-main
#---------------------------------------------------------------------
# BackEnd load balance yapilandirma.
#---------------------------------------------------------------------
backend app-main
    balance roundrobin                                     #Load balance proxy methodu.
    option httpchk HEAD / HTTP/1.1\r\nHost:\ localhost    #Web site kontrol - 200 status kod.
    server site1 192.168.58.58:80 check                 #Web1
    server site2 192.168.58.59:80 check                 #Web2

Bu işlemden sonra sunucunuzun hosts dosyasını düzenleyin ve uygun kayıtları ekleyin. Çünkü üstte görebileceğiniz gibi, site1 ve site2 kayıtları bir dns kaydıdır. Metin editörüyle /etc/hosts dosyasını açın ve ekleyin.

192.168.58.58 site1.vahap.net site1
192.168.58.59 site2.vahap.net site2
192.168.58.60 haproxy1.vahap.net haproxy1
192.168.58.61 haproxy2.vahap.net haproxy2
192.168.58.62 vip.vahap.net vip

HAProxy üzerinde 3 çeşit yönlendirme methodunuz var. İlki roundrobin (bir ona bir diğerine), leastconn (en az bağlantı hangi sunucudaysa ona) ve source (hangi IP’nin hangi makinaya yönleneceği) şeklindedir. Uygun olanı seçip üstteki config dosyasını düzenleyin. HAProxy servisini başlatın ve sistem açılışında da otomatik başlattırın.

systemctl start haproxy
systemctl enable haproxy

Yukarıdaki tüm işlemleri ikinci HAProxy makinanızda da uygulayın. Aynı adımları uyguladıktan keepalived kurulumunu gerçekleştirmelisiniz. Bu her iki makinanın da durumunu kontrol eden ve sorun anında listener IP’nin-trafiğin diğer makinaya geçmesini sağlayan bir yapıdır. Öncelikle Keepalived kurulumunu her iki makinada da yapın ve sonra keepalived config dosyasının yedeğini alın. Sırasıyla adımlar:

yum install keepalived -y
cd /etc/keepalived/
mv keepalived.conf keepalived.conf_yedek
cp keepalived.conf_yedek keepalived.conf

İşlem sonunda da keepalived.conf dosyasının içeriğini silin ve aşağıda oluşturduğum satırları ekleyin.

vrrp_script chk_haproxy {
  script "killall -0 haproxy" # HAProxy islemini kontrol et.
  interval 2 # 2 saniye ping araligi.
  weight 2
}

vrrp_instance VI_1 {
  interface eno16777984 # Network adaptor monitor.
  state MASTER # MASTER haproxy1 ve YEDEK haproxy2
  virtual_router_id 51
  priority 101 # Oncelik 101 HAProxy1'de ve 100 HAProxy2'de.
  virtual_ipaddress {
    192.168.58.62 # VRRP (Sanal-Listener IP adres.)
  }
  track_script {
    chk_haproxy
  }
}

Önemli noktalar: HA, VRRP ile sağlanıyor ve bu da keepalived ile oluşturuluyor. Keepalived için bir public IP adresiniz olmalı ve bu IP adresi iki HAProxy makinanızda da kullanabilir durumda olmalıdır. (Çünkü domaini bu IP’ye yönlendireceksiniz.) Üstte ki config dosyasında “eno16777984” yazan kısmı, kendi ethernet kart adınıza göre düzenleyin ve keeaplived servisini başlatın.

systemctl start keepalived
systemctl enable keepalived

Benim de kurguladığım şekilde, region bazlı da aktif-aktif çalışan bir load balancer yapısı istiyorsanız şart şu: Keepalived için eklediğiniz listener IP bloğunu, diğer veri merkezinde oluşturduğunuz HAProxy makinalarında da kullanabiliyor olmanız lazım. Bunun için isterseniz iki veri merkezi arasında MPLS hattı çektirin isterseniz de anonsları diğer veri merkezinden de yaptırın.

Aşağıda kafamdaki proje taslağını çizdim. Elbette DNS sunucularını da kendim yapılandırdım ve GeoLocation ile anycast olacak şekilde hangi şehirden istek yapılıyorsa en yakın şehirdeki veri merkezindeki yapıya yönlendiriyor. Burada sistem taraflı tüm yapı hem kendi içinde hem de lokasyon bazlı yedeklidir.

*Bilgi paylaştıkça büyür ancak içeriği paylaşırken kaynak gösterme nezaketinde bulunursanız sevinirim.

Umarım zamandan kazanmanızı sağlar.