В данной статье рассмотрим один из способов обеспечения доступности высоко нагруженных систем такой как балансировщик нагрузки. Для примера будет использовать Pacemaker и IPaddr, который может быть запущен как Active-Passive кластер для обеспечения отказоустойчивости и Active-Active для балансировки нагрузки.nnn
Преимущества использования:
- Балансировщик не внешний — на всех серверах кластера (нодах) используется один общий 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]