Балансировка нагрузки
В данной статье рассмотрим один из способов обеспечения доступности высоко нагруженных систем такой как балансировщик нагрузки. Для примера будет использовать Pacemaker и IPaddr, который может быть запущен как Active-Passive кластер для обеспечения отказоустойчивости и Active-Active для балансировки нагрузки.
Преимущества использования:
- Балансировщик не внешний — на всех серверах кластера (нодах) используется один общий IP (виртуальный). На этот адрес сервера отвечают случайным образом, по внутренней «договоренности».
- Высокая доступность (High Availability) — при выходе одного сервера из строя, работа продолжается на оставшихся.
- Простота — настройка осуществляется достаточно просто и быстро
Исходные данные
Исходные данные изображены на картинке выше, получаем шлюз и три ноды в кластере. Пользователи подключаются к IP шлюза, который в свою очередь направляет запрос на вируальный IP, который настроен на всех серверах кластера.
Усановка и настройка
Убедимся, что все сервера в кластере видят друг друга, для этого пропишем в /etc/hosts
1 2 3 |
192.168.100.101 hostA 192.168.100.102 hostB 192.168.100.103 hostC |
Выполним установку необходимых пакетов
1 2 |
apt-get install pcs pacemaker corosync #Ubuntu, Debian yum install pcs pacemaker corosync #CentOS, RHEL |
При установке pcs создается пользователь, hacluster, сменим ему пароль
1 |
echo CHANGEME | passwd --stdin hacluster |
Выполняем настройку идентификации на одном сервере кластера
1 |
pcs cluster auth HostA HostB HostC -u hacluster -p CHANGEME --force |
Выполняем создание кластера из трех серверов
1 |
pcs cluster setup --force --name Cluster hostA hostB hostC |
Запускаем кластер
1 |
pcs cluster start --all |
Проверяем состояние кластера
1 |
pcs cluster status |
Все ноды должны быть online
Для данной конфигурации не будут использоваться кворум и stonith, можем отключить их
1 2 |
pcs property set no-quorum-policy=ignore pcs property set stonith-enabled=false |
Настройка адресов
На всех серверах должен быть настроен один и тот же виртуальный адрес и MAC адрес, на запрос которого сервера будут отвечать поочередно.
Проблема в том, что в таблице коммутации mac-адрес закрепляется за портом, и пакеты будут отправляться только по этому порту. В нашем случае необходимо, что бы все сервера одновременно видели пакеты.
Обязательно проверить, что наш mac-адрес, является multicast адресом. Для такого адреса коммутатор отправляет пакеты во все порты, кроме того с которого был получен. Так же существуют коммутаторы, для которых можно прописать несколько портов для одного мака. Если у Вас поддерживается функция Dynamic ARP Inspection, то её нужно отключить.
Настройка IPaddr
Существует две версии с возможностью клонирования
IPaddr2 (ocf:heartbeat:IPaddr2
) — обычно установка идет вместе с пакетом resource-agents. Стандартный агент для виртуального IP
IPaddr3 (ocf:percona:IPaddr3
) — преобразованная версия. Содержит исправления для режима clone. Данную версию требуется устанавливать отдельно.
Установим IPaddr3 на каждом сервере в кластере
1 2 3 |
curl --create-dirs -o /usr/lib/ocf/resource.d/percona/IPaddr3 \ https://raw.githubusercontent.com/percona/percona-pacemaker-agents/master/agents/IPaddr3 chmod u+x /usr/lib/ocf/resource.d/percona/IPaddr |
Далее выполним на одном сервере
Выполним создание виртуального IP ресурса
1 2 3 |
pcs resource create ClusterIP ocf:percona:IPaddr3 \ params ip="192.168.100.100" cidr_netmask="24" nic="eth0" clusterip_hash="sourceip-sourceport" \ op monitor interval="10s" |
clusterip_hash -указывает нужный тип для распределения запросов
sourceip
— распределение только по IP-адресу источника, это обеспечивает попадание запросов на один и тот же сервер.sourceip-sourceport
— распределение по исходящему порту и IP источника. При новом подключении будет производится соединение с новым сервером. Подходящий вариант.sourceip-sourceport-destport
— распределение по порту получателя, порту источника и IP-адресу. Получаем наилучшее распределение, если несколько сервисов работают на разных портах.
IPaddr3 устанавливает mac автоматически, а для IPaddr2 нужно указать из multicast.
Выполним клонирование ресурса
1 2 |
pcs resource clone ClusterIP \ meta clone-max=3 clone-node-max=3 globally-unique=true |
При этом в iptables будет добавлено правило из модуля CLUSTERIP.
Принцип его работы
Все три сервера получают пакеты, знают информацию о количестве серверов в кластере, нумеруют пакеты по одному правилу, и каждый сервер обрабатывает только пакеты по своему номеру, остальные пакеты игнорирует и они обрабатываются другими серверами так же по своему номеру.
Проверяем состояние кластера
1 |
pcs cluster status |
IP адреса будут запущены. Проверяем подключение к ним из вне.
Необходима настройка отказоустойчивости или распределения нагрузки сервера, обращайтесь [email protected]