Установка и настройка keepalived с одним внешним адресом

Расскажу как настроить keepalived для работы на двух серверах с одним плавающим адресом.

Принцип работы настроенной схемы: при выходе из строя одного сервера этот же IP адрес поднимается на резервном, при возвращении в строй основного - адрес назначается обратно.

Таким образом организуется отказоустойчивость при аппаратном сбое или падении службы (если мониторить её состояние).

На обоих серверах по два сетевых интерфейса, первый - локальная сеть (eth1), второй - внешняя (eth0). Локальную сеть будем использовать для обмена сообщениями между экземплярами keepalived, а внешнему интерфейсу будет присваиваться плавающий адрес с указанием шлюза.

Установка keepalived в Cen­tOS:

yum install keepalived

Конфиг на мастере:

global_defs {
   notification_email {
   alert@adminpentest.ru
    }
    notification_email_from alert@adminpentest.ru
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
}

vrrp_instance VI_1 {
    state MASTER
    interface eth1
    virtual_router_id 52
    priority 140
    advert_int 1
    authentication {
    auth_type PASS
    auth_pass 1122
    }
    virtual_ipaddress {
    193.124.189.158/24 dev eth0
    }
    virtual_routes {
    default via 193.124.189.1
    }
    notify /etc/keepalived/notify.sh
}

Конфиг на бэкапе различается лишь строками:

state BACKUP
priority 130

Расшифровка параметров:

virtual_router_id 52 - уникальный идентификатор

advert_int 1 - частота отправления статуса мастера (1 секунда)

noti­fy - вызывает скрипт при смене состояния, передаёт ему на вход текущее состояние. В скрипте можно описать, что выполнить при каждом состоянии.

Пример скрипта noti­fy, в котором нужный сервис работает только на сервере в состоянии MASTER:

#!/bin/bash

ENDSTATE=$3
NAME=$2
TYPE=$1

case $ENDSTATE in
    "BACKUP") systemctl stop targetservice
              exit 0
            ;;
    "FAULT")  systemctl stop targetservice
              exit 0
            ;;
    "MASTER") systemctl start targetservice
              exit 0
            ;;
    *)    echo "Unknown state ${ENDSTATE} for VRRP ${TYPE} ${NAME}">/root/error
          exit 1
            ;;
esac

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *