fallover && HA сервера.

Небольшие заметки из личного (и не только) опыта, рекомендации
Ответить
Аватара пользователя
Gen1us2k
Модератор
Модератор
Сообщения: 771
Зарегистрирован: 02 мар 2010, 16:13

fallover && HA сервера.

Сообщение Gen1us2k » 29 май 2012, 14:25

В общем. Что мы имеем:
7 виртуалок, из них
5 в одной сети
1 во второй сети
1 в третьей сети

Задача: взять две виртуалки и настроить на них ipsec туннель с двумя другими. на пятой виртуалке замутить гре туннель с одной из первых двух виртуалок. Две другие виртуалки, которые в разных сетях надо зацепить в одну сеть через туннель. Для полного счастья первые две виртуалки сделать высокодоступными.
Для начала чешем репу. После того как почесали мы поднимаем все виртуалки. Поднимал на дебиане.
Переходим к конфигурированию. Хосты keepalived{1,2} будут отказоустойчивыми и высокодоступными. хосты test{1,2} и test3 - обычными. Хосты keepalived{1,2} и test{1..3} находятся в одной сети. test 4 - в другой и test5 в третьей.
test1 будет ходить по айписеку к keepalived1 и test2 будет ходить по айписеку к keepalived2. Гре туннель будет поднят на test3 и keepalived1. test4 будет ходить к test5 через туннель между test3 и keepalived1.

Решение ipsec:
для всего этого нам понадобяццо 4 виртуалки, на которых будут стоять ipsec-tools, racoon. На keepalived* будет стоять keepalived. Ставятся они через apt.
Выделил я два ипа, которые будут являтся отказоустойчивыми. 192.168.5.20{1,2}
/etc/network/interfaces

Код: Выделить всё

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
	address 192.168.5.183
	netmask	255.255.255.0
	gateway	192.168.5.1
	post-up iptables-restore < /etc/ipt
auto eth1
iface eth1 inet static
	address 192.168.4.1
	netmask	255.255.255.0

auto tunnel
iface tunnel inet static
	address 10.0.0.1
	pointopoint 10.0.0.2
	netmask 255.255.255.0
	up ifconfig ${IFACE} multicast
	pre-up iptunnel add ${IFACE} mode gre local 192.168.5.201 remote 192.168.5.184 ttl 255
	post-up ip route add 192.168.3.0/24 via 10.0.0.2
	post-down iptunnel del ${IFACE}
и на втором

Код: Выделить всё

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
	address 192.168.5.182
	netmask	255.255.255.0
	gateway	192.168.5.1

auto eth1
iface eth1 inet static
	address 192.168.4.2
	netmask	255.255.255.0

auto tunnel
iface tunnel inet static
	address 10.0.0.1
	pointopoint 10.0.0.2
	netmask 255.255.255.0
	up ifconfig ${IFACE} multicast
	pre-up iptunnel add ${IFACE} mode gre local 192.168.5.201 remote 192.168.5.184 ttl 255
	post-up ip route add 192.168.3.0/24 via 10.0.0.2
	post-down iptunnel del ${IFACE}
Как настраивать ipsec думаю рассказывать не надо. Расскажу только то, что завязал я их между 192.168.5.200<->192.168.5.202 192.168.5.201<->192.168.5.203
Из конфига ракуна важное то, что он вешается на 2 интерфейса

Код: Выделить всё

listen
{
    isakmp 192.168.5.202 [500];
    isakmp 192.168.5.201 [500];
}
Также правила одинаковые для двух айписеков сразу в ipsec-tools.conf и psk указан для обоих хостов.

Думаю, что всё понятно. Переходим к реализации отказоустойчивости
/etc/keepalived/keepalived.conf

Код: Выделить всё

vrrp_script chk_racoon {
	script "pidof racoon"
	intelrval 1
	weight 2
}

vrrp_instance test1 {
        interface eth1
        state MASTER
        virtual_router_id 31
        priority 101
        
	garp_master_delay 1

	track_script {
		chk_racoon
	}

	authentication {
            auth_type PASS
            auth_pass trololo
        }
        virtual_ipaddress {
                192.168.5.201/24 dev eth0 label eth0:t1-MASTER
        }
	virtual_routes {
		192.168.5.203 dev eth0 src 192.168.5.201
	}
	notify_backup "/usr/local/bin/notyfier.sh  BACKUP   test1"
	notify_master "/usr/local/bin/notyfier.sh  MASTER  test1"
	notify_fault  "/usr/local/bin/notifier.sh  FAULT  test1"

}

vrrp_instance test2 {
        interface eth1
        state BACKUP
        virtual_router_id 32
        priority 100

	garp_master_delay 1
        
	track_script {
		chk_racoon
	}

	authentication {
            auth_type PASS
            auth_pass trololo
        }
        virtual_ipaddress {
        	192.168.5.202/24 dev eth0 label eth0:t2-BACKUP src 192.168.5.202
        }
	virtual_routes {
		192.168.5.200 dev eth0 src 192.168.5.202
	}
        notify_backup "/usr/local/bin/notyfier.sh  BACKUP   test2"
        notify_master "/usr/local/bin/notyfier.sh  MASTER  test2"
        notify_fault  "/usr/local/bin/notifier.sh  FAULT  test2"

}
И со второго:

Код: Выделить всё

vrrp_script chk_racoon {
	script "pidof racoon"
	intelrval 1
	weight 2
}

vrrp_instance test1 {
        interface eth1
        state BACKUP
        virtual_router_id 31
        priority 101
        
	garp_master_delay 1

	track_script {
		chk_racoon
	}

	authentication {
            auth_type PASS
            auth_pass trololo
        }
        virtual_ipaddress {
                192.168.5.201/24 dev eth0 label eth0:t1-BACKUP
        }
	virtual_routes {
		192.168.5.203 dev eth0 src 192.168.5.201
	}
	notify_backup "/usr/local/bin/notyfier.sh  BACKUP   test1"
	notify_master "/usr/local/bin/notyfier.sh  MASTER  test1"
	notify_fault  "/usr/local/bin/notifier.sh  FAULT  test1"

}

vrrp_instance test2 {
        interface eth1
        state MASTER
        virtual_router_id 32
        priority 100

	garp_master_delay 1
        
	track_script {
		chk_racoon
	}

	authentication {
            auth_type PASS
            auth_pass trololo
        }
        virtual_ipaddress {
        	192.168.5.202/24 dev eth0 label eth0:t2-MASTER src 192.168.5.202
        }
	virtual_routes {
		192.168.5.200 dev eth0 src 192.168.5.202
	}
        notify_backup "/usr/local/bin/notyfier.sh  BACKUP   test2"
        notify_master "/usr/local/bin/notyfier.sh  MASTER  test2"
        notify_fault  "/usr/local/bin/notifier.sh  FAULT  test2"

}
Таким образом у нас схема
master backup
backup master

Если вывалился один сервак, то выполняется скрипт /usr/local/bin/notifier.sh

Код: Выделить всё

#!/bin/bash
state=$1
fromVI=$2
if [[ "$state" == "MASTER" && "$fromVI" == "test1" ]]; then
    echo test2 is DOWN. Im MASTER now 
    echo `date`  $fromVI changed state into MASTER >> /tmp/keepalived.log
    /etc/init.d/racoon restart
    echo Racoon restarted >> /tmp/keepalived.log
    ifdown tunnel && ifup tunnel
    ping 192.168.5.200 -c 5
    ping 192.168.5.203 -c 5
    sleep 5
elif [[ "$state" == "MASTER" && "$fromVI" == "test2" ]]; then
    echo test1 is DOWN. Im MASTER now
    echo `date` $fromVI changed state into MASTER >> /tmp/keepalived.log
    /etc/init.d/racoon restart
    echo Racoon restarted >> /tmp/keepalived.log
    ifdown tunnel && ifup tunnel
    ping 192.168.5.200 -c 5
    ping 192.168.5.203 -c 5
    sleep 5
fi
Как видно, он рестартит ракун, переподнимает туннель, посылает пинги и срет в лог.

Что имеем на выходе:
Простой туннелей в 5 секунд. Автоматическое переключение с сервака на сервак.
ЗЫ если один сервак выпал и второй забрал на него VIP, то он отдаст его только в том случае. если сам упадет.

Сцылки:
http://xgu.ru/wiki/VRRP
man keepalived.conf
Изображение
Home: Windows Heaven
Home: Debian 6
For Servers: Debian || RHEL Based || Gentoo || FreeBSD
Аватара пользователя
Raven
Бородатый сис
Бородатый сис
Сообщения: 2788
Зарегистрирован: 03 мар 2010, 15:12
ОС: RHEL 7
Откуда: Из серверной

Re: fallover && HA сервера.

Сообщение Raven » 30 май 2012, 10:38

Gen1us2k писал(а):ЗЫ если один сервак выпал и второй забрал на него VIP, то он отдаст его только в том случае. если сам упадет.
Т.е. autofailback не предусмотрен?
Я не злопамятный, я просто часто ковыряю логи
Изображение
Аватара пользователя
Gen1us2k
Модератор
Модератор
Сообщения: 771
Зарегистрирован: 02 мар 2010, 16:13

Re: fallover && HA сервера.

Сообщение Gen1us2k » 30 май 2012, 12:13

Raven
Тут немного другая идеология. Если сервак вывалился, то должен обслуживать другой сервак пока не упадет. autofallback хорошо, но не в этом случае, так как будут простои, а это не очень хорошо в этом случае.
Изображение
Home: Windows Heaven
Home: Debian 6
For Servers: Debian || RHEL Based || Gentoo || FreeBSD
Ответить

Вернуться в «Полезные советы»