Задать вопрос

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

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

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

Спасибо.
  • Вопрос задан
  • 2962 просмотра
Подписаться 11 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 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 который вешается алиасом на интерфейс по недоступности, после чего поднимается сам сервис.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы