Ucarp
Вступление
Существует множество решений для обеспечения отказоустойчивости 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