Введение.
Часто для 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.
Исходные данные:
- 2 а сервера – ivbal1 и ivbal2
- Операционная система CentOS 5.5
- Пакет С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мотри картинку.
Далее ставим пакет :
# yum –enablerepo c5-testing install iptables-mod-CLUSTERIP
по зависимостям ставится нужная версия iptables.
Далее подгружаем :
# modprobe ipt_conntrack
# modprobe ipt_CLUSTERIP
Уточнение:
Для того чтобы модуль ipt_conntrack, подгружался автоматически после рестарта iptables. Правим /etc/sysconfig/iptables-config :
Прописываем правила для 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
Логи работающей системы:
Дополнительная информация. В работающей системе.
Состояние загруженных модулей:
Информация о модуле ipt_CLUSTERIP, ip_conntrack пакете iptables:
modinfo:
Информация по сетевым интерфейсам:
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
Июнь 3, 2010 в 17:13
[...] Мой предыдущий пост [...]