Load Balancing в Linux с использованием iptables с расширением CLUSTERIP.

Введение.

Часто для Web приложений необходимо балансировать нагрузку. Имеем один общий виртуальный адрес на несколько узлов, к примеру 2-а. С помощью программных средств нагрузка распределяется равномерно между ними.  Если один узел выходит из строя – вся нагрузка падает на второй.

Балансировка (выравнивание) нагрузки — распределение процесса выполнения заданий между несколькими серверами сети с целью оптимизации использования ресурсов и сокращения времени вычисления.

Система балансировки нагрузки Web-серверов – это инструментальное средство, предназначенное для переадресации клиентских запросов на наименее загруженный или наиболее подходящий Web-сервер из группы машин, на которых хранятся зеркальные копии информационного ресурса. Клиент не подозревает о том, что обращается к целой группе серверов: все они представляются ему в виде некоего единого виртуального сервера.

Рассмотрим один из способов – расширение CLUSTERIP для iptables, реализованное в виде модуля к ядру.

Дополнительный модуль для iptables -  CLUSTERIP позволяет создать простой кластер узлов, использующих общую пару адресов IP и MAC, без явной системы распределения (балансировки) трафика перед этим кластером. Соединения будут статически распределяться между узлами кластера.

Данный модуль к iptables, позволяет использовать один multicast MAC адрес на всех серверах кластера. Приняв запрос, за нодой кластера закрепляется обработка всех пакетов пришедших с клиентского IP (также можно учитывать порт назначения и отправки пакета).

Операция поддерживает несколько опций для создания и управления кластером.

–new

создает новый кластер ClusterIP. Эта операция всегда должна быть первой среди операций для данного ClusterIP.

–hashmode <режим>

задает режим хэширования (Распределения соединений между узлами кластера) и может принимать значения:

  • sourceip – распределение по адресу отправителя
  • sourceip-sourceport – адрес и порт отправителя
  • sourceip-sourceport-destport -адрес и порт отправителя, порт получателя
  • –clustermac mac

задает MAC-адрес для кластера. По сути, этот адрес является multicast-адресом канального уровня.

–total-nodes <количество>

задает общее число узлов в кластере.

–local-node <номер>

определяет локальный номер узла в кластере.

–hash-init rnd

задает случайное значение, используемое при инициализации hash-функции.

Для использования операции CLUSTERIP требуется ядро со включенной опцией CLUSTERIP target support. Если для опции было выбрано значение M, потребуется также загрузка модуля ядра ipt_CLUSTERIP.

Исходные данные:

  1. 2 а сервера – ivbal1 и ivbal2
  2. Операционная система CentOS 5.5
  3. Пакет СlusterIp

Установка пакетов.

#wget  -O /etc/yum.repos.d/CentOS-Testing.repo \ http://dev.centos.org/centos/5/CentOS-Testing.repo
# yum –enablerepo c5-testing install iptables-mod-CLUSTERIP

Добавляем экспериментальный репозитаоий и ставим пакет от туда. Маленькое но существенное замечание !!! -

Последний пакет CLUSTERIP не совместим с последней версией пакета iptables. Для того что бы поставить пакет, удаляем полностью пакеты связанные с iptables. Cмотри картинку.

image

Далее ставим пакет :

# yum –enablerepo c5-testing install iptables-mod-CLUSTERIP

по зависимостям ставится нужная версия iptables.

Далее подгружаем :

# modprobe ipt_conntrack
# modprobe ipt_CLUSTERIP

Уточнение:

Для того чтобы модуль ipt_conntrack, подгружался автоматически после рестарта iptables. Правим /etc/sysconfig/iptables-config :

image

Прописываем правила для iptables

Для node1 – ivbal1

# iptables –I INPUT -d 10.0.1.187 -i eth0 -j CLUSTERIP –new –clustermac 01:00:5e:00:00:20 –total-nodes 2 –local-node 1 –hashmode sourceip-sourceport
# service iptables save

для node2 – ivbal2

# iptables –I INPUT -d 10.0.1.187 -i eth0 -j CLUSTERIP –new –clustermac 01:00:5e:00:00:20 –total-nodes 2 –local-node 2 –hashmode sourceip-sourceport
# service iptables save

Опции модуля расписаны в введении.

Создаем алиасы сетевого интерфейса в нужной сети.

На обоих нодах одинаково. У меня для eth0 в node1, node2 – сеть 10.0.1.0\24.

DEVICE=eth0:0
BOOTPROTO=static
HWADDR=01:02:03:04:05:06
#HWADDR=E4:1F:13:2C:87:B0
IPADDR=10.0.1.187
NETMASK=255.255.255.0
ONBOOT=yes

Мак адрес можно не указывать, подхватывается мак интерфейса eth0.

Поднимать алиасы тоже нет необходимости – подымаются сразу на обоих машинах после рестарта интерфейса eth0 – на обоих машинах.

Node 2:

Меняем местами ноды.
# echo "+1" > /proc/net/ipt_CLUSTERIP/10.0.1.187

Возвращаем в исходное.

# echo "-1" > /proc/net/ipt_CLUSTERIP/10.0.1.187

Просмотр состояния :

# cat /proc/net/ipt_CLUSTERIP/10.0.1.187

Логи работающей системы:

image

Дополнительная информация. В работающей системе.

Состояние загруженных модулей:

image

Информация о модуле ipt_CLUSTERIP, ip_conntrack пакете iptables:

image

image

modinfo:

image

Информация по сетевым интерфейсам:

image

uname -a

Linux ivbal1 2.6.18-194.3.1.el5 #1 SMP Thu May 13 13:08:30 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux

Проверка.

Для проверки нужен веб-сервер. Установим Apache. yum – нам поможет.

далее сделаем тестовые страницы:

Node 1:

# cat << EOF > /var/www/html/index.html
NODE1
EOF

Node 2:

# cat << EOF > /var/www/html/index.html
NODE2
EOF

Запускаем :

# service httpd start

Заходим с третьей машины по удаленному адресу в браузере  http://10.0.1.187. Жмем – cntrl-shift – R  – обновлять без кэша. Видим как меняется на страничке надпись – NODE1 NODE2 NODE 1 ……..

Источники. Информации в интернете не много, но ее достаточно чтоб настроить балансировку основанную на модуле CLUSTERIP.

1. http://ben.timby.com/?p=48 Основная статья.

2. http://security.maruhn.com/iptables-tutorial/x8906.html

3. http://www.protocols.ru/modules.php?name=News&file=print&sid=103

Метки: ,

Один ответ на “Load Balancing в Linux с использованием iptables с расширением CLUSTERIP.”

  1. Bonding Linux. VLAN. iptables CLUSTERIP. « Nordbez’s WebBlog.:

    [...] Мой предыдущий пост [...]

Обсуждение закрыто.


Follow

Get every new post delivered to your Inbox.