Keepalived ile IP Failover

Keepalived VRRP protokolünü kullanarak yüksek erişilebilirlik (high-availability) gereksinimlerinden IP sanallaştırmayı sağlıyor. Ağ uzmanlarının ağ geçidi (gateway) yedekliliği için kullandıkları VRRP, linux sistemlerde de harika sonuç veriyor. Keepalived, IP failover yeteneğini ikiden daha fazla sunucu için sağlayacak yeteneğe sahip. Ayrıca birden çok VRRP grubu oluşturarak birden çok sanal IP adresinin farklı sunucular üzerine atanması sağlanabiliyor, bu sayede yük dağıtmak mümkün.

Diğer failover sistemlerinden farklı olarak VRRP‘de sunucular birbirlerini multicast trafik ile izliyorlar. Bu multicast adres (224.0.0.18) Internet Assigned Numbers Authority (IANA) in kayıtlı standart multicast adreslerinden.

VRRP yapısında kullanılan önceliklendirme puanlamasında script, servis durumu veya komutların çıktıları keepalived sayesinde kullanılabiliyor. Özellikle script çıktılarının aktif cihaz seçiminde kullanılabiliyor olması büyük esneklik sağlıyor.

Keepalived‘ın loadbalance yeteneği de var. Bu yazımda loadbalance kullanımıyla ilgili bir bilgi bulunmuyor.

Yüksek erişilebilirlik sağlamak için kullanılan diğer yöntemleri referans amaçlı listeliyorum;

– Piranha
– UltraMonkey
– Heartbeat + mon + coda
– Heartbeat + ldirectord
– Heartbeat + Pacemaker

Örnek ayar dosyası ( /etc/keepalived/keepalived.conf );

global_defs {
   notification_email {
     test1@test.com
     test2@test.com
   }
   notification_email_from test@test.com
   smtp_server mail.test.com
   smtp_connect_timeout 30
}

vrrp_script chk_myscript {
  script       "/usr/local/bin/mycheckscript.sh" # exit 0 (herşey yolunda) | exit 1 (problem var)
  interval 2   # check every 2 seconds
  fall 2       # require 2 failures for KO
  rise 2       # require 2 successes for OK
}

vrrp_script chk_ping {
       script "/bin/ping -c 4 -q -I eth0 xx.xx.xx.x"
       interval 10
       fall 2
       weight 4
}

vrrp_script chk_service {
       script "killall -0 mysqld"
       interval 1
       weight 2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth1
    virtual_router_id 20
    priority 101
    advert_int 1
    smtp_alert
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.121/24 dev eth0
    }
    track_script {
       chk_myscript
       chk_ping
       chk_service
    }
    
    notify /usr/local/bin/keepalivednotify.sh

    #notify_backup "script_backup.sh"
    #notify_master "script_master.sh"
    #notify_fault "script_fault.sh"
}

Sanal IP adresini görmek için;

ip addr show eth1

Örnek  notify betiği;

#!/bin/bash

# $1 = "GROUP"|"INSTANCE"
# $2 = name of group or instance
# $3 = target state of transition
#     ("MASTER"|"BACKUP"|"FAULT")
TYPE=$1
NAME=$2
STATE=$3

case $STATE in
"MASTER") /etc/init.d/apache2 start
          exit 0
          ;;
"BACKUP") /etc/init.d/apache2 stop
          exit 0
          ;;
"FAULT")  /etc/init.d/apache2 stop
          exit 0
          ;;
*)        echo "unknown state"
          exit 1
          ;;
esac

Hamdi ÖZCAN – ozcan.com

28 Mayıs 2014

Posted In: failover, ip, ip failover, keepalived, lkd, teknik, tr, vrrp

Keepalived ile IP Failover

Keepalived VRRP protokolünü kullanarak yüksek erişilebilirlik (high-availability) gereksinimlerinden IP sanallaştırmayı sağlıyor. Ağ uzmanlarının ağ geçidi (gateway) yedekliliği için kullandıkları VRRP, linux sistemlerde de harika sonuç veriyor. Keepalived, IP failover yeteneğini ikiden daha fazla sunucu için sağlayacak yeteneğe sahip. Ayrıca birden çok VRRP grubu oluşturarak birden çok sanal IP adresinin farklı sunucular üzerine atanması sağlanabiliyor, bu sayede yük dağıtmak mümkün.

Diğer failover sistemlerinden farklı olarak VRRP‘de sunucular birbirlerini multicast trafik ile izliyorlar. Bu multicast adres (224.0.0.18) Internet Assigned Numbers Authority (IANA) in kayıtlı standart multicast adreslerinden.

VRRP yapısında kullanılan önceliklendirme puanlamasında script, servis durumu veya komutların çıktıları keepalived sayesinde kullanılabiliyor. Özellikle script çıktılarının aktif cihaz seçiminde kullanılabiliyor olması büyük esneklik sağlıyor.

Keepalived‘ın loadbalance yeteneği de var. Bu yazımda loadbalance kullanımıyla ilgili bir bilgi bulunmuyor.

Yüksek erişilebilirlik sağlamak için kullanılan diğer yöntemleri referans amaçlı listeliyorum;

– Piranha
– UltraMonkey
– Heartbeat + mon + coda
– Heartbeat + ldirectord
– Heartbeat + Pacemaker

Örnek ayar dosyası ( /etc/keepalived/keepalived.conf );

global_defs {
   notification_email {
     test1@test.com
     test2@test.com
   }
   notification_email_from test@test.com
   smtp_server mail.test.com
   smtp_connect_timeout 30
}

vrrp_script chk_myscript {
  script       "/usr/local/bin/mycheckscript.sh" # exit 0 (herşey yolunda) | exit 1 (problem var)
  interval 2   # check every 2 seconds
  fall 2       # require 2 failures for KO
  rise 2       # require 2 successes for OK
}

vrrp_script chk_ping {
       script "/bin/ping -c 4 -q -I eth0 xx.xx.xx.x"
       interval 10
       fall 2
       weight 4
}

vrrp_script chk_service {
       script "killall -0 mysqld"
       interval 1
       weight 2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth1
    virtual_router_id 20
    priority 101
    advert_int 1
    smtp_alert
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.121/24 dev eth0
    }
    track_script {
       chk_myscript
       chk_ping
       chk_service
    }
    
    notify /usr/local/bin/keepalivednotify.sh

    #notify_backup "script_backup.sh"
    #notify_master "script_master.sh"
    #notify_fault "script_fault.sh"
}

Sanal IP adresini görmek için;

ip addr show eth1

Örnek  notify betiği;

#!/bin/bash

# $1 = "GROUP"|"INSTANCE"
# $2 = name of group or instance
# $3 = target state of transition
#     ("MASTER"|"BACKUP"|"FAULT")
TYPE=$1
NAME=$2
STATE=$3

case $STATE in
"MASTER") /etc/init.d/apache2 start
          exit 0
          ;;
"BACKUP") /etc/init.d/apache2 stop
          exit 0
          ;;
"FAULT")  /etc/init.d/apache2 stop
          exit 0
          ;;
*)        echo "unknown state"
          exit 1
          ;;
esac

Hamdi ÖZCAN – ozcan.com

28 Mayıs 2014

Posted In: failover, ip, ip failover, keepalived, lkd, teknik, tr, vrrp

HAProxy backend sunucularına istemci ip adresini aktarma

Vekil sunucu (Proxy) ve/veya yük dengeleme (Load Balancing) servislerinin arkasında çalışan sistemler istemci ip adresi olarak bu servislerin ip adresini alırlar. Bu servislerin çoğu X-Forwarded-For ya da benzer bir ek başlık ile gerçek istemci adresini de sunuculara iletme desteği sunarlar.

HAProxy yük dengeleme servisinde de bu iş için yapılandırma dosyasına `option forwardfor` seçeneğinin eklenmesi gerekiyor. Bu seçenek ihtiyaca göre `defaults`, `frontend`, `listen` ya da `backend` bölümlerinden birinde tanımlanabiliyor. Yalnız bu seçenek ile ilgili çok önemli bir detay var.

Bu seçenek, HAProxy’nin çalışma yapısı gereği, geliştirme ya da test ortamında farkına varması güç bir soruna yol açıyor. Bir istemci HAProxy ile bağlantı kurduğunda bağlantının sadece ilk isteği analiz ediliyor, log’lanıyor ve işleniyor. Dolayısıyla X-Forwarded-For başlığı sadece ilk istekte ekleniyor, aynı bağlantıda gelen sonraki isteklerde sunuculara HAProxy ip adresi iletiliyor. Bu da yazılım tarafında istemci adresi olarak tutarsız değerler gelmesine neden oluyor. HAProxy loglarında da bu duruma dair bir kayıt oluşmadığından sorunun kaynağını tespit etmek zor olabiliyor.

Bu sorunun önüne geçmek ve tüm isteklerde bu başlığın eklenmesini sağlamak için ise yapılandırma dosyasına `option http-server-close` seçeneğinin eklenmesi gerekiyor. Bu seçenek de ihtiyaca göre `defaults`, `frontend`, `listen` ya da `backend` bölümlerinden birinde tanımlanabiliyor. Eğer `defaults` bölümünde tanımlandıysa ve iptal edilmek istenen bir bölüm varsa `no option httpclose` şeklinde iptal edilebiliyor. Bu seçenek istemciyle HAProxy arasındaki bağlantıyı açık tutarken, HAProxy ve sunucu arasındaki bağlantıyı kapatıyor ve tüm isteklerde başlığın doğru şekilde eklenmesini sağlıyor.

http-server-close seçeneği HAProxy’e 1.4 sürümünde eklendi. Daha eski bir sürüm kullanılıyorsa keepalive desteğini feda edip `option httpclose` seçeneğini kullanmak gerekiyor.

12 Nisan 2013

Posted In: backend, forwardfor, frontend, Gezegen, haproxy, http-server-close, httpclose, keepalived, load balancing, sistem yönetimi, x-forwarded-for

WP Twitter Auto Publish Powered By : XYZScripts.com