Ucarp

Материал из ALT Linux Wiki

Вступление

Существует множество решений для обеспечения отказоустойчивости IPv4 (общего IP-адреса между однотипными узлами кластера), среди которых широко известны corosync2/pacemaker, heartbeat, keepalived, LVS -- он же модуль ядра Linux ipvs, модуль ядра Linux от Евгения Полякова под названием carp, демоны пространства пользователя vrrpd и ucarp. Последний из перечисленных предлагает один из самых простых способов обеспечения "общего/безотказного IP-адреса". Простых, в смысле установки и настройки. Здесь будет рассказано, как настроить ucarp в дистрибутивах ALT Linux.

Важно заметить, что ucarp обеспечивает отказоустойчивость на уровне хоста, а не отдельных служб. И, в отличии от heartbeat, работает очень гладко. Но ucarp может быть "чувствителен" к сетевой среде (так, не все провайдеры на своих площадках позволяют менять привязку IP-MAC). И он не обеспечивает балансировку нагрузки. Для перечисленного имеет смысл рассмотреть иные решения.

Тестовая конфигурация

Первый сервер

Хост:     node1
IP:       10.10.3.227

Второй сервер

Хост:     node2
IP:       10.10.3.226

Третий сервер

Хост:     node3
IP:       10.10.3.225

Общие настройки

Iface:    eth0
Общий IP: 10.10.3.228
Маска:    255.255.255.0
Шлюз:     10.10.3.1
Домен:    testdom.loc
DNS #1:   8.8.8.8
DNS #2:   8.8.4.4

Исходим из того, что для конфигурирования сети и служб на всех трёх узлах кластера hanode используются Etcnet и SysV Init.

Логинимся под рутом (на каждом сервере)

$ su -

И устанавливаем ucarp

# apt-get install ucarp

Отключаем все "кластерные" службы

Здесь под "кластерными" подразумеваются только те службы, которые должны отвечать на общем/кластерном IP-адресе.

# service SERVICE1 stop
# service SERVICE2 stop
# chkconfig SERVICE1 off
# chkconfig SERVICE2 off

Конфигурируем первый сервер

/etc/sysconfig/network

В этом файле изменим только одну строку:

HOSTNAME=node1.testdom.loc

/etc/net/ifaces/eth0/ipv4address

10.10.3.227/24

Скрипт /etc/net/ifaces/eth0/ifup-post

#!/bin/sh

password="qwerty12345"
progdir=$(realpath "$0")
progdir=$(dirname "$progdir")
iface=$(basename "$progdir")
vip=$(cat "$progdir/common.vip")
addr=$(cut -f1 -d/ "$progdir/ipv4address")

# Primary (-k 0)
/usr/sbin/ucarp -i $iface -s $addr -a $vip -v 3 \
		-p $password -B -S -M -r 5 -k 0 \
		-u /etc/net/scripts/vip-up.sh \
		-d /etc/net/scripts/vip-down.sh

Не забываем сделать его исполняемым:

# chmod +x /etc/net/ifaces/eth0/ifup-post

Конфигурируем второй сервер

/etc/sysconfig/network

В этом файле изменим только одну строку:

HOSTNAME=node2.testdom.loc

/etc/net/ifaces/eth0/ipv4address

10.10.3.226/24

Скрипт /etc/net/ifaces/eth0/ifup-post

#!/bin/sh

password="qwerty12345"
progdir=$(realpath "$0")
progdir=$(dirname "$progdir")
iface=$(basename "$progdir")
vip=$(cat "$progdir/common.vip")
addr=$(cut -f1 -d/ "$progdir/ipv4address")

# Secondary (-k 50)
/usr/sbin/ucarp -i $iface -s $addr -a $vip -v 3 \
		-p $password -B -S -M -r 5 -k 50 \
		-u /etc/net/scripts/vip-up.sh \
		-d /etc/net/scripts/vip-down.sh

Не забываем сделать его исполняемым:

# chmod +x /etc/net/ifaces/eth0/ifup-post

Конфигурируем третий сервер

/etc/sysconfig/network

В этом файле изменим только одну строку:

HOSTNAME=node3.testdom.loc

/etc/net/ifaces/eth0/ipv4address

10.10.3.225/24

Скрипт /etc/net/ifaces/eth0/ifup-post

#!/bin/sh

password="qwerty12345"
progdir=$(realpath "$0")
progdir=$(dirname "$progdir")
iface=$(basename "$progdir")
vip=$(cat "$progdir/common.vip")
addr=$(cut -f1 -d/ "$progdir/ipv4address")

# Third (-k 100)
/usr/sbin/ucarp -i $iface -s $addr -a $vip -v 3 \
		-p $password -B -S -M -r 5 -k 100 \
		-u /etc/net/scripts/vip-up.sh \
		-d /etc/net/scripts/vip-down.sh

Не забываем сделать его исполняемым:

# chmod +x /etc/net/ifaces/eth0/ifup-post

Общая конфигурация всех трёх узлов кластера

/etc/hosts

127.0.0.1	localhost.localdomain localhost

10.10.3.228	hanode.testdom.loc hanode
10.10.3.227	node1.testdom.loc node1
10.10.3.226	node2.testdom.loc node2
10.10.3.225	node3.testdom.loc node3

/etc/net/ifaces/eth0/options

BOOTPROTO=static
TYPE=eth
CONFIG_WIRELESS=no
CONFIG_IPV4=yes
NM_CONTROLLED=no

/etc/net/ifaces/eth0/ipv4route

default via 10.10.3.1 metric 100

/etc/net/ifaces/eth0/resolv.conf

search testdom.loc
domain testdom.loc
nameserver 8.8.8.8
nameserver 8.8.4.4

/etc/net/ifaces/eth0/common.vip

10.10.3.228

Скрипт /etc/net/scripts/vip-up.sh

#!/bin/bash

exec &>/dev/null
ip addr add 10.10.3.228/24 dev eth0
service SERVICE1 start
service SERVICE2 start

Не забываем сделать его исполняемым:

# chmod +x /etc/net/scripts/vip-up.sh

Скрипт /etc/net/scripts/vip-down.sh

#!/bin/bash

exec &>/dev/null
service SERVICE2 stop
service SERVICE1 stop
ip addr del 10.10.3.228/24 dev eth0

Не забываем сделать его исполняемым:

# chmod +x /etc/net/scripts/vip-down.sh

Перезапускаемся

Конечно, можно перезапустить все серверы кластера, но вообще-то достаточно перезапустить службу сети, чтобы изменения вступили в силу немедленно, а уже после отключать серверы поочерёдно и наблюдать за тем, как общий IP-адрес кластера вместе с "кластерными" службами "перескакивают" с одного сервера на другой:

# service network restart

Назначение опций ucarp

-i eth0                  Название сетевого интерфейса
-s 10.10.3.226           Основной IP-адрес на этом интерфейсе
-a 10.10.3.228           Общий "кластерный" IP-адрес на нём же
-v 3                     ID кластера, общий для всех серверов (1-255)
-p qwerty12345           Ключ шифрования, общий для всех серверов
-B                       Указывает на необходимость запустить как демон
-S                       Если нужно игнорировать состояние интерфейса
-M                       Чтобы использовать широковещательное оповещение
                         вместо многоадресного
-r 5                     Задержка перед переключением в секундах -
                         определяет, как долго партнёр может не отзываться,
                         чтобы считать его "потерянным"
-k 0                     Определяет приоритет выбора сервера в кластере
                         (0-255), чем меньше число, тем выше приоритет
-P                       Влияет на на повышение приоритета и поведение
                         при возвращении "упавшего" сервера "в строй"
-b 1                     Определяет частоту опроса партнёров по кластеру
-u /path/to/vip-up.sh    Скрипт, выполняемый при поднятии общего IP
-d /path/to/vip-down.sh  Скрипт, выполняемый при отключении общего IP

Похожие статьи и другие источники