Bonding Linux. VLAN. iptables CLUSTERIP.

 

В продолжении предыдущей статьи:

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          525

      total 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.27

1

По сути мы опять включаем 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.27

2

При доступе на веб сервер по общему  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

 

Вроде бы все. :)


Follow

Get every new post delivered to your Inbox.