Распределение нагрузки между несколькими реальными серверами. Keepalived

Распределение нагрузки между несколькими реальными серверами. 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"

Добавить комментарий

Войти с помощью: 

Ваш e-mail не будет опубликован. Обязательные поля помечены *