Существует много решений на основе LVS для создания отказоустойчивого кластера
Например:
1 2 3 4 5 |
Pirnha Ultramonkey Heartbeat+mon Heartbeat+ldirectors 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)
Последовательно распределяет поступающие запросы в пуле реальных серверов, но при этом больше загружая серверы с большей производительностью. Производительность обозначается назначенным администратором весовым коэффициентом, который впоследствии корректируется с использованием динамической информации о загрузке
Существуют также разные методы маршрутизации пакетов
1 |
Direct Routing (gatewaying) |
— пакет направляется напрямую на ферму, без изменений.
1 |
NAT (masquarading) |
— просто хитрый механизм NAT.
1 |
IPIP incapsulation (tunneling) |
— туннелирование.
Построение LVS, использующего прямую маршрутизацию, обеспечивает большую производительность в сравнении с другими сетевыми конфигурациями. Прямая маршрутизация позволяет реальным серверам обрабатывать и направлять пакеты непосредственно пользователю, отправившему запрос. Прямая маршрутизация уменьшает возможность возникновения узкого места, как в случае с NAT-маршрутизацией, поскольку LVS-балансировщик нагрузки используется только для обработки входящих пакетов.
В типовой реализации LSV с использованием прямой маршрутизации LVS- балансировщик нагрузки получает входящий запрос через виртуальный IP (VIP) и передает этот запрос реальному серверу, используя выбранный алгоритм маршрутизации. Реальный сервер обрабатывает запрос и посылает ответ непосредственно клиенту, минуя LVS- балансировщик нагрузки. Такой способ маршрутизации позволяет получить масштабируемое решение, в котором добавление реальных серверов не создает дополнительной нагрузки на LVS-маршрутизатор.
1 2 3 4 |
Server1 lb01.kamaok.org.ua 192.168.1.61 - основной балансировщик нагрузки Server2 lb01.kamaok.org.ua 192.168.1.62 - резервный балансировщик нагрузки Server3 app01.kamaok.org.ua 192.168.1.63 – первый web-сервер(Nginx+PHP-FPM or Nginx+Apache) Server4 app02.kamaok.org.ua 192.168.1.64 – второй web-сервер Nginx+PHP-FPM or Nginx+Apache) |
1 |
VIP-adress – 192.168.1.125 |
– плавающий/расшаренный между балансировщиками нагрузки виртуальный IP-адрес,на который прописаны сайты в DNS
Этот VIP-адрес имеет на себе только активный в данный момент балансировщик нагрузки.Если такой активный lb выходит со строя, тогда резервный lb принимает его на себя.
1.На обоих балансировщиках нагрузки устанавливаем keepalived и ipvsadm
1 |
# yum install keepalived ipvsadm |
2.Настройка iptables(маркируем траффик) на лоадбалансерах
На lb01
1 |
# iptables -t mangle -N IPVS |
1 |
# iptables -t mangle -I PREROUTING -j IPVS |
1 |
# iptables -t mangle -I IPVS -m mac --mac-source 00:0c:29:ce:94:76 -j RETURN |
1 |
00:0c:29:ce:94:76 – это mac-adress eth0 на lb02 |
1 |
# iptables -t mangle -A IPVS -d 192.168.1.125/32 -i eth0 -p tcp -m tcp --dport 80 -j MARK --set-xmark 1 |
1 |
# iptables -t mangle -A IPVS -d 192.168.1.125/32 -i eth0 -p tcp -m tcp --dport 443 -j MARK --set-xmark 2 |
1 |
# iptables -S -t mangle |
1 |
# /etc/init.d/iptables save |
На lb02
1 |
# iptables -t mangle -N IPVS |
1 |
# iptables -t mangle -I PREROUTING -j IPVS |
1 |
# iptables -t mangle -I IPVS -m mac --mac-source 00:0c:29:d4:9c:c6-j RETURN |
1 |
00:0c:29:d4:9c:c6– это mac-adress eth0 на lb01 |
1 |
# iptables -t mangle -A IPVS -d 192.168.1.125/32 -i eth0 -p tcp -m tcp --dport 80 -j MARK --set-xmark 1 |
1 |
# iptables -t mangle -A IPVS -d 192.168.1.125/32 -i eth0 -p tcp -m tcp --dport 443 -j MARK --set-xmark 2 |
1 |
# iptables -S -t mangle |
1 |
# /etc/init.d/iptables save |
3.Настройка iptables на обоих Web-серверах
Необходимо добавить правила, которые создают прозрачный proxy, и после этого реальный сервер будут обрабатывать пакеты, направленные на VIP-адрес, при этом VIP-адрес в системе реального сервера настраивать не нужно.
1 |
# iptables -t nat -A PREROUTING -p tcp -d 192.168.1.125 --dport 80 -j REDIRECT |
1 |
# iptables -t nat -A PREROUTING -p tcp -d 192.168.1.125 --dport 443 -j REDIRECT |
Эти команды заставит реальный сервер обрабатывать пакеты, направленные на VIP-адрес и порт 80 или на VIP-адрес и порт 443,
1 |
# /etc/init.d/iptables save |
4. Настройка keepalived на лоадбалансерах
На lb01
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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
global_defs { notification_email { your@email } notification_email_from keepalived@lb01.kamaok.org.ua smtp_server localhost smtp_connect_timeout 30 route_id lb01.kamaok.org.ua } 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 ahk7sae7aigah3Oe9oochae7ohsoo5 } nopreempt virtual_ipaddress { 192.168.1.125/32 } } virtual_server fwmark 1 { delay_loop 5 lb_algo wrr lb_kind DR protocol TCP virtualhost ya.ru real_server 192.168.1.63 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 192.168.1.64 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 192.168.1.63 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 192.168.1.64 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 } } } |
На lb02 конфигурационный файл отличается несколькими строками
1 2 3 4 |
notification_email_from keepalived@lb02.kamaok.org.ua router_id lb02.kamaok.org.ua state Backup priority 50 |
Включаем маршрутизацию пакетов на обеих балансировщиках нагрузки
1 |
# nano /etc/sysctl.conf |
1 |
net.ipv4.ip_forward = 1 |
1 |
# sysctl -p |
5.Добавление служб в автозагрузку, запуск служб,проверка VIP-адреса на lb01
1 |
# chkconfig --level 2345 keepalived on |
1 |
# chkconfig --level 2345 iptables on |
1 |
# /etc/init.d/iptables start |
1 |
# /etc/init.d/keepalived start |
1 |
# iptables -t mangle -S |
1 2 3 4 5 6 7 8 9 10 |
-P PREROUTING ACCEPT -P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -P POSTROUTING ACCEPT -N IPVS -A PREROUTING -j IPVS -A IPVS -m mac --mac-source 00:0C:29:20:EC:92 -j RETURN -A IPVS -d 192.168.1.125/32 -i eth0 -p tcp -m tcp --dport 80 -j MARK --set-xmark 0x1/0xffffffff -A IPVS -d 192.168.1.125/32 -i eth0 -p tcp -m tcp --dport 443 -j MARK --set-xmark 0x2/0xffffffff |
1 |
# ip addr show | grep 125 |
1 |
inet 192.168.1.125/32 scope global eth0 |
Логи keepalived смотрим в
1 |
/var/log/messages |
Статистику Keepalived смотрим в
1 |
# watch -d -n 1 "ipvsadm -L --stats" |
Альтернатива:
http://www.rhd.ru/docs/manuals/enterprise/RHEL-5-Manual/Virtual-Server-Administration
http://www.linuxvirtualserver.org/HighAvailability.html
http://habrahabr.ru/post/104621/