В продолжении предыдущей статьи:
Load Balancing в Linux
1. Введение.
Нужно настроить балансировку (распределение нагрузки) и резервирование доступа к веб приложениям, имея один общий публичный адрес.
Для этих целей можно использовать протокол CARP.
CARP – Common Address Redundancy Protocol — протокол избыточности общего адреса
В вики дается следующее определение:
Это сетевой протокол, основной целью которого является использование одного IP-адреса в пределах одного сегмента сети несколькими машинами.
CARP является свободной, безопасной альтернативой протоколам VRRP и HSRP. CARP позволяет выделить группу хостов в сегменте сети и назначить ей один IP-адрес. Такая группа называется «redundancy group» (группа избыточности). В пределах этой группы один из хостов становится «главным», а остальные обозначаются как «резервные». В каждый момент времени мастер-хост отвечает на ARP-запросы к назначенному IP-адресу и обрабатывает трафик, идущий к этому адресу. Каждый хост одновременно может принадлежать к нескольким группам.
При использовании CARP снижаются требования к аппаратному обеспечению отказоустойчивых систем. Дорогое оборудование окажется бессильным к выдернутому шнуру питания или перед администратором, случайно отправившим сервер в перезагрузку. CARP также облегчает процесс обновления программного обеспечения, так цикл обновления и перезагрузки прозрачен для пользователей, становится проще и процесс тестирования программного или аппаратного обеспечения – вы всегда можете положиться на резерв, пока не устраните проблему.
Более подробно < – жми
Реализация данного протокола уже реализована в OpenBSD и FreeBSD.
По умолчанию, поддержка CARP не включена. Для использования carp необходимо в ядре включить опцию carp.
Поддержка CARP в дереве FreeBSD появилась в феврале 2005 года. Первый релиз, который поддерживает CARP — FreeBSD 5.4.
Подробно процедура настройки CARP в FreeBSD описана в handbook’е:
Common Access Redundancy Protocol (CARP), Tom Rhodes (англ.)
Протоколом CARP в FreeBSD управляют переменные ядра:
net.inet.carp.allow
net.inet.carp.preempt
net.inet.carp.log
net.inet.carp.arpbalance
net.inet.carp.suppress_preempt
В FreeBSD часто CARP используют в сочетании с PF + pfsync для построения отказоустойчивых брандмауэров.
Мне нужно было реализовать похожее на LInux – точнее CentOS 5.5, для этих целей было выделено два сервера.
UCARP — реализация протокола отказоустойчивой маршрутизации CARP в Linux. У меня не получилось реализовать балансировку до конца. Хотя резервирование работало, при отключении одной машины мастером становилась вторая.
Информация для настройки UCARP:
http://www.ucarp.org/project/ucarp скачиваем исходники для установки. Там же есть описание как установить и настроить.
http://wiki.bsdportal.ru/doc:ucarp перевод READMI с пакета UCARP.
http://habrahabr.ru/blogs/sysadm/76610/
Можно ли настроить балансировку, распределение нагрузки UCARP я не нашел. Но резервирование работает.
Поэтому наткнувшись модуль к iptables – CLUSTRIP, решено было опробовать его. Описано в предыдущем моем посте -
Решил немного дополнить, т к все было реализовано на bonding интерфейсе, и поверх VLAN интерфейса в отличии от предложенной настройки.
Bonding – объединение сетевых интерфейсов под Linux.
Объединение позволяет совокупно собрать несколько портов в одну группу, эффективно объединяя пропускную способность в одном направлении. Объединение так же позволяет создавать мульти-гигабитные каналы для транспортировки трафика через высокопропускные районы вашей сети. Например, вы можете объединить два порта по 100 мегабит в 200 мегабитный магистральный порт. Это эквивалентно одному интерфейсу с пропускной способностью 200 мегабит.
Использовать его нужно там, где необходима избыточность связи, отказоустойчивость и балансировка нагрузки сети.
режимов объединения:
mod = 1 (active-backup)
Работает только один интерфейс, остальные находятся в очереди горячей замены. Если ведущий интерфейс перестает функционировать, то его нагрузку подхватывает следующий (присвоив mac-адрес) и становится активным. Дополнительная настройка коммутатора не требуется.
mode = 2 (balance-xor)
XOR политика: Передача на основе [(исходный MAC-адрес → XOR → MAC-адрес получателя) %число интерфейсов]. Эта команда выбирает для каждого получателя определенный интерфейс в соответствии с mac-адресом. Режим обеспечивает балансировку нагрузки и отказоустойчивость.
mode = 3 (broadcast)
Все пакеты передаются на все интерфейсы в группе. Режим обеспечивает отказоустойчивость.
mode = 4 (802.3ad)
IEEE 802.3ad Dynamic Link aggregation (динамическое объединение каналов). Создает агрегации групп, имеющие одни и те же скорости и дуплексные настройки. Использует все включенные интерфейсы в активном агрегаторе согласно спецификации 802.3ad.
Предварительнае реквизиты
Поддержка ethtool (позволяет отображать или изменять настройки сетевой карты) базы драйверов для получения скорости и дуплекса каждого интерфейса.
Коммутатор с поддержкой IEEE 802.3ad Dynamic Link aggregation. Большинство параметров потребует некоторой конфигурации для режима 802.3ad.
mode =5 (balance-tlb)
Адаптивная балансировка передаваемой нагрузки: канал связи не требует какой либо специальной настройки. Исходящий трафик распределяется в соответствии с текущей нагрузкой (вычисляется по скоростям) для каждого интерфейса. Входящий трафик принимается текущим интерфейсом. Если принимающий интерфейс выходит из строя, то следующий занимает его место приватизировав его mac-адрес.
Поддержка ethtool (позволяет отображать или изменять настройки сетевой карты) базы драйверов для получения скорости и дуплекса каждого интерфейса.
mode = 6 (balance-alb)
Адаптивное перераспределение нагрузки: включает balance-tlb плюс receive load balancing (rlb) для трафика IPv4 и не требует специального конфигурирования. То есть все так же как и при mode =5, только и входящий трафик балансируется между интерфейсами. Полученная балансировка нагрузки достигается опросом ARP. Драйвер перехватывает ответы ARP, направленные в локальной системе в поисках выхода и перезаписывает исходный адрес сетевой карты с уникальным аппаратным адресом одного из интерфейсов в группе.
У меня был использован режим – mode = 4 (802.3ad).
VLAN (Virtual Local Area Network) — группа устройств, имеющих возможность взаимодействовать между собой напрямую на канальном уровне, хотя физически при этом они могут быть подключены к разным сетевым коммутаторам. И наоборот, устройства, находящиеся в разных VLAN’ах, невидимы друг для друга на канальном уровне, даже если они подключены к одному коммутатору, и связь между этими устройствами возможна только на сетевом и более высоких уровнях.
В современных сетях VLAN — главный механизм для создания логической топологии сети, не зависящей от её физической топологии. VLAN’ы используются для сокращения широковещательного трафика в сети. Имеют большое значение с точки зрения безопасности, в частности как средство борьбы с ARP-spoofing’ом.
2. Реализация.
2а сервера под СentOS 5.5 – 1ая и 2ая нода. (node1 node2)
Настройка Bondinga, отмечено синим:
# cat /etc/modprobe.conf
alias eth0 bnx2
alias eth1 bnx2
alias eth2 bnx2
alias eth3 bnx2
alias scsi_hostadapter megaraid_sas
alias scsi_hostadapter1 ata_piix
alias usb0 cdc_ether
alias bond0 bonding
options bonding mode=4 miimon=100
alias net-pf-10 off
alias ipv6 off
Настройки интерфейсов (одинаково для обоих нод):
# cat /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
# cat /etc/sysconfig/network-scripts/ifcfg-eth2
DEVICE=eth2
ONBOOT=yes
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
USERCTL=no
# cat /etc/sysconfig/network-scripts/ifcfg-eth3
DEVICE=eth3
ONBOOT=yes
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
USERCTL=no
Далее настраиваем VLAN интерфейсы ( Для 1 ой ноды 31 ип, для 2 ой 32 ип):
# cat /etc/sysconfig/network-scripts/ifcfg-vlan3000
VLAN=yes
VLAN_NAME_TYPE=VLAN_PLUS_VID_NO_PAD
DEVICE=vlan3000
PHYSDEV=bond0
BOOTPROTO=static
TYPE=Ethernet
NETMASK=255.255.255.240
BROADCAST=10.0.0.31
IPADDR=10.0.0.19
NETWORK=10.0.0.16
ONBOOT=yes
Для настройки CLUSTERIP нужен алиас основного интерфейса с общим публичным ип адресом.
Алиас 3000 влана ( одинаковые настройки на обоих нодах):
# cat /etc/sysconfig/network-scripts/ifcfg-vlan3000:0
VLAN=yes
DEVICE=vlan300:0
BOOTPROTO=static
TYPE=Ethernet
NETMASK=255.255.255.240
BROADCAST=10.0.0.31
IPADDR=10.0.0.27
NETWORK=213.85.187.16
ONBOOT=yes
Для алиаса, не нужно прописывать ряд параметров – VLAN_NAME_TYPE, PHYSDEV. Иначе работать не будет.
Необходима поддержка 802.1Q ядром Linux, для этого :
# modprobe 8021q
Просматривать информацию о VLAN-подынтерфейсах:
# cat /proc/net/vlan/vlan3000
vlan3993 VID: 3993 REORDER_HDR: 1 dev->priv_flags: 81
total frames received 1139328
total bytes received 86926118
Broadcast/Multicast Rcvd 525total frames transmitted 1576754
total bytes transmitted 112077612
total headroom inc 0
total encap on xmit 0
Device: bond0
INGRESS priority mappings: 0:0 1:0 2:0 3:0 4:0 5:0 6:0 7:0
EGRESSS priority Mappings:
Настройка IPTABLES
# cat /etc/sysconfig/iptables
iptables iptables-config iptables-config.rpmsave iptables.save
[root@ivbal2 /]# cat /etc/sysconfig/iptables-config
# Load additional iptables modules (nat helpers)
# Default: -none-
# Space separated list of nat helpers (e.g. ‘ip_nat_ftp ip_nat_irc’), which
# are loaded after the firewall rules are applied. Options for the helpers are
# stored in /etc/modprobe.conf. чтоб автоматически грузился модуль
IPTABLES_MODULES="ip_conntrack"
# Unload modules on restart and stop
# Value: yes|no, default: yes
# This option has to be ‘yes’ to get to a sane state for a firewall
# restart or stop. Only set to ‘no’ if there are problems unloading netfilter
# modules.
IPTABLES_MODULES_UNLOAD="yes"
# Save current firewall rules on stop.
# Value: yes|no, default: no
# Saves all firewall rules to /etc/sysconfig/iptables if firewall gets stopped
# (e.g. on system shutdown). Чтоб подгружались правила поставил # даное значение
IPTABLES_SAVE_ON_STOP="yes"
# Save current firewall rules on restart.
# Value: yes|no, default: no
# Saves all firewall rules to /etc/sysconfig/iptables if firewall gets
# restarted.
IPTABLES_SAVE_ON_RESTART="no"
# Save (and restore) rule and chain counter.
# Value: yes|no, default: no
# Save counters for rules and chains to /etc/sysconfig/iptables if
# ‘service iptables save’ is called or on stop or restart if SAVE_ON_STOP or
# SAVE_ON_RESTART is enabled.
IPTABLES_SAVE_COUNTER="no"
# Numeric status output
# Value: yes|no, default: yes
# Print IP addresses and port numbers in numeric format in the status output.
IPTABLES_STATUS_NUMERIC="yes"
# Verbose status output
# Value: yes|no, default: yes
# Print info about the number of packets and bytes plus the "input-" and
# "outputdevice" in the status output.
IPTABLES_STATUS_VERBOSE="no"
# Status output with numbered lines
# Value: yes|no, default: yes
# Print a counter/number for every rule in the status output.
IPTABLES_STATUS_LINENUMBERS="yes"
Cобственно само правило, подключающее использование модуля CLUSTERIP, это для 2 ой ноды у первой практически то же самое, окромя значения –local-node оно будет = 1 :
# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.3.5 on Tue Jun 1 16:20:26 2010
*filter
:INPUT ACCEPT [161:11744]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [181:13320]
-A INPUT -d 10.0.0.27 -i vlan3000 -j CLUSTERIP –new –hashmode sourceip-sourceport –clustermac 01:00:5E:00:09:29 –total-nodes 2 –local-node 2 –hash-init 0
COMMIT
# Completed on Tue Jun 1 16:20:26 2010
где 10.0.0.27 общий адрес по которому осуществляется балансировка.
total-nodes – количество нод
local-node – какая нода.
–hashmode sourceip-sourceport – режим работы.
Мультикаст MAC имеет диапазон:
01:00:5E:00:00:00 – 01:00:5E:7F:FF:FF
Во вторых ip адрес, на который идёт кластеризация должен быть на всех машинах основным или алиасом.
Должны быть загружены следующие модули:
ip_conntrack, ipt_CLUSTERIP, 8021q
Из особенностей: пришлось поменять порядок загрузки networks и iptables.
# ls /etc/rc.d/rc3.d/ | grep ipt
S10iptables# ls /etc/rc.d/rc3.d/ | grep netw
S08network
Изначально было на оборот. Менял местами и на 0,3,6 уровнях загрузки. Если не менять местами, то происходит зависание процесса перезагрузки, или выключения. Приходилось выключать службу iptables, а потом выключать или перезагружать комп.
В логах было сообщение:
kernel: CLUSTERIP: not mangling arp reply on different interface: cip’vlan3000′-skb’vlan501
Как выяснилось, так реагирует на конфликт адресов CLUSTERIP.
Если на 1 ой ноде выполнить команду :
# echo "-1" > /proc/net/ipt_CLUSTERIP/10.0.0.27
# cat /proc/net/ipt_CLUSTERIP/10.0.0.27
Последняя команда ничего не выводит. На веб сервере пишется: node2, что означает, – работает тока вторая нода.
Далее делаем:
# echo "+1" > /proc/net/ipt_CLUSTERIP/213.85.187.27
# cat /proc/net/ipt_CLUSTERIP/10.0.0.271
По сути мы опять включаем 1 ую ноду, на веб сервере по общему адресу идет чередование: node1, node2……. Баланстровка работает. Как видно команда cat выводит “1”.
Проделываем тоже самое на второй ноде, для начала:
# cat /proc/net/ipt_CLUSTERIP/10.0.0..27
1,2
Далее:
# echo "-1" > /proc/net/ipt_CLUSTERIP/10.0.0.27
# cat /proc/net/ipt_CLUSTERIP/10.0.0.272
При доступе на веб сервер по общему ip – http://10.0.0.27, показывается: node1
далее:
# echo "+1" > /proc/net/ipt_CLUSTERIP/213.85.187.27
На веб сервере – идет чередование node1, node2 …. node1….. node2. Вывод команды cat:
# cat /proc/net/ipt_CLUSTERIP/10.0.0..27
1,2
Вроде бы все.