Совместное использование IP адреса на двух серверах

Есть два виртуальных сервера с HAProxy, размещенные на рахных физических машинах, задача — сделать failover, тоесть поднимать IP адрес на машине которая сейчас доступна, если другая перестанет отвечать.

Все IP адерса из одного пула, бродкаст один и тот же, но одна машина не видит то что другая шлет в бродкаст, поэтому такие решения как keepalived, ucarp, heartbeat не подходят. Почему не видят — незнаю, но так как доступа нету ни к сети ни к ксеновским гипервизорам то с этой стороны ничего не исправить. Что еще можно использовать для достижения результата без бродкаста? (Слать в бродкаст не проблема — все равно придется слать ARP риквест к ближашему роутеру для изменения IP. Проблема — читать другой ВПСке из бродкаста).

Спасибо.
  • Вопрос задан
  • 2951 просмотр
Пригласить эксперта
Ответы на вопрос 4
@Bodik Автор вопроса
А все таки оказалось быстрее и проще написать самому. Расскажу подробней, ибо вещь полезная. Я не рассписываю как на разных системах, но должно работать без проблем на любых redhat'о подобных.

ТЗ:
два сервера с главными айпишками 10.10.10.20 и 10.10.10.30
необходимая третья айпишка 10.10.10.40, которая и будет подниматься на живом сервере если другой упал


Пусть 20 сервер будет главным, прописываем ему в /etc/rc.local поднимание айпишки и риквест очистить кеш::
ifconfig eth0:1 10.10.10.40 netmask 255.255.255.0
arping -c 1 -s 10.10.10.40 10.10.10.1


Другой — 30 сервер будет на поддержке, если вдруг первый откажет. На нем создаем скрипт /usr/local/sbin/setupip, внутри:

#!/bin/bash
MASTERHOST="10.10.10.20"
IP1="10.10.10.40"
MASK1="255.255.255.0"
INERFACE1="eth0:1"
GATE1="10.10.10.1"

sleep 10
while true; do
count=$(ping -c 1 $MASTERHOST | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')
localip=$(ifconfig | grep "$IP1 " | wc -l)
if [ $count -eq 0 ]; then
        if [ $localip -eq 0 ]; then
                #if IP is not set - do add it, send ARP cache clear
                logger "setupip :: Host $MASTERHOST is down at $(date); Binding up $IP1"
                ifconfig $INERFACE1 $IP1 netmask $MASK1
                arping -c 1 -s $IP1 $GATE1
        fi
else
        if [ $localip -gt 0 ]; then
                logger "setupip :: Host $MASTERHOST is UP at $(date); Shutting down $IP1"
                ifconfig $INERFACE1 down
        fi
fi

sleep 10
done


Делаем его исполняемым, засовываем скрипт в /etc/rc.local, для запуска при старте:
/usr/local/sbin/setupip &


Reboot. Все готово.

В результате имеем:
  • каждые 10 секунд второй сервер пингует первый
  • если первый лежит — второй поднимает у себя нужную IP, чистит ARP кеш, и делает запись в syslog (/var/log/messages)
  • если первый поднимается, он запускает у себя IP и чистить ARP кеш от себя и принимает все риквесты на себя
  • второй видит что первый поднялся, и ложит IP у себя


Все тесты закончились хорошо. Переменные должны быть интуитивно понятны.
Думаю кому-то этот скрипт пригодиться.
Ответ написан
@BasilioCat
Что-то мне думается, что велосипед давно изобрели. Один из вариантов этого велосипеда называется heartbeat — одной строчкой конфига пишется то, что выше расписано на полстраницы
Ответ написан
LuckyRaul
@LuckyRaul
Называется это VRRP

Советую воспользоваться keepalived
Ответ написан
Wott
@Wott
простейший failover можно сделать на скриптах — сервису выделяется дополнительный IP который вешается алиасом на интерфейс по недоступности, после чего поднимается сам сервис.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы