Server1: proxmoxapp01.kamaok.org.ua 192.168.1.131 – основной loadbalancer(MASTER)
Server2: proxmoxapp02.kamaok.org.ua 192.168.1.132 – резервный loadbalancer(BACKUP)
VIP(virtual IP) – 192.168.1.136 — плавающий/расшаренный между балансировщиками нагрузки виртуальный IP-адрес,на который прописаны сайты в DNS
1.Установка Keepalived
(в зависимостях подтянет ipvsadm-утилиту для администрирования ipvs (ip virtul server))
Centos
1 |
# yum install keepalived |
Debian
1 |
# apt-get install keepalived |
Включем маршрутизацию пакетов на обоих балансерах
1 |
# nano /etc/sysctl.conf |
1 |
net.ipv4.ip_forward=1 |
1 |
# sysctl -p |
1 |
net.ipv4.ip_forward = 1 |
2.Настройка конфигурационного файлов Master/Backup лоадбалансеров
Настройка конфигурационного файла Master-балансера
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
global_defs { notification_email { your@email } notification_email_from keepalived@proxmoxapp01.kamaok.org.ua smtp_server localhost smtp_connect_timeout 30 router_id proxmoxapp01.kamaok.org.ua } vrrp_instance VI_1 { interface eth0 # interface to monitor state MASTER virtual_router_id 136 # Assign one ID for this route priority 100 # 100 on master, 50 on backup authentication { auth_type PASS auth_pass 123456 } smtp_alert advert_int 1 virtual_ipaddress { 192.168.1.136 # the virtual IP } # Invoked to master transition notify_master "/etc/keepalived/bypass_ipvs.sh del 192.168.1.136" # Invoked to slave transition notify_backup "/etc/keepalived/bypass_ipvs.sh add 192.168.1.136" # Invoked to fault transition notify_fault "/etc/keepalived/bypass_ipvs.sh add 192.168.1.136" } virtual_server 192.168.1.136 80 { delay_loop 5 lb_algo wrr lb_kind DR persistence_timeout 50 # multiple requests from a client are redirected to the same real server selected for the first request (default 300s) protocol TCP real_server 192.168.1.131 80 { inhibit_on_failure #set weight to 0 instead of removing service weight 100 HTTP_GET { url { path /lbtest.php status_code 200 digest 21dde95d9d269cbb2fa6560309dca40c # Can mix digest and status_code # Can only digest code #path /lbtest.php #digest 21dde95d9d269cbb2fa6560309dca40c #Or can only status code #path /lbtest.php #status_code 200 } connect_port 80 connect_timeout 4 nb_get_retry 5 delay_before_retry 2 } } real_server 192.168.1.132 80 { inhibit_on_failure weight 100 HTTP_GET { url { path /lbtest.php status_code 200 digest 21dde95d9d269cbb2fa6560309dca40c } connect_port 80 connect_timeout 4 nb_get_retry 5 delay_before_retry 2 } } } |
Настройка конфигурационного файла Backup-балансера
1 |
# nano /etc/keepalived/keepalived.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
global_defs { notification_email { your@email } notification_email_from keepalived@proxmoxapp02.kamaok.org.ua smtp_server localhost smtp_connect_timeout 30 router_id proxmoxapp02.kamaok.org.ua } vrrp_instance VI_1 { interface eth0 # interface to monitor state BACKUP virtual_router_id 136 # Assign one ID for this route priority 50 # 100 on master, 50 on backup smtp_alert advert_int 1 authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 192.168.1.136 # the virtual IP } #Invoked to master transition notify_master "/etc/keepalived/bypass_ipvs.sh del 192.168.1.136" # Invoked to slave transition notify_backup "/etc/keepalived/bypass_ipvs.sh add 192.168.1.136" # Invoked to fault transition notify_fault "/etc/keepalived/bypass_ipvs.sh add 192.168.1.136" } virtual_server 192.168.1.136 80 { delay_loop 5 lb_algo wrr lb_kind DR persistence_timeout 50 protocol TCP real_server 192.168.1.131 80 { inhibit_on_failure weight 100 HTTP_GET { url { path /lbtest.php status_code 200 digest 21dde95d9d269cbb2fa6560309dca40c } connect_port 80 connect_timeout 4 nb_get_retry 5 delay_before_retry 2 } } real_server 192.168.1.132 80 { inhibit_on_failure weight 100 HTTP_GET { url { path /lbtest.php status_code 200 digest 21dde95d9d269cbb2fa6560309dca40c } connect_port 80 connect_timeout 4 nb_get_retry 5 delay_before_retry 2 } } } |
Например, при использовании Apache
Для Centos
1 |
/var/www/html/lbtest.php |
Для Debian
1 |
/var/www/lbtest.php |
1 |
# nano lbtest.php |
1 2 3 |
<?php echo "OK" ?> |
1 |
# curl -I http://192.168.1.131/lbtest.php |
1 2 3 4 5 |
HTTP/1.1 200 OK Date: Mon, 11 May 2015 12:52:19 GMT Server: Apache Vary: Accept-Encoding Content-Type: text/html |
1 |
# curl -I http://192.168.1.132/lbtest.php |
1 2 3 4 5 |
HTTP/1.1 200 OK Date: Mon, 11 May 2015 12:52:24 GMT Server: Apache Vary: Accept-Encoding Content-Type: text/html |
1 |
# genhash -s 192.168.1.131 -p 80 -u / |
1 |
MD5SUM = 21dde95d9d269cbb2fa6560309dca40c |
1 |
# genhash -s 192.168.1.132 -p 80 -u / |
1 |
MD5SUM = 21dde95d9d269cbb2fa6560309dca40c |
Краткое описание схемы:
Активный LVS-маршрутизатор выполняет две задачи:
Распределение нагрузки между реальными серверами.
Проверка работоспособности сервисов на каждом реальном сервере.
Резервный LVS-маршрутизатор отслеживает состояние активного LVS-маршрутизатора и берет на себя функции последнего в случае выхода его из строя.
Для обмена сообщениями между собой лоадбалансеры используют широковещательную рассылку на адрес 224.0.0.18 по протоколу VRRP.
Из множество других подобных балансеров в сети они находят друг друга по номеру virtual_router_id (в моем случе 136).
Master-балансер имеет больший приоритет(100), чем Backup(50).Если Master-неисправен(выключен сервер,проблемы с сетью, отключен keepalived) т.е Backup не может достичь Master-балансера(не получает от него коректного ответа), тога Backup перебирает роль АКТИВНОГО лоадбалансера на себя – у него появляется VIP-адрес.
root@proxmoxapp02:~
1 |
# tail -f /var/log/messages |
1 2 |
May 11 14:43:48 proxmoxapp02 Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE May 11 14:43:49 proxmoxapp02 Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE |
root@proxmoxapp02:/etc/keepalived
1 |
# ip addr show | grep 192.168.1.136 |
1 |
inet 192.168.1.136/32 scope global eth0 |
Как только неисправный Master становится исправным/доступным, он автоматически забирает на себя VIP-адрес от текущего активного мастера за счет более высокого приоритета (100-Master vs 50-Backup)
root@proxmoxapp02:~
1 |
# tail -f /var/log/messages |
1 2 |
May 11 14:44:31 proxmoxapp02 Keepalived_vrrp: VRRP_Instance(VI_1) Received higher prio advert May 11 14:44:31 proxmoxapp02 Keepalived_vrrp: VRRP_Instance(VI_1) Entering BACKUP STATE |
root@proxmoxapp01:~
1 |
# tail -f /var/log/messages |
1 2 |
May 11 14:44:31 proxmoxapp01 Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE May 11 14:44:32 proxmoxapp01 Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE |
root@proxmoxapp02:/etc/keepalived
1 2 |
# ip addr show | grep 192.168.1.136 root@proxmoxapp02:/etc/keepalived# |
root@proxmoxapp01:/etc/keepalived
1 |
# ip addr show | grep 192.168.1.136 |
1 |
inet 192.168.1.136/32 scope global eth0 |
Для отслеживания используем
1 |
# tcpdump -t -n -i eth0 dst 224.0.0.18 |
1 |
IP 192.168.1.131 > 224.0.0.18: VRRPv2, Advertisement, vrid 136, prio 100, authtype simple, intvl 1s, length 20 |
Активный в данный момент лоадбалансер выполняет проверки на доступность реальных серверов, на которые он перенаправляет запросы клиентов на VIP-адрес
root@proxmoxapp01:~
1 |
# tail -f /var/log/messages |
1 2 |
May 11 14:44:31 proxmoxapp01 Keepalived_healthcheckers: Activating healtchecker for service [192.168.1.131]:80 May 11 14:44:31 proxmoxapp01 Keepalived_healthcheckers: Activating healtchecker for service [192.168.1.132]:80 |
В данном примере он проверяет корректность работы Web-сервера путем выполнения http-запроса файла lbtest.php
В случае ответа отличного от кода 200 лоадбалансер считает,что Web-сервер не доступен/не работает корректно и выбрасывает из балансера этот сервер
root@proxmoxapp01:~
1 |
# /etc/init.d/apache2 stop |
1 |
Stopping web server: apache2 ... waiting . |
root@proxmoxapp01:~
1 |
# tail -f /var/log/messages |
1 2 |
May 11 15:17:42 proxmoxapp01 Keepalived_healthcheckers: Error connecting server [192.168.1.131]:80. May 11 15:17:42 proxmoxapp01 Keepalived_healthcheckers: Removing service [192.168.1.131]:80 from VS [192.168.1.136]:80 |
Проверить, что сервер с нерабочим Web-сервером был выключен из балансера
root@proxmoxapp01:/etc/keepalived
1 |
# ipvsadm -L -n |
1 2 3 4 5 6 7 |
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.1.136:80 wrr -> 192.168.1.132:80 Route 100 0 0 |
root@proxmoxapp01:/etc/keepalived
1 |
# /etc/init.d/apache2 start |
1 |
Starting web server: apache2. |
root@proxmoxapp01:~
1 |
# tail -f /var/log/messages |
1 2 3 |
May 11 15:23:34 proxmoxapp01 Keepalived_healthcheckers: HTTP status code success to [192.168.1.131]:80 url(1). May 11 15:23:39 proxmoxapp01 Keepalived_healthcheckers: Remote Web server [192.168.1.131]:80 succeed on service. May 11 15:23:39 proxmoxapp01 Keepalived_healthcheckers: Adding service [192.168.1.131]:80 to VS [192.168.1.136]:80 |
1 |
ipvsadm |
– это инструмент для управления таблицей ipvs, которая строится из настроек файла keepalived.conf
С помощью утилиты ipvsadm можно вручную изменять эту таблицу
Включать/выключать сервера из балансера, изменять веса(weight) серверов для корректировки кол-ва запросов отправляемых на них активным лоадбалансером и и т.д
Для мониторинга переключения основной/резервный(Master/Backup) балансеров и доступности/недоступности реальных серверов настроена отправка по E-mail
Основной особенностью настройки связки лоадбалансеров на двух севрерах, где они совмещают в себе как роль лоадбалансеров, так и роль реальных серверов является необходимость добавления правила перенапрвления пакетов, которые идут на VIP – адрес на Backup-балансере.
На активном балансере, несущем на себе VIP-адрес
root@proxmoxapp01:/etc/keepalived
1 |
# ip addr show | grep 192.168.1.136 |
1 |
inet 192.168.1.136/32 scope global eth0 |
Пакеты от клиентов не будут отбрасываться т.к предназначены они адресу, который есть на активном лоадбалансере. В отличии от активного лоадбалансера Backup не имеет на себе такого адреса, поэтому будет удалять все запросы на этот адрес т.е активный балансер получая запрос от клиента будет раскидывать его на себя самого(т.к на нем тоже запущен Web-сервер и на backup-балансер, на котором тоже запущен Web-сервер)Но Backup мастер не будет отвечать на такие запросы и клиент не получит корректного ответа
Если бы использовалась схему с 4-мя севрерами 2- балансера и 2 –отдельные Web-севрера, тогда достаточно было повесить алиасом VIP-адрес на loopback-интерфейс на оба WEB-сервера и отрегулировать sysctl-настройки на Web-серверах
1 2 3 4 |
net.ipv4.conf.eth0.arp_ignore=1 net.ipv4.conf.eth0.arp_announce=2 net.ipv4.conf.lo.arp_ignore=1 net.ipv4.conf.lo.arp_announce=2 |
Тогда бы оба Web-сервера корректно принимали и отрабатывали запросы от клиентов
В схеме с двумя серверами в отличии от схемы с 4-мя серверами такой вариант решения может привести к тому, что каждый каждый лоадбалансер решить обрабатвать запрос клиента и решит выбирать соседа для обработаки этого запроса и возникнет зацикливание трафифика – packets storm, что приведет к нагрузке на серверах и невозможности обработать запрос клиента вообще.
Поэтому используется скрипт, который
добавляет перенапрвление пакетов на Backup-балансере
1 |
# iptables -A PREROUTING -t nat -d $VIP -p tcp -j REDIRECT |
и удаляет его на Master(активном)-балансере
1 |
# iptables -D PREROUTING -t nat -d $VIP -p tcp -j REDIRECT |
wget -O /etc/keepalived/bypass_ipvs.sh http://gcharriere.com/blog/wp-content/uploads/2009/10/bypass_ipvs.sh
Если при тестировании скрипта возникает ошибка
root@proxmoxapp02:/etc/keepalived
1 |
# sh bypass_ipvs.sh add 192.168.1.136 |
1 |
bypass_ipvs.sh: 33: bypass_ipvs.sh: Syntax error: "(" unexpected |
меняем в скрипте первую строчку с /bin/sh на /bin/bash
Мониторинг соединений
1 |
# ipvsadm –L –n – просмотр таблицы подключений IPVS |
1 |
# ipvsadm –L –n –stats – просмотр статистики подключений |
1 |
# ipvsadm –L –n –c – просмотр текущих подключений и распределения их по реальным серверам |
Если необходимо разбрасывать соединения https,то добавляем на оба сервера в keepalived.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
virtual_server 192.168.1.136 443 { delay_loop 5 lb_algo wrr lb_kind DR protocol TCP persistence_timeout 50 real_server 192.168.1.131 443 { weight 100 inhibit_on_failure SSL_GET { url { path /lbtest.php status_code 200 digest 5e270a8c5a6a1994998b6829065bd27a } connect_port 443 connect_timeout 4 nb_get_retry 5 delay_before_retry 2 } } real_server 192.168.1.132 443 { weight 100 inhibit_on_failure SSL_GET { url { path /lbtest.php status_code 200 digest 5e270a8c5a6a1994998b6829065bd27a } connect_port 443 connect_timeout 4 nb_get_retry 5 delay_before_retry 2 } } } |
Источник: