Распределение нагрузки между несколькими реальными серверами. Keepalived
Linux Virtual Server (LVS) — это набор интегрированных программных компонентов для распределения нагрузки между несколькими реальными серверами. LVS работает на двух одинаково настроенных компьютерах: один из них явлается активным LVS-балансировщик нагрузки, а второй- резервным LVS-балансировщик нагрузки. Активный LVS-маршрутизатор выполняет две задачи:
Распределение нагрузки между реальными серверами.
Проверка работоспособности сервисов на каждом реальном сервере.
Резервный LVS-маршрутизатор отслеживает состояние активного LVS-маршрутизатора и берет на себя функции последнего в случае выхода его из строя.
Одним из преимуществ использования LVS является его способность выполнять гибкую балансировку нагрузки уровня IP в пуле реальных серверов. Такая гибкость объясняется наличием большого количества алгоритмов планировщика, которые администратор может выбрать на этапе настройки LVS. Балансировка нагрузки в LVS значительно превосходит такие методы, как Round-Robin DNS, когда иерархическая структура DNS и кеширование на клиентской машине может привести к разбалансировке нагрузки. В дополнение, низкоуровневая фильтрация, используемая в LVS-балансировщик нагрузки, имеет ряд преимуществ перед перенаправлением запросов уровня приложения, так как балансировка нагрузки на уровне сетевых пакетов требует меньших вычислительных затрат и обеспечивает лучшую масштабиремость, в отличии, например, Nginx, который может использоваться как балансировщики нагрузки на 7-м уровне моделе OSI (уровне приложений)
Используя планировщик, активный балансировщик нагрузки может принимать во внимание активность реального сервера, а также, опционально, назначенный администратором весовой коэффициент при распределении запросов к сервису. Использование назначенных весовых коэффициентов позволяет назначить индивидуальным машинам произвольные приоритеты. При использовании соответствующего режима планировщика становится возможным построение пула реальных серверов на базе различных аппаратных и программных конфигураций. При этом активный балансировщик нагрузки может равномерно распределять нагрузку между реальными серверами.
Механизм планировщика LVS реализован в наборе патчей ядра, известных как модули IP Virtual Server или IPVS. Эти модули реализуют коммутацию на 4 уровне (L4), что позволяет работать с множеством серверов, используя всего один IP-адрес.
Для эффективного отслеживания состояния и маршрутизации пакетов IPVS строит в ядре таблицу IPVS. Эта таблица используется активным балансировщик нагрузки для перенаправления запросов с адреса виртуального сервера на адреса реальных серверов в пуле, а также для перенаправления ответов реальных серверов клиентам. Таблица IPVS постоянно обновляется при помощи утилиты ipvsadm, которая добавляет и убирает реальные серверы в зависимости от их доступности.
Структура, которую приобретает таблица IPVS зависит от алгоритма планировщика, который администратор выбирает для каждого виртуального сервера
В данной схеме используется алгоритм Round-Robin с использованием весовых коэффициентов(wrr)
Последовательно распределяет поступающие запросы в пуле реальных серверов, но при этом больше загружая серверы с большей производительностью. Производительность обозначается назначенным администратором весовым коэффициентом, который впоследствии корректируется с использованием динамической информации о загрузке
Существуют также разные методы маршрутизации пакетов:
Direct Routing (gatewaying)— пакет направляется напрямую на ферму, без изменений.
NAT (masquarading) — просто хитрый механизм NAT.
IPIP incapsulation (tunneling) — туннелирование.
Построение LVS, использующего прямую маршрутизацию, обеспечивает большую производительность в сравнении с другими сетевыми конфигурациями. Прямая маршрутизация позволяет реальным серверам обрабатывать и направлять пакеты непосредственно пользователю, отправившему запрос. Прямая маршрутизация уменьшает возможность возникновения узкого места, как в случае с NAT-маршрутизацией, поскольку LVS-балансировщик нагрузки используется только для обработки входящих пакетов.
В типовой реализации LSV с использованием прямой маршрутизации LVS- балансировщик нагрузки получает входящий запрос через виртуальный IP (VIP) и передает этот запрос реальному серверу, используя выбранный алгоритм маршрутизации. Реальный сервер обрабатывает запрос и посылает ответ непосредственно клиенту, минуя LVS- балансировщик нагрузки. Такой способ маршрутизации позволяет получить масштабируемое решение, в котором добавление реальных серверов не создает дополнительной нагрузки на LVS-маршрутизатор.
Server1 10.4.1.181 lb1.domain.local – основной балансировщик нагрузки
Server2 10.4.1.182 lb2.domain.local – резервный балансировщик нагрузки
Server3 10.4.1.151 web1.domain.local – первый web-сервер(Nginx+PHP-FPM)
Server4 10.4.1.152 web2.domain.local – второй web-сервер Nginx+PHP-FPM)
VIP-adress – 10.4.1.190 -– плавающий/расшаренный между балансировщиками нагрузки виртуальный IP-адрес,на который прописаны сайты в DNS
Этот VIP-адрес имеет на себе только активный в данный момент балансировщик нагрузки.Если такой активный lb выходит со строя, тогда резервный балансировщик принимает его на себя.
1. На обоих балансерах устанавливаем keepalived(он подтянет все зависимости). Так же установим iptables-persistent для сохранения iptables в файл и загрузки атоматом при старте.
sudo apt-get install keepalived -y
sudo apt-get install iptables-persistent -y
2.Настройка iptables(маркируем траффик) на лоадбалансерах
На 1 балансере:
# iptables -t mangle -N IPVS # iptables -t mangle -I PREROUTING -j IPVS # iptables -t mangle -I IPVS -m mac --mac-source 52:54:00:36:d0:a8 -j RETURN
52:54:00:36:d0:a8 – это mac-adress eth0 на lb02
# iptables -t mangle -A IPVS -d 10.4.1.190/32 -i eth0 -p tcp -m tcp --dport 80 -j MARK --set-xmark 1 # iptables -t mangle -A IPVS -d 10.4.1.190/32 -i eth0 -p tcp -m tcp --dport 443 -j MARK --set-xmark 2 # iptables -S -t mangle # iptables-save > /etc/iptables/rules.v4
На 2 балансере:
# iptables -t mangle -N IPVS # iptables -t mangle -I PREROUTING -j IPVS # iptables -t mangle -I IPVS -m mac --mac-source 52:54:00:06:b2:98 -j RETURN
52:54:00:06:b2:98 – это mac-adress eth0 на lb02
# iptables -t mangle -A IPVS -d 10.4.1.190/32 -i eth0 -p tcp -m tcp --dport 80 -j MARK --set-xmark 1 # iptables -t mangle -A IPVS -d 10.4.1.190/32 -i eth0 -p tcp -m tcp --dport 443 -j MARK --set-xmark 2 # iptables -S -t mangle # iptables-save > /etc/iptables/rules.v4
3.Настройка iptables на обоих Web-серверах
Установим софт для применения правил iptables после перезагрузки
sudo apt-get install iptables-persistent -y
И не забыть еще в /etc/sysctl.conf расскомментировать строку
net.ipv4.ip_forward=1
Необходимо добавить правила, которые создают прозрачный proxy, и после этого реальный сервер будут обрабатывать пакеты, направленные на VIP-адрес, при этом VIP-адрес в системе реального сервера настраивать не нужно.
iptables -t nat -A PREROUTING -p tcp -d 10.4.1.190 --dport 80 -j REDIRECT iptables -t nat -A PREROUTING -p tcp -d 10.4.1.190 --dport 443 -j REDIRECT iptables-save > /etc/iptables/rules.v4
4. Настройка keepalived на лоадбалансерах.
Создадим файлы(по-умолчанию их нет).
sudo su nano /etc/keepalived/keepalived.conf
global_defs { notification_email { test@itc-life.ru } notification_email_from test@itc-life smtp_server smtp.mail.ru smtp_connect_timeout 30 route_id lb01.domain.local } vrrp_instance VRRP_EXT { state MASTER interface eth0 lvs_sync_daemon_interface eth0 virtual_router_id 125 priority 100 smtp_alert advert_int 1 authentication { auth_type PASS auth_pass cbrt32456 } nopreempt virtual_ipaddress { 10.4.1.190/32 } } virtual_server fwmark 1 { delay_loop 5 lb_algo wrr lb_kind DR protocol TCP virtualhost ya.ru real_server 10.4.1.151 80 { weight 100 inhibit_on_failure HTTP_GET { url { path /lbtest.html status_code 200 } connect_port 80 connect_timeout 4 nb_get_retry 5 delay_before_retry 2 } } real_server 10.4.1.152 80 { weight 100 inhibit_on_failure HTTP_GET { url { path /lbtest.html status_code 200 } connect_port 80 connect_timeout 4 nb_get_retry 5 delay_before_retry 2 } } } virtual_server fwmark 2 { delay_loop 5 lb_algo wrr lb_kind DR protocol TCP virtualhost ya.ru real_server 10.4.1.151 443 { weight 100 inhibit_on_failure SSL_GET { url { path /lbtest.html status_code 200 } connect_port 443 connect_timeout 4 nb_get_retry 5 delay_before_retry 2 } } real_server 10.4.1.152 443 { weight 100 inhibit_on_failure SSL_GET { url { path /lbtest.html status_code 200 } connect_port 443 connect_timeout 4 nb_get_retry 5 delay_before_retry 2 } } }
На lb2 тоже самое с небольшими изменениями
nano /etc/keepalived/keepalived.conf
global_defs { notification_email { test@itc-life.ru } notification_email_from test@itc-life smtp_server smtp.mail.ru smtp_connect_timeout 30 route_id lb02.domain.local } vrrp_instance VRRP_EXT { state Backup interface eth0 lvs_sync_daemon_interface eth0 virtual_router_id 125 priority 50 smtp_alert advert_int 1 authentication { auth_type PASS auth_pass cbrt32456 } nopreempt virtual_ipaddress { 10.4.1.190/32 } } virtual_server fwmark 1 { delay_loop 5 lb_algo wrr lb_kind DR protocol TCP virtualhost ya.ru real_server 10.4.1.151 80 { weight 100 inhibit_on_failure HTTP_GET { url { path /lbtest.html status_code 200 } connect_port 80 connect_timeout 4 nb_get_retry 5 delay_before_retry 2 } } real_server 10.4.1.152 80 { weight 100 inhibit_on_failure HTTP_GET { url { path /lbtest.html status_code 200 } connect_port 80 connect_timeout 4 nb_get_retry 5 delay_before_retry 2 } } } virtual_server fwmark 2 { delay_loop 5 lb_algo wrr lb_kind DR protocol TCP virtualhost ya.ru real_server 10.4.1.151 443 { weight 100 inhibit_on_failure SSL_GET { url { path /lbtest.html status_code 200 } connect_port 443 connect_timeout 4 nb_get_retry 5 delay_before_retry 2 } } real_server 10.4.1.152 443 { weight 100 inhibit_on_failure SSL_GET { url { path /lbtest.html status_code 200 } connect_port 443 connect_timeout 4 nb_get_retry 5 delay_before_retry 2 } } }
Включаем маршрутизацию пакетов на обеих балансировщиках нагрузки
sudo su nano /etc/sysctl.conf net.ipv4.ip_forward = 1 sysctl -p
5.Проверка работоспособности
Проверим правила
iptables -t mangle -S
Логи keepalived смотрим в
cat /var/log/messages
Статистику Keepalived смотрим в
watch -d -n 1 "ipvsadm -L --stats"