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.