CommuniGate Pro
Версия 6.3
 

Балансировщики Нагрузки Кластера

Кластерная архитектура 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
или
ip 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
#!/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
#!/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
#!/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 Для получения диапазона динамических портов:

[prompt]# cat /proc/sys/net/ipv4/ip_local_port_range
32768 61000
[prompt]#
например, следующие команды могут быть использованы в ОС Linux Для изменения диапазона динамических портов:
[prompt]# echo "50000 61000" >/proc/sys/net/ipv4/ip_local_port_range
cat /proc/sys/net/ipv4/ip_local_port_range
50000 61000
[prompt]#
Для того, чтобы сделать эти изменения в конфигурации постоянными, добавьте следующую строку в файл /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 в ОС, или полностью отключите её.


Руководство CommuniGate Pro. Copyright © 2024, АО Система Безопасных Коммуникаций