Балансировщики Нагрузки Кластера
Кластерная архитектура CommuniGate Pro позволяет балансировщику нагрузки направить любое соединение на любой работающий Сервер, снимая необходимость в сложных и ненадёжных балансировщиках нагрузки, работающих на более "высоком уровне" прикладных протоколов. Для управления трафиком могут использоваться недорогие Коммутаторы, работающие на Уровне OSI 4.
Дополнительно, Динамический Кластер CommuniGate Pro способен управлять программными балансировщиками нагрузки, такими как модуль "ipvs" ядра ОС Linux: Кластер CommuniGate Pro собирает информацию о работающих Серверах, принадлежащих одной или более "группам балансировки", выясняет, какие из серверов могут использоваться в качестве балансировщиков, назначает балансировщиком один из серверов группы, информируя его об остальных членах этой группы, и назначает балансировщиком другой сервер, если текущий был остановлен.
DSR (Прямой Ответ Сервера) or DR (Прямая Маршрутизация)
DSR (Direct Server Response, Прямой Ответ Сервера) является наиболее предпочтительным методом Балансировки Нагрузки при крупных установках. При использовании этого метода каждый Сервер настроен для использования VIP (Виртуального адреса IP) в качестве локального. Это позволяет каждому серверу принимать пакеты, адресованные на адреса VIP, и отвечать клиентам, используя VIP в качестве адреса отправителя.
Серверы не должны отвечать на запросы arp на эти адреса VIP. Вместо них на эти запросы отвечает балансировщик, и, таким образом, все входящие пакеты присылаются на балансировщик, который перенаправляет их на Серверы. Перепосылаемые пакеты адресуются прямо на MAC адрес Сервера, без изменения адреса назначения, которым остаётся VIP.
Обратите внимание
Из-за того, что для перенаправления входящих пакетов используются MAC адреса, Балансировщик Нагрузки и все балансируемые серверы (обычно - Фронтенд-Серверы Кластера CommuniGate Pro) должны входить в один сегмент сети; между Балансировщиком Нагрузки и этими серверами не должно быть никакого Маршрутизатора.
Для использования DSR метода создайте "псевдоним" для сетевого интерфейса "внутренней петли" (loopback network interface) каждого Фронтенд-Сервера. Стандартным адресом для внутренней петли является 127.0.0.1; создайте для неё псевдоним с VIP адресом и маской сети 255.255.255.255:
Solaris
ifconfig lo0:1 plumb ifconfig lo0:1 _VIP_ netmask 255.255.255.255 up
Для того, чтобы сделать эту конфигурацию постоянной, создайте файл
/etc/hostname.lo0:1
с VIP-адресом в нём.FreeBSD
Для того, чтобы сделать эти изменения в конфигурации постоянными, добавьте следующую строку в файл
/etc/rc.conf
:ifconfig_*_lo0_alias0="inet _VIP_ netmask 255.255.255.255"
Linux
ifconfig lo:0 _VIP_ netmask 255.255.255.255 up
или
ship address add _VIP_/32 dev lo
Для того, чтобы сделать эту конфигурацию постоянной, создайте файл
/etc/sysconfig/network-scripts/ifcfg-lo:0
:DEVICE=lo IPADDR=VIP NETMASK=255.255.255.255 ONBOOT=yes
Убедитесь, что ядро настроено так, что оно не рассылает пакеты ARP для этого
lo
интерфейса (так чтоVIP
адреса не связаны ни с каким Фронтенд-Сервером в таблицах ARP). В зависимости от версии ядра Linux, в файл/etc/sysctl.conf
должны быть добавлены следующие команды:# ARP: reply only if the target IP address is # a local address configured on the incoming interface net.ipv4.conf.all.arp_ignore = 1 # # When an arp request is received on eth0, only respond # if that address is configured on eth0. net.ipv4.conf.eth0.arp_ignore = 1 # # Enable configuration of arp_announce option net.ipv4.conf.all.arp_announce = 2 # When making an ARP request sent through eth0, always use an address # that is configured on eth0 as the source address of the ARP request. net.ipv4.conf.eth0.arp_announce = 2 # # Repeat for eth1, eth2 (if exist) #net.ipv4.conf.eth1.arp_ignore = 1 #net.ipv4.conf.eth1.arp_announce = 2 #net.ipv4.conf.eth2.arp_ignore = 1 #net.ipv4.conf.eth2.arp_announce = 2
Если вы планируете использовать несколько балансируемых адресов VIP, либо если вы планируете использовать программный балансировщик IPVS под управлением CommuniGate Pro, не надо создавать файлы
/etc/sysconfig/network-scripts/ifcfg-lo:_n_
. Создайте файл/etc/sysconfig/vipaddrs
и запишите все адреса VIP в него - как адреса или подсети, по одному адресу на строку. Например:# single addresses 72.20.112.45 72.20.112.46 # a subnetwork 72.20.112.48/29
Обратите внимание
Строки, начинающиеся с символа # игнорируются. Их можно использовать в качестве комментариев.
Обратите внимание
Маски подсетей должны быть 24 бита или более.
Создайте следующие конфигурационные сценарии:
/etc/sysconfig/network-scripts/ifvip-utils
bash#!/bin/bash # # /etc/sysconfig/network-scripts/ifvip-utils # VIPADDRFILE="/etc/sysconfig/vipaddrs" VIPLIST="" # list of VIP masks: xxx.yy.zz.tt/mm where mm should be >= 24 for xVIP in `cat $VIPADDRFILE | grep -v '^#'`; do if [[ $xVIP != */* ]]; then xVIP=$xVIP/32; fi if (( ${xVIP##*/} < 24)); then echo "Incorrect mask: $xVIP" >2 ; exit 1; fi VIPLIST="$VIPLIST$xVIP " done CURRENT=`ip address show dev lo | egrep '^ +inet [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\/32 .*$' | sed -r 's/ +inet ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*/\1/' ` function contains() { local x; for x in $1; do if [[ $x == $2 ]]; then return 0; fi done return 1 }
/etc/sysconfig/network-scripts/ifup-lo
bash#!/bin/bash # # /etc/sysconfig/network-scripts/ifup-lo # /etc/sysconfig/network-scripts/ifup-eth ${1} ${2} # # Bring up all addresses listed in the VIPADDRFILE file, as lo aliases # . /etc/sysconfig/network-scripts/ifvip-utils for xVIP in $VIPLIST; do xIP=${xVIP%/*} # xx.xx.xx.yy/mm -> xx.xx.xx.yy xIP0=${xIP%.*} # xx.xx.xx.yy/mm -> xx.xx.xx xIP1=${xIP##*.} # xx.xx.xx.yy/mm -> yy xMask=$(( 2 ** (32 - ${xVIP##*/}) )) for (( index=0; index<$xMask; index++ )); do thisIP=$xIP0.$((xIP1 + index)) if ! $(contains "$CURRENT" "$thisIP"); then ip address add $thisIP/32 dev lo fi done done
/etc/sysconfig/network-scripts/ifdown-lo
bash#!/bin/bash # # /etc/sysconfig/network-scripts/ifdown-lo # # Bring down all addresses listed in the VIPADDRFILE file # . /etc/sysconfig/network-scripts/ifvip-utils for xVIP in $VIPLIST; do xIP=${xVIP%/*} # xx.xx.xx.yy/mm -> xx.xx.xx.yy xIP0=${xIP%.*} # xx.xx.xx.yy/mm -> xx.xx.xx xIP1=${xIP##*.} # xx.xx.xx.yy/mm -> yy xMask=$(( 2 ** (32 - ${xVIP##*/}) )) for (( index=0; index<$xMask; index++ )); do thisIP=$xIP0.$((xIP1 + index)) if $(contains "$CURRENT" "$thisIP"); then ip address delete $thisIP/32 dev lo fi done done /etc/sysconfig/network-scripts/ifdown-eth ${1} ${2}
другие ОС
уточните у производителя ОС
Обратите внимание
При создании сетевого "псевдонима", откройте через Веб Интерфейс Администратора в разделе Установки страницу Общее -> Информация и нажмите на кнопку Обновить, чтобы сервер мог обнаружить добавленный IP адрес.
DSR метод прозрачен для всех протоколов, работающих через TCP (включая SIP через TCP/TLS) и для него не требуются никакие дополнительные настройки Сервера CommuniGate Pro: когда на локальный VIP адрес принимается TCP соединение, исходящие пакеты для такого соединения будут всегда иметь в качестве адреса источника тот же самый VIP адрес.
Для того, чтобы использовать DSR метод для SIP UDP, конфигурация Фроненд-Серверов CommuniGate Pro должна быть изменена:
- через Веб Интерфейс Администратора откройте область Установки. В разделе Real-Time откройте страницу SIP, затем откройте страницу Приём
- нажмите на ссылку UDP Приёмник, для того чтобы открыть страницу Приёмника
- по умолчанию Приёмник SIP UDP имеет один сокет: он принимает "все адреса" на порту 5060.
- измените настройку, изменив значение "все адреса" на значение VIP (VIP адрес должен быть доступен для выбора из меню).
- нажмите на кнопку Модифицировать
- создайте дополнительный сокет для получения входящих пакетов на порт 5060, "все адреса" и нажмите на кнопку Модифицировать
Теперь у вас есть два сокета - первый для VIP:5060, а второй для все адреса:5060; при необходимости Фронтенд-Сервер может использовать первый сокет для отправки пакетов с VIP адресом в качестве адреса источника.
Повторите эти изменения в настройке для всех Фронтенд-Серверов.
Проверочные Вызовы
Балансировщик нагрузки обычно отправляет некоторые запросы на сервера в своих "балансировочных пулах". При неполучении ответа Балансировщик Нагрузки удаляет сервер из пула и распределяет входящие запросы на оставшиеся в пуле сервера.
Если SIP-Ферма включена, собственные запросы Балансировщика Нагрузки могут передаваться на другие сервера, входящие в SIP-Ферму, и, таким образом, ответы будут поступать от других серверов. Это может привести к тому, что Балансировщик Нагрузки решит, что сервер, которому был послан запрос, не функционирует и исключит этот сервер из обслуживаемого набора серверов.
Для решения этой проблемы используйте следующие запросы SIP для проверки доступности реального сервера Балансировщиком Нагрузки:
OPTION sip:aaa.bbb.ccc.ddd:5060 SIP/2.0
Route: <sip:aaa.bbb.ccc.ddd:5060;lr>
_другие поля пакетов SIP_
где aaa.bbb.ccc.ddd
- IP адрес тестируемого Сервера CommuniGate Pro.
Эти пакеты обрабатываются Сервером aaa.bbb.ccc.ddd
, который генерирует ответы и отправляет их обратно Балансировщику Нагрузки (или тестирующему устройству).
Примеры Конфигураций
Пример конфигурации:
- Маршрутизатор имеет адрес
64.173.55.161
(маска сети255.255.255.224
), DNS Сервер64.173.55.167
. - 4 Фронтенд-Сервера (
fe5
,fe6
,fe7
,fe8
) с "реальными" IP адресами64.173.55.{180,181,182,183}
- внутри-кластерная сеть
192.168.10.xxx
, с "кластерными" адресами Фронтенд-Серверов192.168.10.{5,6,7,8}
- балансировщик нагрузки с адресом
64.173.55.164
(VIP адрес). - на каждом Фронтенд-Сервере на интерфейсе сетевой петли сконфигурирован псевдоним для адреса
64.173.55.164
.
Для RTP используется метод с несколькими адресами IP без NAT.
Конфигурация CommuniGate Pro (раздел Установки в Веб Интерфейсе Администратора):
- страница Сеть->LAN->Общие для Кластера: IPv4 WAN Адрес:
64.173.55.164
- страница Сеть->LAN->Общие для Сервера (на каждом из Фронтенд-Серверов): IPv4 WAN Адрес:
64.173.55.{180,181,182,183}
- страница Real-Time->SIP->Приём->UDP Приёмник (на каждом из Фронтенд-Серверов): {порт
5060
, адрес:64.173.55.164
} и {порт:5060
, адрес:все адреса
;}
Конфигурация "без NAT", с "нормальной" балансировкой нагрузки для POP, IMAP и "DSR" балансировкой нагрузки для SIP (UDP/TCP), SMTP, HTTPU (8100).
Конфигурация Балансировщика Нагрузки:
Foundry ServerIron® (его служебный адрес -
64.173.55.176
)Startup configuration: ! server predictor round-robin ! server real fe5 64.173.55.180 port pop3 port pop3 keepalive port imap4 port imap4 keepalive port 5060 port 5060 keepalive port smtp port smtp keepalive port 8100 port 8100 keepalive ! server real fe6 64.173.55.181 port pop3 port pop3 keepalive port imap4 port imap4 keepalive port 5060 port 5060 keepalive port smtp port smtp keepalive port 8100 port 8100 keepalive ! server real fe7 64.173.55.182 port pop3 port pop3 keepalive port imap4 port imap4 keepalive port 5060 port 5060 keepalive port smtp port smtp keepalive port 8100 port 8100 keepalive ! server real fe8 64.173.55.183 port pop3 port pop3 keepalive port imap4 port imap4 keepalive port 5060 port 5060 keepalive port smtp port smtp keepalive port 8100 port 8100 keepalive ! ! server virtual vip1 64.173.55.164 predictor round-robin port pop3 port imap4 port 5060 port 5060 dsr port smtp port smtp dsr port 8100 port 8100 dsr bind pop3 fe5 pop3 fe6 pop3 fe7 pop3 fe8 pop3 bind imap4 fe5 imap4 fe6 imap4 fe7 imap4 fe8 imap4 bind 5060 fe8 5060 fe7 5060 fe6 5060 fe5 5060 bind smtp fe8 smtp fe7 smtp fe6 smtp fe5 smtp bind 8100 fe5 8100 fe6 8100 fe7 8100 fe8 8100 ! ip address 64.173.55.176 255.255.255.224 ip default-gateway 64.173.55.161 ip dns server-address 64.173.55.167 ip mu act end
Обратите внимание
Вы НЕ должны использовать
port 5060 sip-switch
,port sip sip-proxy-server
или другие "умные" (уровня приложений) возможности Балансировщика Нагрузки.Alteon/Nortel AD3® (служебный адрес -
64.173.55.176
, аппаратный порт 1 используется соединения с Интернет, к портам 5-8 присоединены Фронтенд-Серверы)script start "Alteon AD3" 4 /**** DO NOT EDIT THIS LINE! /* Configuration dump taken 21:06:57 Mon Apr 9, 2007 /* Version 10.0.33.4, Base MAC address 00:60:cf:41:f5:20 /c/sys tnet ena smtp "mail.communigatepro.ru" mnet 64.173.55.160 mmask 255.255.255.224 /c/sys/user admpw "ffe90d3859680828b6a4e6f39ad8abdace262413d5fe6d181d2d199b1aac22a6" /c/ip/if 1 ena addr 64.173.55.176 mask 255.255.255.224 broad 64.173.55.191 /c/ip/gw 1 ena addr 64.173.55.161 /c/ip/dns prima 64.173.55.167 /c/sys/ntp on dlight ena server 64.173.55.167 /c/slb on /c/slb/real 5 ena rip 64.173.55.180 addport 110 addport 143 addport 5060 addport 25 addport 8100 submac ena /c/slb/real 6 ena rip 64.173.55.181 addport 110 addport 143 addport 5060 addport 25 addport 8100 submac ena /c/slb/real 7 ena rip 64.173.55.182 addport 110 addport 143 addport 5060 addport 25 addport 8100 submac ena /c/slb/real 8 ena rip 64.173.55.183 addport 110 addport 143 addport 5060 addport 25 addport 8100 submac ena /c/slb/group 1 add 5 add 6 add 7 add 8 name "all-services" /c/slb/port 1 client ena /c/slb/port 5 server ena /c/slb/port 6 server ena /c/slb/port 7 server ena /c/slb/port 8 server ena /c/slb/virt 1 ena vip 64.173.55.164 /c/slb/virt 1/service pop3 group 1 /c/slb/virt 1/service imap4 group 1 /c/slb/virt 1/service 5060 group 1 udp enabled udp stateless nonat ena /c/slb/virt 1/service smtp group 1 nonat ena /c/slb/virt 1/service 8100 group 1 nonat ena / script end /**** DO NOT EDIT THIS LINE!
F5 Big-IP® (его служебный адрес -
64.173.55.176
)Используйте возможность nPath Routing для SIP UPD/TCP трафика. Это название, принятое в F5 Networks, Inc. для метода Прямого Ответа Сервера.
Из-за того, что F5 BigIP не является коммутатором, вы должны использовать метод DSR (nPath Routing) для всех сервисов.bigip_base.conf:
vlan external { tag 4093 interfaces 1.1 1.2 } stp instance 0 { vlans external interfaces 1.1 external path cost 20K internal path cost 20K 1.2 external path cost 20K internal path cost 20K } self allow { default udp snmp proto ospf tcp https udp domain tcp domain tcp ssh } self 64.173.55.176 { netmask 255.255.255.224 vlan external allow all }
bigip.conf:
partition Common { description "Repository for system objects and shared objects." } route default inet { gateway 64.173.55.161 } monitor MySMTP { defaults from smtp dest *:smtp debug "no" } profile fastL4 CGS_fastL4 { defaults from fastL4 idle timeout 60 tcp handshake timeout 15 tcp close timeout 60 loose initiation disable loose close enable software syncookie disable } pool Frontends { monitor all MySMTP and gateway_icmp members 64.173.55.180:any 64.173.55.181:any 64.173.55.182:any 64.173.55.183:any } node * monitor MySMTP
bigip_local.conf:
virtual address 64.173.55.164 { floating disable unit 0 } virtual External { translate address disable pool Frontends destination 64.173.55.164:any profiles CGS_fastL4 }
Исходящие соединения TCP
Когда адрес VIP присвоен домену CommuniGate Pro, модули CommuniGate Pro можно настроить так, чтобы исходящие соединения TCP использовали эти адреса VIP в качестве сетевого адреса источника. Если так сделать, то пакеты с ответами будут приходить на балансировщик нагрузки, и его надо настроить для переадресации этих пакетов с ответами на правильный член Кластера - на Сервер CommuniGate Pro, который установил это соединение TCP.
Для каждого члена кластера, который способен создавать исходящие соединения TCP (обычно это - Фронтенд-Серверы), надо выбрать диапазон портов для использования в исходящих соединениях. Эти диапазоны не должны пересекаться. Например, для первого Члена кластера выберите диапазон 33000-33999, для второго - 34000-34999, и так далее.
Убедитесь, что ОС сервера настроена так, что выбранные диапазоны портов исключены из диапазона динамических портов. Например, следующие команды могут быть использованы в ОС Linux Для получения диапазона динамических портов:
> cat /proc/sys/net/ipv4/ip_local_port_range
32768 61000
>
например, следующие команды могут быть использованы в ОС Linux Для изменения диапазона динамических портов:
> echo "50000 61000" > /proc/sys/net/ipv4/ip_local_port_range
> cat /proc/sys/net/ipv4/ip_local_port_range
50000 61000
>
Для того, чтобы сделать эти изменения в конфигурации постоянными, добавьте следующую строку в файл /etc/sysctl.conf
:
net.ipv4.ip_local_port_range = 50000 61000
На каждом Члене Кластера откройте настройки Сети в разделе Установок Интерфейса Администратора и укажите выбранный диапазон портов TCP. Отключите настройку "Использовать только для Медиа Прокси", чтобы Сервер CommuniGate Pro использовал порты из этого диапазона для создания исходящих соединений TCP с определённым адресом источника.
Настройте Балансировщик Нагрузки: все пакеты, адресованные на адрес VIP на порт с номером из выбранного диапазона, должны быть отправлены на соответствующий Член Кластера.
Программный Балансировщик Нагрузки
Динамический Кластер CommuniGate Pro может быть использован для управления программными балансировщиками нагрузки, такими как Linux IPVX, запущенными на тех же системах, что используются в качестве членов Кластера.
Выберите члены кластера, на которые будет распределяться входящий трафик. В конфигурации фронтенд-бэкенд для этого обычно используются все фронтенды.
Убедитесь, что на всех выбранных членах кластера в качестве алиаса на локальном интерфейсе (loopback) настроен адрес VIP (смотрите выше).
Через Веб Интерфейс Администратора откройте в разделе Установки страницу Кластер и выберите группу балансировки A для выбранных серверов:
Вес Балансировки
Используйте эту настройку для указания относительного веса этого сервера в Группе Балансировки Нагрузки. Чем больше это значение, тем большая часть входящих соединений TCP и пакетов UDP распределяется на этот сервер.
Все или часть выбранных серверов должны быть оснащены программным обеспечением балансировщика нагрузки, и у них должна быть настроена программа-помощник "Внешний балансировщик Нагрузки". Эта программа должна реализовывать Протокол Помощника Балансировки Нагрузки.
Как только первая программа-помощник Балансировки Нагрузки запущена на Члене Кластера, Контроллер Кластера активизирует Балансировщик и направляет весь входящий трафик на этот член Кластера, который распределяет этот трафик на сервер Группы Балансировки этого члена Кластера.
Если член Кластера с активным Балансировщиком Нагрузки останавливается или переключается в состояние "не готов", Контроллер Кластера запускает другой балансировщик нагрузки в этой же группе (если такой есть).
Linux IPVS
Пакет CommuniGate Pro для Linux включает в себя сценарий оболочки Services/IPVSHelper.sh
, который может быть использован для управления балансировщиком нагрузки IPVS.
Этот сценарий ожидает наличия файла с адресами VIP в /etc/sysconfig/vipaddrs
и настройки локального интерфейса (loopback) с этими адресами (смотрите выше).
Укажите $Services/IPVSHelper.sh _parameters_
в качестве пути к приложению-помощнику Внешнего Балансировщика Нагрузки, и запустите его, включив маркер Помощника.
Поддерживаются следующие параметры:
-p _число_
постоянство: все соединения с того же адреса IP будут направлены на тот же Член Кластера, если они получены в течение указанного числом количества секунд. Укажите 0 (ноль) для отключения постоянства. По умолчанию используется значение 15 секунд.
-i _интерфейс_
имя сетевого интерфейса, на который приходят пакеты. адресованные на адрес VIP. По умолчанию используется имя
eth0
.-s _число_
значение "идентификатора синхронизации" (syncID), который используется для синхронизации таблиц соединений с активного балансировщика нагрузки на другие Члены Кластера в этой же группе балансировки. По умолчанию используется значение 0.
-t _число_
значение тайм-аута (в секундах) на чтение команд, отправленных сервером CommuniGate Pro. По умолчанию используется значение 15 секунд.
-f _путь-к-файлу_
путь в файловой системе сервера к файлу со списком адресов VIP. По умолчанию используется значение
/etc/sysconfig/vipaddrs
-r _число_
значение относительного веса активного балансировщика в Группе Балансировки Нагрузки. Для всех других членов группы применяется значение 100. По умолчанию используется значение 100.
-m
если указан этот параметр, то программа-помощник не выполняет команды оболочки ОС на самом деле, а только записывает их в лог CommuniGate Pro.
Обратите внимание
Рекомендуется использовать ядро Linux версии 3.5.3-1 или новее. При использовании более ранних версий ядра, соединения TCP к активному балансировщику нагрузки прерываются, когда другой сервер становится активным балансировщиком.
Обратите внимание
Если на члене Кластера включить программу-помощник внешнего балансировщика нагрузки, а потом выключить. Некоторые активные соединения могут быть разорваны. Если вы не планируете снова запускать программу-помощник, перезапустите службу ipvsadm
в ОС, или полностью отключите её.