Rate this post

В данной статье рассмотрим один из способов обеспечения доступности высоко нагруженных систем такой как балансировщик нагрузки. Для примера будет использовать Pacemaker и IPaddr, который может быть запущен как Active-Passive кластер для обеспечения отказоустойчивости и Active-Active для балансировки нагрузки.nnбалансировка нагрузкиn

Преимущества использования:

  • Балансировщик не внешний — на всех серверах кластера (нодах) используется один общий IP (виртуальный). На этот адрес сервера отвечают случайным образом, по внутренней «договоренности».
  • Высокая доступность (High Availability) — при выходе одного сервера из строя, работа продолжается на оставшихся.
  • Простота — настройка осуществляется достаточно просто и быстро

Исходные данные

Исходные данные изображены на картинке выше, получаем шлюз и три ноды в кластере. Пользователи подключаются к IP шлюза, который в свою очередь направляет запрос на вируальный IP, который настроен на всех серверах кластера.n

Усановка и настройка

Убедимся, что все сервера в кластере видят друг друга, для этого пропишем в /etc/hostsn

192.168.100.101    hostAn192.168.100.102    hostBn192.168.100.103    hostC

Выполним установку необходимых пакетовn

apt-get install pcs pacemaker corosync #Ubuntu, Debiannyum install pcs pacemaker corosync #CentOS, RHEL

При установке pcs создается пользователь, hacluster, сменим ему парольn

echo CHANGEME | passwd --stdin hacluster

Выполняем настройку идентификации на одном сервере кластераn

pcs cluster auth HostA HostB HostC -u hacluster -p CHANGEME --force

Выполняем создание кластера из трех серверовn

pcs cluster setup --force --name Cluster hostA hostB hostC

Запускаем кластерn

pcs cluster start --all

Проверяем состояние кластераn

pcs cluster status

Все ноды должны быть onlinennДля данной конфигурации не будут использоваться кворум и stonith, можем отключить ихn

pcs property set no-quorum-policy=ignorenpcs property set stonith-enabled=false

Настройка адресов

На всех серверах должен быть настроен один и тот же виртуальный адрес и MAC адрес, на запрос которого сервера будут отвечать поочередно.nnПроблема в том, что в таблице коммутации mac-адрес закрепляется за портом, и пакеты будут отправляться только по этому порту. В нашем случае необходимо, что бы все сервера одновременно видели пакеты.nnОбязательно проверить, что наш mac-адрес, является multicast адресом. Для такого адреса коммутатор отправляет пакеты во все порты, кроме того с которого был получен. Так же существуют коммутаторы, для которых можно прописать несколько портов для одного мака. Если у Вас поддерживается функция  Dynamic ARP Inspection, то её нужно отключить.n

Настройка IPaddr

Существует две версии с возможностью клонированияnnIPaddr2 (ocf:heartbeat:IPaddr2) — обычно установка идет вместе с пакетом resource-agents. Стандартный агент для виртуального IPnnIPaddr3 (ocf:percona:IPaddr3) — преобразованная версия. Содержит исправления для режима clone. Данную версию требуется устанавливать отдельно.nnУстановим IPaddr3 на каждом сервере в кластереn

curl --create-dirs -o /usr/lib/ocf/resource.d/percona/IPaddr3 \n    https://raw.githubusercontent.com/percona/percona-pacemaker-agents/master/agents/IPaddr3nchmod u+x /usr/lib/ocf/resource.d/percona/IPaddr

Далее выполним на одном сервереnnВыполним создание виртуального IP ресурсаn

pcs resource create ClusterIP ocf:percona:IPaddr3 \n    params ip="192.168.100.100" cidr_netmask="24" nic="eth0" clusterip_hash="sourceip-sourceport" \n    op monitor interval="10s"

clusterip_hash -указывает нужный тип для распределения запросовn

  • sourceip — распределение только по IP-адресу источника, это обеспечивает попадание запросов на один и тот же сервер.
  • sourceip-sourceport — распределение по исходящему порту и IP источника. При новом подключении будет производится соединение с новым сервером. Подходящий вариант.
  • sourceip-sourceport-destport — распределение по порту получателя, порту источника и IP-адресу. Получаем наилучшее распределение, если несколько сервисов работают на разных портах.

IPaddr3 устанавливает mac автоматически, а для IPaddr2 нужно указать из multicast.nnВыполним клонирование ресурсаn

pcs resource clone ClusterIP \n    meta clone-max=3 clone-node-max=3 globally-unique=true

При этом в iptables будет добавлено правило из модуля CLUSTERIP.nnПринцип его работыnnВсе три сервера получают пакеты, знают информацию о количестве серверов в кластере, нумеруют пакеты по одному правилу, и каждый сервер обрабатывает только пакеты по своему номеру, остальные пакеты игнорирует и они обрабатываются другими серверами так же по своему номеру.nnПроверяем состояние кластераn

pcs cluster status

IP адреса будут запущены. Проверяем подключение к ним из вне.n

Необходима настройка отказоустойчивости или распределения нагрузки сервера, обращайтесь [email protected]