Настройка высокой доступности с помощью Heartbeat и плавающих IP-адресов в Ubuntu 16.04

Heartbeat – это программа с открытым исходным кодом, которая предоставляет возможности кластерной инфраструктуры и обмен сообщениями для клиентских серверов. Эти функции являются критическими в инфраструктуре сервера высокой доступности (НА). В этом мануале вы узнаете, как создать инфраструктуру высокой доступности на двух нодах с помощью Heartbeat и плавающих IP-адресов.

В настройке высокой доступности Heartbeat обычно используется совместно с менеджером ресурсов кластера (CRM) типа Pacemaker.

Читайте также: Настройка высокой доступности с помощью keepalived и плавающих IP-адресов в Ubuntu 14.04

Примечание: Этот мануал предназначен для демонстрационных целей и охватывает только некоторые аспекты создания надежной настройки HA. Здесь вы найдете подробные сведения отом, как настроить пассивные и активные ноды на уровне шлюза и связать их с плавающим IP-адресом.

Требования

  • Плавающий IP-адрес.
  • Метаданные.
  • Скрипты cloud-config.
  • API.

Читайте также:

1: Создание серверов

Для начала нужно создать два свежих сервера, которые будут работать как первичный и вторичный сервер. В руководстве они условно называются сервер 1 и сервер 2. Установите Nginx на оба сервера и замените их индекс-страницы  информацией, которая поможет отличить их друг от друга. Это позволит легко проверить настройку высокой доступности. Для настройки среды производства серверы должны поддерживать веб-сервер или балансировщик.

Читайте также:

2: Создание плавающего IP-адреса

Откройте панель управления и создайте плавающий IP-адрес.

Присвойте его серверу 1.

Когда адрес будет присвоен, убедитесь, что можете получить доступ к серверу по этому адресу в браузере:

http://your_floating_ip

Вы должны увидеть индексную страницу сервера 1.

3: Настройка DNS (опционально)

Если вы хотите получить доступ к инфраструктуре высокой доступности по домену, создайте запись А, указывающую на плавающий IP-адрес.

Читайте также: Как настроить имя хоста

В руководстве используется условный домен example.com. Если у вас сейчас нет домена, используйте плавающий IP-адрес.

Установка Heartbeat

Далее нужно установить Heartbeat на обоих серверах. Самый простой способ установить Heartbeat – использовать apt-get:

sudo apt-get update
sudo apt-get install heartbeat

Приложение Heartbeat установлено, но нуждается в настройке.

4: Настройка Heartbeat

Чтобы получить нужный кластер, необходимо создать и настроить следующие файлы Heartbeat на обоих серверах в каталогах /etc/ha.d.

  • ha.cf – глобальная конфигурация кластера Heartbeat, которая включает все ноды.
  • authkeys – содержит ключ безопасности, который позволяет нодам пройти аутентификацию в кластере.
  • haresources – определяет сервисы, которыми управляет кластер, и ноду, которая должна быть владельцем этих сервисов. Обратите внимание, этот файл не используется в настройке, в которой есть CRM, (например, Pacemaker).

Также необходимо предоставить сценарий, который будет выполнять переназначение плавающего IP-адреса в случае сбоя сервера 1.

Сбор информации о ноде

Прежде чем настроить файл ha.cf, нужно узнать имя каждой ноды. Heartbeat требует, чтобы имя ноды совпадало с ее выводом uname –n.

Следующую команду нужно запустить на обоих серверах.

uname -n

Обратите внимание на вывод команды. Ноды должны иметь имена primary и secondary.

Также нужно найти сетевой интерфейс и IP-адрес, который использует каждая нода для связи с остальной частью кластера. Вы можете использовать любой сетевой интерфейс, если каждая нода может взаимодействовать с остальными нодами в кластере. В руководстве используется публичный интерфейс серверов, eth0.

Чтобы узнать IP-адрес интерфейса eth0, запустите следующую команду на обоих серверах:

ip addr show eth0
ip addr show eth0 output:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 04:01:76:a5:45:01 brd ff:ff:ff:ff:ff:ff
inet 198.51.100.5/24 brd 198.51.100.255 scope global eth0
valid_lft forever preferred_lft forever
inet 10.17.0.28/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::601:76ff:fea5:4501/64 scope link
valid_lft forever preferred_lft forever

Примечание: Также узнать IP-адрес можно с помощью панели управления.

Обратите внимание на IP-адрес сетевого интерфейса (в примере он выделен красным). Не забудьте получить IP-адреса обоих серверов.

Создание файла ha.cf

На обоих серверах откройте /etc/ha.d/ha.cf в редакторе:

sudo nano /etc/ha.d/ha.cf

Этот файл будет пустым. Сюда нужно добавить сетевые интерфейсы и имена каждой ноды в кластере.

Скопируйте и вставьте эту конфигурацию в файл, а затем замените имена и IP-адреса нод соответствующими значениями. В этом примере сервер 1 имеет IP-адрес 198.51.100.5, а сервер 2 – 198.51.100.6:

node primary
ucast eth0 198.51.100.5
node secondary
ucast eth0 198.51.100.6

Сохраните и закройте файл.

Создание файла authkeys

Ключ авторизации позволяет нодам присоединиться к кластеру. Для этого можно просто создать случайный ключ. На сервере 1 запустите эти команды, чтобы создать ключ авторизации в переменной среды AUTH_KEY:

if [ -z "${AUTH_KEY}" ]; then
export AUTH_KEY="$(command dd if='/dev/urandom' bs=512 count=1 2>'/dev/null' \
| command openssl sha1 \
| command cut --delimiter=' ' --fields=2)"
fi

Затем добавьте ключ в /etc/ha.d/authkeys:

sudo bash -c "{
echo auth1
echo 1 sha1 $AUTH_KEY
} > /etc/ha.d/authkeys"

Проверьте содержимое файла authkeys:

sudo cat /etc/ha.d/authkeys

Файл будет выглядеть так (ключ будет отличаться):

auth1
1 sha1 d1e6557e2fcb30ff8d4d3ae65b50345fa46a2faa

Право чтения файла должно быть только у пользователя root.

sudo chmod 600 /etc/ha.d/authkeys

Скопируйте файл /etc/ha.d/authkeys с сервера 1 на сервер 2. Это можно сделать вручную или с помощью scp.

На сервере 2 нужно обновить права на файл:

sudo chmod 600 /etc/ha.d/authkeys

На этом этапе оба сервера должны иметь идентичные файлы /etc/ha.d/authkeys.

Создание файла haresources

Файл haresources указывает предпочтительные хосты в паре  сервисами, которыми управляет кластер. Предпочтительным хостом является нода, которая должна запускать тот или иной сервис, если она доступна. Если предпочтительный хост недоступен в кластере, сервис передается другому хосту. Другими словами, вторичный сервер возьмет работу на себя, если первичный сервер перестанет работать.

На обоих серверах откройте файл haresources в текстовом редакторе:

sudo nano /etc/ha.d/haresources

Добавьте в файл эту строку, указав имя первичной ноды:

primary floatip

Сохраните и закройте файл.

Этот параметр настроит сервер 1 как предпочтительный хост для сервиса floatip, который в настоящее время не определен. Теперь нужно настроить сервис floatip.

5: Создание сервиса для переназначения IP-адреса

Кластер Heartbeat поддерживает сервис floatip, который ноды могут использовать для присвоения плавающего IP-адреса, но сервис все равно нужно создать. Однако прежде чем настроить сервис, нужно создать сценарий, который через API присвоит плавающий IP-адрес ноде, которая его запускает. Затем нужно создать сервис floatip, который будет запускать сценарий переназначения плавающего IP.

Создание сценария assign-ip

В данном примере можно использовать базовый сценарий Python, который присваивает плавающий IP-адрес заданному ID сервера через API.

Загрузите assign-ip на оба сервера:

sudo curl -L -o /usr/local/bin/assign-ip http://do.co/assign-ip

Сделайте его исполняемым на обоих серверах:

sudo chmod +x /usr/local/bin/assign-ip

Поскольку сценарий отправляет запрос API, ему нужна библиотека Python Requests.

sudo apt-get install python-requests

Читайте также: Работа с веб-данными с помощью Requests и Beautiful Soup в Python 3

Сценарию assign-ip необходимы следующие данные:

  • Плавающий IP: первый аргумент в сценарии – плавающий IP. Который нужно присвоить.
  • ID сервера: второй аргумент в сценарии – ID сервера, которому нужно присвоить плавающий IP.
  • Токен API: передается как переменная среды TOKEN.

Прежде чем запустить сценарий, можете просмотреть его содержимое.

Теперь можно создать сервис floatip.

Создание сервиса floatip

Чтобы создать сервис floatip, нужно создать сценарий инициализации, который вызывает скрипт assign-ip и отвечает на команды start и stop. Этот скрипт инициализации будет отвечать за поиск ID сервера через сервис метаданных. Кроме того, для этого потребуется переназначить плавающий IP-адрес и токен API (токен личного доступа).

На обоих серверах откройте /etc/init.d/floatip в редакторе:

sudo nano /etc/init.d/floatip

Затем скопируйте и вставьте этот сценарий инициализации, заменив условные данные своим токеном API и плавающим IP, который необходимо переназначить:

#!/bin/bash
param=$1
export TOKEN='your_API_token'
IP='your_floating_IP_address'
ID=$(curl -s http://169.254.169.254/metadata/v1/id)
if [ "start" == "$param" ] ; then
python /usr/local/bin/assign-ip $IP $ID
exit 0
elif [ "stop" == "$param" ] ; then
exit 0;
elif [ "status" == "$param" ] ; then
exit 0;
else
echo "no such command $param"
exit 1;
fi

Сохраните и закройте файл.

Сделайте сценарий исполняемым:

sudo chmod u+x /etc/init.d/floatip

Когда сервис floatip запустится, он просто вызовет сценарий assign-ip и присвоит указанный плавающий IP серверу, который выполнил этот сценарий. Сервер 2 выполнит сценарий в случае, если сервер 1 не работает. После восстановления сервер 1 будет запускать этот сценарий для восстановления своего плавающего IP.

6: Запуск Heartbeat

Теперь приложение Heartbeat настроено, все соответствующие сценарии готовы. Можно запустить кластер Heartbeat.

На обоих серверах введите эту команду для запуска кластера Heartbeat:

sudo systemctl start heartbeat

Настройка инфраструктуры высокой доступности завершена.

Тестирование высокой доступности

После настройки важно проверить работу инфраструктуры высокой доступности.

В настоящее время плавающий IP присваивается первичной ноде (серверу 1). Теперь плавающий IP-адрес просто покажет индексную страницу сервера 1. Если вы используете пример сценария пользовательских данных, она будет выглядеть примерно так:

Floating IP is pointing to primary server
Server: primary, IP Address: 198.51.100.5
Это значит, что адрес присвоен серверу 1.

Теперь откройте локальный терминал и используйте curl, чтобы получить доступ к плавающему IP с помощью цикла. Используйте эту команду, но обязательно замените URL-адрес своим доменом или плавающим IP-адресом:

while true; do curl http://example.com; sleep 1; done

На данный момент команда тоже выведет имя и IP-адрес сервера 1. Если сервер 1 откажет (для этого можно, например, остановить сервис Heartbeat), плавающий IP будет переназначен серверу 2, и вы сможете убедиться в этом.

Перезапустите сервер 1. Для этого можно использовать панель управления или команду:

sudo reboot

Через несколько секунд основной сервер станет недоступен. Обратите внимание на вывод цикла curl, который работает в терминале. Вы должны заметить вывод, который выглядит так:

Server: primary, IP Address: 198.51.100.5
...
curl: (7) Failed to connect to example.com port 80: Connection refused
Server: secondary, IP Address: 198.51.100.6
Server: secondary, IP Address: 198.51.100.6
...

То есть плавающий IP-адрес должен переназначиться на сервер 2. Это означает, что настройка высокой доступности работает, поскольку автоматический переход на другой ресурс прошел успешно.

Вы можете получить сообщение Connection refused. Оно возникает, если вы пытаетесь получить доступ к плавающим IP-адресам в период между сбоем основного сервера и завершением процесса переназначения плавающего IP-адреса.

Теперь можно включить сервер 1 через панель управления. Поскольку Heartbeat воспринимает сервер 1 как предпочтительный хост для запуска сценария переназначения плавающего IP, IP автоматически будет возвращен на сервер 1, как только он восстановит работу.

Заключение

Теперь у вас есть базовая настройка инфраструктуры высокой доступности.

В этом примере в качестве базового балансировщика нагрузки используется Nginx, но если вы хотите улучшить настройку Heartbeat с помощью балансировщика обратного прокси-сервера, вы можете перенастроить Nginx или установить HAProxy.

Tags: ,