Балансировка сетевого трафика в Solaris

Про этот блог забыли все, даже Я сам 😉
Попробую опубликовать хотя-бы то что что было написано достаточно давно но не опубликовано.
Уже очень давно состоялась встреча Московской группы пользователей OpenSolaris где в частности рассказывалось о способах балансировки сетевого трафика в Linux и FreeBSD. Однако выяснилось что ни кто не знает что в OpenSolaris также есть балансировки трафика.
В Solaris 10 действительно подобного функционала не было, однако в OpenSolaris был добавлен ILB ( Integrated Load Balancer ). Сейчас ILB уже включен в репозиторий Solaris 11 Express и думаю он будет входить в Solaris 11.
Давайте попробуем разобраться что такое ILB и как его настраивать.
Для начала необходимо проверить установлен ли ILB и если нет, то установить :

root@solaris:~# pkg search ilbadm
INDEX      ACTION VALUE           PACKAGE
basename   file   usr/sbin/ilbadm pkg:/service/network/load-balancer/ilb@0.5.11-0.151.0.1
root@solaris:~# man pkg
root@solaris:~# pkg install pkg:/service/network/load-balancer/ilb@0.5.11-0.151.0.1
               Packages to install:     1
           Create boot environment:    No
               Services to restart:     1
DOWNLOAD                                  PKGS       FILES    XFER (MB)
Completed                                  1/1       11/11      0.2/0.2

PHASE                                        ACTIONS
Install Phase                                  38/38 

PHASE                                          ITEMS
Package State Update Phase                       1/1 
Image State Update Phase                         2/2 

PHASE                                          ITEMS
Reading Existing Index                           8/8 
Indexing Packages                                1/1
root@solaris:~# 

Теперь ILB установлен и мы можем приступить к настройке балансировки.
Для этого надо стартовать демон ilb. Но перед этим надо поднять ip forwarding. Если забыть это сделать то вывод ilbadm вам сразу же подскажет что не так :

root@solaris:~# ilbadm show-rule
ilbadm: socket() failed
root@solaris:~#

В чём ошибка очевидно, не правда ли? 😉
Итак стартуем ip forwarding :

root@solaris:~# svcadm enable svc:/network/ipv4-forwarding
root@solaris:~# svcadm enable svc:/network/loadbalancer/ilb:default

ILB поддерживает 3 режима балансировки :
– DST
– Полный NAT
– Частичный NAT
В режиме DSR ( Direct Server Return ) ILB балансирует входящий трафик между back-end серверами. При этом ответы от back-end серверов идут напрямую клиенту в обход балансировщика.
Режимы основанные на NAT балансировщик обрабатывает как входящий так и исходящий трафик меняя IP адреса в заголовках IP пакетов.
В случае Full-NAT происходит замена и source и destination адреса. Т.Е. заголовок IP пакета выглядит так, как будто back-end сервера получают трафик непосредственно от балансировщика.
Клиенты также будут получать ответы из заранее настроенного диапазона IP адресов. Например от самого балансировщика.
В случае с Half-NAT ILB меняет лишь destination IP.
Чтобы попробовать ILB я взял 3 сервера. Два из них я использовал как back-end сервера. Их адреса : 192.168.57.102 и 192.168.57.103. На них я поднял nginx. Третий сервер выступал балансировщиком. Его адрес : 192.168.57.101.
Чтобы ILB работать, ему надо указать на какие back-end сервера его балансировать. Для этого необходимо создать серверную группу :

root@solaris:~# ilbadm create-servergroup -s servers=192.168.57.102:80,192.168.57.103:80 websg
root@solaris:~# ilbadm show-servergroup
root@solaris:/tmp# ilbadm show-sg
SGNAME         SERVERID            MINPORT MAXPORT IP_ADDRESS
websg          _websg.0            80      80      192.168.57.102
websg          _websg.1            80      80      192.168.57.103

После создается само правило, по которому будет балансироваться трафик. Для начала я настроил Full-NAT:

root@solaris:/tmp# ilbadm create-rule -e -i vip=192.168.56.101,port=80 -m lbalg=rr,type=NAT,proxy-src=192.168.56.101 -o servergroup=websg webrule
root@solaris:/tmp# ilbadm show-rule
RULENAME            STATUS LBALG       TYPE    PROTOCOL VIP         PORT
webrule             E      roundrobin  NAT     TCP  192.168.56.101  80

и это всё!
Я настроил чтобы http трафик на to 192.168.56.101 ( виртуальный IP ) балансировался между двумя другими серверами. Запросы будут обрабатываться back-end серверами по очереди (round-robin). Ответы же будут приходить от адреса 192.168.56.101.
Теперь давайте поменяем правило с Full-NAT на Half-NAT :

ilbadm  delete-rule -a
ilbadm create-rule -e -i vip=192.168.56.101,port=80 -m lbalg=rr,type=h -o servergroup=websg webrule
root@solaris:/tmp# ilbadm show-rule
RULENAME            STATUS LBALG       TYPE    PROTOCOL VIP         PORT
webrule             E      roundrobin  HALF-NAT TCP 192.168.56.101  80

Всё это очень просто настраивается. При этом есть большое количество разнообразных опций. Так например можно изменить алгоритм балансировки запросов между back-end серверами. Кроме того средствами ILB можно настроить мониторинг back-end серверов Кроме того поддерживается Session persistence и Connection draining.

Leave a Reply

Your email address will not be published. Required fields are marked *