28 Ara 2020

Keepalived ile Linux Cluster Kurulumu

    Centos 6 ve 7 üzerine keepalived kullanarak mysql ve squid servisleri için yedekli yapılar kurmuştum. Benzer şekilde ihtiyacınıza göre kendi konfigürasyonlarınızı yapabilirsiniz.

   Keepalived ile ilgili kısa bilgiden sonra kurulum ve yapmış olduğum konfig örneklerini paylaşıyor olacağım.

Keepalived VRRP protokolünü kullanarak IP sanallaştırma ile high-availability (yüksek erişebilirlik)  sağlar. Keepalived, IP failover yeteneği ile ikiden daha fazla sunucu için konfigüre edilebilir. Konfigürasyon dosyasında oluşturulan VRRP grupları ile birden fazla sanal IP adresinin farklı sunucular üzerine atanması ile yük dağılımı da yapılabilir.

VRRP’de sunucular birbirlerini multicast trafik ile izler. Bu multicast adress (224.0.0.18) IANA (Internet Assigned Numbers Authority) a kayıtlı standart multicast adreslerindendir.

VRRP yapısında kullanılan script, servis durumu veya komut çıktıları ile nodelar arasında önceliklendirme yapılır.

  • Kurullum işlemini aşağıdaki şekilde basitçe yapabiliyoruz. 

yum install –y keepalived  # diyerek kurulumu yapıyoruz.

 

  • Örnek Konfigürasyonlar;
  1. ilk olarak 2 adet Centos 7 üzerinde çalıştırdığım squid servisleri için yaptığım konfigürasyondan bahsedeceğim.

Paket kurulumu yapıldıktan sonra konfigürasyon dosyası aşağıdaki konumda bulunmaktadır. vim ile konfigürasyon dosyasını açarak düzenlemeye başlayabilirsiniz.

vim /etc/keepalived/keepalived.conf    # ben vim kullanıyorum ama siz hangi editörü daha iyi kullanıyorsanız onunla da işlem yapabilirsiniz.

Birinci Node da ki konfig;

! Configuration File for keepalived

global_defs {
      notification_email {         # mail tanımlaması yapmak isterseniz burayı kendinize göre düzenleyebilirsiniz.
        nurullahdoser@gmail.com    #  mailin iletilmesini istediğiniz adres
       }
      notification_email_from squid-proxy@nurullahdoser.com # maili gönderen hesap
       smtp_server smtp_server_ip    #SMTP server adresi
      smtp_connect_timeout 30
       router_id proxy-ha         #mail konusunda bulunmasını istediğiniz başlığı burada belirtebilirsiniz.
      }

vrrp_script chk_squid {   # bu alanda servisimi nasıl kontrol edeceğimizi tanımlıyoruz. script, servis durumu ve ya komut çıktısı ile
         script "pidof squid"  # pidoff ile ilgili servisi kontrol ediyorum. pid numarası dönmezse tanımladığımız sanal ip yi diğer host a aktarması için keepalived servisini tetikliyor.
        interval 2   # ne kadar sıklıkla kontrol edileceğini belirtir. default değeri 5 sn dir.
}

vrrp_instance VI_1 {   #VI_1 vrrp tanımımıza verdiğim isim.
    state MASTER      # burada MASTER / SLAVE tanımını yapıyoruz.
    interface ens192   #VRRP nin hangi interface de çalışacağınız belirtiyoruz.
    virtual_router_id 55 #tanım yapacağımız tüm node’lar da aynı olmalı
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 55555
    }

track_script {    # tanımladığımız VRRP için kontrol script tanımımızı burada yapıyoruz.
                 chk_squid
        }
    virtual_ipaddress {  # Burada VRRP ile nodelar arasında taşınacak ip leri tanımlıyoruz.
        192.168.1.5
    }
}

 

İkinci Node da ki konfig;

! Configuration File for keepalived

global_defs {
      notification_email {        
nurullahdoser@gmail.com 
      }
      notification_email_from squid-proxy@nurullahdoser.com 
      smtp_server smtp_server_ip  
      smtp_connect_timeout 30
      router_id proxy-ha         
      }

vrrp_script chk_squid {   
        script "pidof squid"  
        interval 2  
}

vrrp_instance VI_1 {   
    state MASTER      
    interface ens192   
    virtual_router_id 55 
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 55555
    }

track_script {    yapıyoruz.
chk_squid
        }
    virtual_ipaddress {  
        192.168.1.5
    }
}

 

Not: MASTER/SLAVE tanımında MASTER olan node servis çalıştığı sürece sanal ip tanımını üzerinde barındıracaktır. Burada 1. node u master ayarladık. 1. node üzerindeki servisi durdurduğumuz da 2.node MASTER olur ancak 1. node üzerinde servis çalışmaya başladığı an tekrar sanal ip yi kendi üzerine alır. Ancak 2.node un ip yi geri vermesini istemiyorsanız iki node üzerinde de MASTER olarak tanım yapmamız yeterli olacaktır.

 

2. Centos 6 üzerine kurduğumu MYSQL database cluster yapısının konfiği

---------------------------------
! Configuration File for keepalived
global_defs {
      notification_email {
        nurullahdoser@gmail.com
      }
      notification_email_from  mysqldb01@nurullahdoser.com
      smtp_server SMTP_Server_IP
      smtp_connect_timeout 30
      router_id mysql-ha-db
      }

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

}

vrrp_script chk_ping {
       script "/bin/ping -c 4 -q -I eth0 192.168.2.1"
       interval 5
       fall 2
       weight 4
}

vrrp_script chk_myscript {
  script       "/script/check_mysql.sh" # exit 0 (hersey yolunda) | exit 1 (problem var)
  interval 2   # check every 2 seconds
  fall 3       # require 2 failures for KO
  rise 2       # require 2 successes for OK
}

vrrp_instance VI_1 {
      state MASTER
      interface eth1
       virtual_router_id 51
      priority 100
      advert_int 1
       smtp_alert
      nopreempt  # only needed on higher priority node
      authentication {
      auth_type PASS
      auth_pass 11111
      }

      notify_master "/script/keepalived_master.sh"
      notify_backup "/script/keepalived_backup.sh"
      notify_fault "/script/keepalived_fault.sh"

      track_script {
         chk_service
        chk_ping
        chk_myscript

     }
       virtual_ipaddress {
         192.168.1.10/24
      }
}
vrrp_instance VI_2 {
      state MASTER
      interface eth0
      virtual_router_id 51
      priority 101
      advert_int 1
      smtp_alert
      nopreempt  # only needed on higher priority node
      authentication {
      auth_type PASS
      auth_pass 11111
      }

      notify_master "/script/keepalived_master.sh"
       notify_backup "/script/keepalived_backup.sh"
      notify_fault "/script/keepalived_fault.sh"

      track_script {
       chk_service
       chk_ping
       chk_myscript

      }
      virtual_ipaddress {
        192.168.2.10/24
      }
}

-----------------------------------------------------------------

! Configuration File for keepalived
global_defs {
      notification_email {
nurullahdoser@gmail.com
      }
      notification_email_from  mysqldb02@nurullahdoser.com
      smtp_server SMTP_Server_IP
      smtp_connect_timeout 30
      router_id mysql-ha-db
      }

 

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

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

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

vrrp_instance VI_1 {
      state MASTER
      interface eth1
      virtual_router_id 51
      priority 101
       advert_int 1
      smtp_alert
      nopreempt  # only needed on higher priority node
      authentication {
      auth_type PASS
      auth_pass 11111
      }

      notify_master "/script/keepalived_master.sh"
      notify_backup "/script/keepalived_backup.sh"
      notify_fault "/script/keepalived_fault.sh"

      track_script {
      chk_service
      chk_ping
      chk_myscript

    }
      virtual_ipaddress {
        192.168.1.10/24
      }
}

vrrp_instance VI_2 {
      state MASTER
      interface eth0
      virtual_router_id 51
      priority 100
      advert_int 1
      smtp_alert
      nopreempt  # only needed on higher priority node
      authentication {
      auth_type PASS
      auth_pass 11111
      }

      notify_master "/script/keepalived_master.sh"
      notify_backup "/script/keepalived_backup.sh"
      notify_fault "/script/keepalived_fault.sh"

      track_script {
      chk_service
      chk_ping
      chk_myscript

      }
       virtual_ipaddress {
         192.168.2.10/24
      }
}

## check_mysql.sh  içeriği

#!/bin/bash

MYSQL=/usr/bin/mysql
MYSQL_HOST=127.0.0.1
MYSQL_USER=root
MYSQL_PASSWORD=root_password
CHECK_TIME=3

#mysql is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0

MYSQL_OK=1
function check_mysql_helth (){
$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" >/dev/null 2>&1
if [ $? = 0 ] ;then
MYSQL_OK=1
else
MYSQL_OK=0
fi
return $MYSQL_OK
}
while [ $CHECK_TIME -ne 0 ]
do
let "CHECK_TIME -= 1"
check_mysql_helth
if [ $MYSQL_OK = 1 ] ; then
CHECK_TIME=0
exit 0
fi
if [ $MYSQL_OK -eq 0 ] && [ $CHECK_TIME -eq 0 ]
then
pkill keepalived
exit 1
fi
sleep 1
done

 

 

#### keepalived_master.sh içeriği

#!/bin/bash
HOSTIP=`ifconfig eth0 | grep inet | egrep -v inet6 | awk -F 'net' '{print $2}'`
LOGFILE=/var/log/keepalived-state.log
echo "[Master]" >> $LOGFILE
date >> $LOGFILE
echo "$HOSTNAME ,$HOSTIP ==>  MASTER " | mail -s "This is Test " nurullahdoser@gmail.com

#### keepalived_backup.sh

#!/bin/bash
HOSTIP=`ifconfig eth0 | grep inet | egrep -v inet6 | awk -F 'net' '{print $2}'`
LOGFILE=/var/log/keepalived-state.log
echo "[Master]" >> $LOGFILE
date >> $LOGFILE
echo "$HOSTNAME ,$HOSTIP ==>  BACKUP " | mail -s "This is Test " nurullahdoser@gmail.com

 

### keepalived_fault.sh

#!/bin/bash

HOSTIP=`ifconfig eth0 | grep inet | egrep -v inet6 | awk -F 'net' '{print $2}'`
LOGFILE=/var/log/keepalived-state.log
echo "[Master]" >> $LOGFILE
date >> $LOGFILE


echo "$HOSTNAME ,$HOSTIP ==>  fault " | mail -s "This is Test " nurullahdoser@gmail.com

Hiç yorum yok: