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

Вступление

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

Heartbeat обычно используется вместе с диспетчером ресурсов кластера (CRM), таким как Pacemaker, для полной настройки HA. Если вы хотите создать более надежную настройку высокой доступности, попробуйте использоватьCorosync and Pacemaker илиKeepalived.

Goal

После завершения установка HA будет состоять из двух серверов Ubuntu 16.04 в активной / пассивной конфигурации. Это будет достигнуто путем указания плавающего IP-адреса, с помощью которого ваши пользователи будут получать доступ к вашим услугам или веб-сайту, чтобы они указывали на основной - или активный - сервер, если сбой не обнаружен. В случае, если служба Heartbeat обнаружит, что основной сервер недоступен, дополнительный сервер автоматически запустит сценарий для переназначения плавающего IP-адреса себе через API DigitalOcean. Таким образом, последующий сетевой трафик с плавающим IP-адресом будет направляться на ваш вторичный сервер, который будет действовать в качестве активного сервера, пока основной сервер снова не станет доступным (в этот момент первичный сервер переназначит плавающий IP-адрес самому себе).

Active/passive Diagram

[.note] #Note: Это руководство предназначено для демонстрационных целей и охватывает только некоторые аспекты настройки надежного решения высокой доступности.
Основными выводами этого документа являются подробности о том, как установить активные / пассивные узлы на уровне шлюза и связать их с плавающим IP-адресом.
Чтобы упростить руководство, вместо настройки балансировщиков нагрузки обратного прокси на каждом сервере мы настроим их для ответа с их соответствующими имя хоста и общедоступный IP-адрес.
#

Для достижения этой цели мы будем выполнять следующие шаги:

  • Создайте 2 капли, которые будут получать трафик

  • Создайте плавающий IP и назначьте его одной из капель

  • Создайте запись DNS A, которая указывает на плавающий IP (необязательно)

  • Установите Heartbeat на капли

  • Настройте Heartbeat для запуска службы переназначения плавающего IP

  • Создать сервис переназначения плавающего IP

  • Тест на отказоустойчивость

С этой целью мы можем приступить к настройке нашей HA-установки.

Предпосылки

Чтобы автоматизировать переназначение плавающего IP, мы должны использовать API DigitalOcean. Это означает, что вам необходимо сгенерировать токен личного доступа (PAT), который представляет собой токен API, который можно использовать для аутентификации в вашей учетной записи DigitalOcean с доступомread иwrite. Вы можете добиться этого, следуя разделуHow To Generate a Personal Access Token руководства по API. Ваш PAT будет использоваться в сценарии, который будет добавлен на оба сервера в вашем кластере. Важно хранить его в безопасном месте для справки, поскольку он обеспечивает полный доступ к вашей учетной записи DigitalOcean.

В дополнение к API в этом руководстве используются следующие функции DigitalOcean:

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

Создать капли

Первый шаг - создать две капли Ubuntu в одном центре данных, которые будут действовать как основной и дополнительный серверы, описанные выше. В нашем примере настройки мы назовем их «основной» и «вторичный» для удобства. Мы установим Nginx на обе капли и заменим их индексные страницы информацией, которая однозначно их идентифицирует. Это позволит нам простой способ продемонстрировать, что установка HA работает. Для производственной установки на ваших серверах должен работать веб-сервер или балансировщик нагрузки по вашему выбору.

Создайте две капли Ubuntu 16.04,primary иsecondary, используя этот сценарий bash в качестве пользовательских данных:

Пример пользовательских данных

#!/bin/bash

apt-get -y update
apt-get -y install nginx
export HOSTNAME=$(curl -s http://169.254.169.254/metadata/v1/hostname)
export PUBLIC_IPV4=$(curl -s http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address)
echo Droplet: $HOSTNAME, IP Address: $PUBLIC_IPV4 > /var/www/html/index.html

Это установит Nginx и заменит содержимоеindex.html на имя хоста и IP-адрес капли (со ссылкой на службу метаданных). Доступ к любой Droplet через ее общедоступный IP-адрес покажет основную веб-страницу с именем хоста и IP-адресом Droplet, которая будет полезна для проверки того, на что указывает Droplet с плавающим IP в любой момент.

Создать плавающий IP

На панели управления DigitalOcean щелкнитеNetworking в верхнем меню, затемFloating IPs в подменю.

No Floating IPs

Назначьте плавающий IP-адрес вашей каплеprimary, затем нажмите кнопкуAssign Floating IP.

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

http://your_floating_ip

Вы должны увидеть страницу индекса вашей основной капли.

Настроить DNS (необязательно)

Если вы хотите иметь доступ к настройке высокой доступности через доменное имя, продолжайте и создайтеA record в своем DNS, который указывает вашему домену на ваш плавающий IP-адрес. Если ваш домен использует серверы имен DigitalOcean, следуйтеstep three руководства Как настроить имя хоста с помощью DigitalOcean. Как только это распространяется, вы можете получить доступ к вашему активному серверу через доменное имя.

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

Установить Heartbeat

Следующим шагом является установка Heartbeat на обоих серверах. Самый простой способ установить Heartbeat - использовать apt-get:

sudo apt-get update
sudo apt-get install heartbeat

Heartbeat теперь установлен, но его нужно настроить, прежде чем он что-то сделает.

Настроить сердцебиение

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

  1. ha.cf - Глобальная конфигурация кластера Heartbeat, включая его узлы-члены

  2. authkeys - содержит ключ безопасности, который предоставляет узлам способ аутентификации в кластере.

  3. haresources - указывает службы, которыми управляет кластер, и узел, который является предпочтительным владельцем служб. Обратите внимание, что этот файл не используется в настройке, которая использует CRM, такой как Pacemaker

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

Сбор информации об узлах

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

Наboth servers запустите эту команду, чтобы найти соответствующие имена узлов:

uname -n

Обратите внимание на вывод команды. Имена узлов примера являются «первичными» и «вторичными», что соответствует тому, что мы назвали капельками.

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

Наboth servers используйте эту команду для поиска IP-адреса интерфейсаeth0 (или найдите его в панели управления DigitalOcean):

ip addr show eth0
ip addr show eth0 output:2: eth0:  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-адреса обоих серверов.

Создать файл ha.cf

Наboth servers откройте/etc/ha.d/ha.cf в своем любимом редакторе. Мы будем использовать нано:

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

Файл должен быть новым и пустым. Нам нужно добавить сетевые интерфейсы и имена каждого узла в нашем кластере.

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

/etc/ha.d/ha.cf

node primary
ucast eth0 198.51.100.5
node secondary
ucast eth0 198.51.100.6

Сохраните и выйдите из файла. Далее мы настроим ключ авторизации кластера.

Создать файл authkeys

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

На узлеprimary выполните эти команды, чтобы сгенерировать подходящий ключ авторизации в переменной среды с именем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

Это должно выглядеть примерно так (с другим ключом авторизации):

/etc/ha.d/authkeys

auth1
1 sha1 d1e6557e2fcb30ff8d4d3ae65b50345fa46a2faa

Убедитесь, что файл доступен для чтения только пользователю root:

sudo chmod 600 /etc/ha.d/authkeys

Теперь скопируйте файл/etc/ha.d/authkeys с основного узла на дополнительный. Вы можете сделать это вручную или с помощьюscp.

На сервереsecondary обязательно установите разрешения для файлаauthkeys:

sudo chmod 600 /etc/ha.d/authkeys

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

Создать файл haresources

В файлеharesources указываетсяpreferred hosts в паре со службами, которыми управляет кластер. Предпочтительный хост - это узел, на которомshould запускает связанные службы, если узел доступен. Если предпочтительный хостis not доступен, т.е. это не достижимо кластером, один из других узлов вступит во владение. Другими словами, вторичный сервер вступит во владение, если основной сервер выйдет из строя.

Наboth servers откройте файлharesources в вашем любимом редакторе. Мы будем использовать нано:

sudo nano /etc/ha.d/haresources

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

/etc/ha.d/haresources

primary floatip

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

Создать службу переназначения плавающего IP

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

Создать скрипт assign-ip

В нашем примере мы загрузим базовый сценарий Python, который назначает плавающий IP для данного идентификатора капли, используя API DigitalOcean.

Наboth servers загрузите скрипт Pythonassign-ip:

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

Наboth servers сделайте его исполняемым:

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

Поскольку наш скрипт делает запрос к API, нам понадобится установленная библиотека PythonRequests:

sudo apt-get install python-requests

Использование сценарияassign-ip требует следующих сведений:

  • Floating IP: Первый аргумент скрипта, плавающий IP-адрес, который назначается

  • Droplet ID: Второй аргумент скрипта, идентификатор капли, которой должен быть присвоен плавающий IP-адрес.

  • DigitalOcean PAT (API token): Передается как переменная средыDO_TOKEN, ваш чтение / запись DigitalOcean PAT

Не стесняйтесь просматривать содержимое сценария, прежде чем продолжить.

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

Создать сервисfloatip

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

Наboth servers добавьте открытый/etc/init.d/floatip в редактор:

sudo nano /etc/init.d/floatip

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

/etc/init.d/floatip

#!/bin/bash

param=$1

export DO_TOKEN='your_DO_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 запускается, она просто вызывает скрипт Pythonassign-ip и назначает указанный плавающий IP-адрес капле, которая выполнила скрипт. Это сценарий, который будет вызван серверомsecondary, если серверprimary выйдет из строя, чтобы переназначить плавающий IP-адрес самому себе,. Точно так же тот же сценарий будет использоваться серверомprimary для восстановления плавающего IP-адреса после его повторного присоединения к кластеру.

Начать сердцебиение

Теперь, когда Heartbeat настроен и все скрипты, на которые он опирается, настроены, мы готовы запустить кластер Heartbeat!

Наboth servers запустите эту команду, чтобы запустить Heartbeat:

sudo systemctl start heartbeat

Наша установка HA завершена! Прежде чем двигаться дальше, давайте проверим, что он работает как задумано.

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

Важно проверить работоспособность установки высокой доступности, поэтому давайте сделаем это сейчас.

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

Floating IP is pointing to primary serverDroplet: primary, IP Address: 198.51.100.5

Это указывает на то, что плавающий IP фактически назначен основной капле.

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

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

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

Давайте перезагрузим серверprimary. Сделайте это через панель управления DigitalOcean или запустив эту команду на основном сервере:

sudo reboot

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

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

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

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

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

Заключение

Поздравляем! Теперь у вас есть базовая настройка сервера HA с использованием Heartbeat и плавающего IP-адреса DigitalOcean.

Если вы хотите создать более надежную настройку высокой доступности, попробуйте использоватьCorosync and Pacemaker илиKeepalived.

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

Имейте в виду, что с любой альтернативой, которую вы выберете, вы захотите привязать свой балансировщик нагрузки / обратный прокси кanchor IP address, чтобы ваши пользователи могли получать доступ к вашим серверам только через плавающий IP-адрес (а не через публичный IP-адрес каждого сервера).

Related