Найти в Дзене
Записки сисадмина

Linux. Pacemaker + Corosync. Создаем простой кластер

И снова мы говорим про отказоустойчивость и автоматизацию. В этот раз на повестке дня кластеры. Задача простая: нужно сделать кластер веб серверов nginx, чтобы при падении одной из виртуалок, весь трафик подхватывался второй, и пользователи не замечали аварии. Итак, вводные: У нас есть две виртуальные машины с IP адресами debian-node-1 192.168.122.158 debian-node-2 192.168.122.128 И отдельный IP адрес 192.168.122.140, который мы будем перебрасывать на активную ноду. Чтобы две наши виртуалки могли обращаться друг к другу по сети, пропишем в хостах (/etc/hosts) каждой ноды строки: 192.168.122.158 debian-node-1 192.168.122.128 debian-node-2 Если у вас настроен DHCP сервер и ваши виртуальные машины получают адреса от него, это делать не обязательно. Но я лентяй, мне простительно. Да и не хочется лишний раз поднимать очередной сетевой сервис на домашнем ноутбуке. Установим на каждую из виртуалок nginx, который и будем кластеризовать: apt install nginx И сразу же запустим его с добавлением в
Оглавление

И снова мы говорим про отказоустойчивость и автоматизацию. В этот раз на повестке дня кластеры. Задача простая: нужно сделать кластер веб серверов nginx, чтобы при падении одной из виртуалок, весь трафик подхватывался второй, и пользователи не замечали аварии.

Итак, вводные:

У нас есть две виртуальные машины с IP адресами
debian-node-1 192.168.122.158
debian-node-2 192.168.122.128
И отдельный IP адрес 192.168.122.140, который мы будем перебрасывать на активную ноду.

Чтобы две наши виртуалки могли обращаться друг к другу по сети, пропишем в хостах (/etc/hosts) каждой ноды строки:

192.168.122.158 debian-node-1
192.168.122.128 debian-node-2

Если у вас настроен DHCP сервер и ваши виртуальные машины получают адреса от него, это делать не обязательно. Но я лентяй, мне простительно. Да и не хочется лишний раз поднимать очередной сетевой сервис на домашнем ноутбуке.

Установим на каждую из виртуалок nginx, который и будем кластеризовать:

apt install nginx

И сразу же запустим его с добавлением в автозапуск:

systemctl enable nginx --now

Проверяем, что все у нас работает:

systemctl status nginx

А теперь начнем подготавливать наш кластер.

Немного уточним ТЗ еще раз: Наш кластер будет работать в режиме active/passive, nginx будет слушать отдельный виртуальный IP, который будет мигрировать от одной машины к другой при переключении мастера.

Далее я буду отдельно указывать "на обеих машинах" то, что необходимо выполнить везде. Если я этого не пишу, достаточно выполнить только на мастере.

Устанавливаем необходимые пакеты (на обеих машинах)

apt install pacemaker pcs corosync

После установки, каждая машина автоматически создаст себе кластер из единственной ноды (себя).

Для начала остановим эти кластера (на обеих машинах)

pcs cluster stop --force
-2

Разрушаем кластер (на обеих машинах)

pcs cluster destroy
-3

При установке, pacemaker автоматически создал пользователя hacluster. Именно он будет администратором кластера.

Зададим ему пароль (на обеих машинах)

passwd hacluster

Итак, настало время создавать новый кластер.

Для начала, авторизуем обе машины по шаблону:

pcs host auth node1 node2 -u hacluster -p pass

В моем случае это будет:

pcs host auth debian-node-1 debian-node-2 -u hacluster -p 54qgW827Ba
-4

Создаем кластер по шаблону:

pcs cluster setup cluster-name node1 node2

В моем случае это будет

pcs cluster setup nginx-cluster debian-node-1 debian-node-2
-5

Запускаем наш кластер:

pcs cluster start - - all
-6

Добавляем настройки нашему кластеру и отключаем quorum, т.к. у нас всего 2 ноды.

pcs property set stonith-enabled=false
pcs property set no-quorum-policy=“ignore”

И сразу запрашиваем все настройки нашего кластера

pcs property
-7

Проверяем, что наш кластер запущен и обе ноды онлайн:

pcs status
-8

Настраиваем виртуальные ресурсы

Для начала, я немного исправил файл /var/www/html/index.nginx-debian.html на каждой ноде, чтобы мы сразу видели, к какой именно ноде мы обратились.

-9
-10

Давайте выделим себе отдельный виртуальный IP адрес, который будет принадлежать кластеру и мигрировать между нодами при переключении мастера. Я для примера взял себе адрес из той же подсети 192.168.122.140.

Настраиваем таймаут по умолчанию для переключения ресурсов

pcs resource op defaults timeout=20s

Создаем ресурс с виртуальным IP (Имя ресурса в примере - VirtualIP)

pcs resource create VirtualIP ocf:heartbeat:IPaddr2 ip=192.168.122.140 cidr_netmask=24 op monitor interval=5s

Проверяем, что у нас появился новый ресурс:

-11

Создаем еще один ресурс, но уже systemd - nginx (Имя ресурса будет nginxres)

pcs resource create nginxres systemd:nginx

Создаем группу ресурсов, чтобы все они находились всегда только на одной ноде.

pcs resource group add NginxBalance VirtualIP nginxres

Проверяем, что nginx тоже запустился:

-12

Как мы можем видеть, в данный момент наш мастер - это debian-node-1. И все созданные ресурсы будут автоматически запускаться именно на нем.

-13
-14

Также мы можем проверить, какая именно нода в данный момент нам ответит:

-15

Замечу: я отправляю curl запрос уже на виртуальный IP, а не IP одной из нод.