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

Вступление

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

Если вы хотите создать более надежную настройку HA, изучите использование https://www.digitalocean.com/community/tutorials/how-to-create-a-high-availability-setup-with-corosync-pacemaker-and -floating-ips-on-ubuntu-14-04 [Corosync and Pacemaker] или https://www.digitalocean.com/community/tutorials/how-to-set-up-highly-available-web-servers-with- keepalived-и-плавающей ИПС-на-убунту-14-04 [Keepalived].

Goal

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

изображение: https: //assets.digitalocean.com/articles/high_availability/ha-diagram-animated.gif [Активная / пассивная диаграмма]

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

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

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

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

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

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

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

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

Предпосылки

Чтобы автоматизировать переназначение плавающего IP, мы должны использовать API DigitalOcean. Это означает, что вам нужно сгенерировать персональный токен доступа (PAT), который является токеном API, который можно использовать для аутентификации в вашей учетной записи DigitalOcean, с доступом read и write, следуя https://www.digitalocean.com/community. / tutorials / how-to-use-the-digitalocean-api-v2 # how-to-generate-a-personal-access-token [Как сгенерировать личный токен доступа] в разделе учебника API. Ваш PAT будет использоваться в сценарии, который будет добавлен к обоим серверам в вашем кластере, поэтому обязательно держите его где-нибудь в безопасности, поскольку он предоставляет полный доступ к вашей учетной записи DigitalOcean для справки.

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

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

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

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

Создайте две капли Ubuntu 14.04, * primary * и * Second *, с этим сценарием 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 > /usr/share/nginx/html/index.html

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

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

На панели управления DigitalOcean нажмите * Сеть * в верхнем меню, затем * Плавающие IP-адреса * в боковом меню.

изображение: https: //assets.digitalocean.com/site/ControlPanel/fip_no_floating_ips.png [без плавающих IP-адресов]

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

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

http://

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

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

Если вы хотите иметь доступ к настройке HA через доменное имя, создайте запись * A * в DNS, которая указывает ваш домен на ваш плавающий IP-адрес. Если в вашем домене используются серверы имен DigitalOcean, выполните https://www.digitalocean.com/community/tutorials/how-to-set-up-a-host-name-with-digitalocean#step-three%E2%80%94configure. -your-domain [шаг третий] учебника Как настроить имя хоста с помощью 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 +.

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

uname -n

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

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

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

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 /18 brd 104.236.63.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

На * обоих серверах * откройте + / etc / ha.d / ha.cf + в вашем любимом редакторе. Мы будем использовать + vi +:

sudo vi /etc/ha.d/ha.cf

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

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

node
ucast eth0
node
ucast eth0

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

Создать файл 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 example:auth1
1 sha1

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

sudo chmod 600 /etc/ha.d/authkeys

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

На * вторичном * сервере обязательно установите права доступа к файлу + authkeys +:

sudo chmod 600 /etc/ha.d/authkeys

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

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

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

На * обоих серверах * откройте файл + haresources + в вашем любимом редакторе. Мы будем использовать + vi +:

sudo vi /etc/ha.d/haresources

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

/etc/ha.d/haresources

floatip

Сохранить и выйти. Это настраивает * основной * сервер в качестве предпочтительного хоста для службы + floatip +, которая в настоящее время не определена. Давайте установим сервис + floatip + дальше.

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

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

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

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

На * обоих серверах * загрузите скрипт Python + assign-ip +:

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

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

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

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

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

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

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

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

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

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

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

На * обоих серверах * добавьте открытый файл + / etc / init.d / floatip + в редакторе:

sudo vi /etc/init.d/floatip

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

/etc/init.d/floatip

#!/bin/bash

param=$1

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

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

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

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

sudo service heartbeat start

Вы должны увидеть результат примерно так:

Heartbeat output:Starting High-Availability services: Done.

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

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

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

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

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

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

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

while true; do curl http://; sleep 1; done

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

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

sudo poweroff

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

curl loop output:Droplet: , IP Address:
...
curl: (7) Failed to connect to  port 80: Connection refused
Droplet: , IP Address:
Droplet: , IP Address:
...

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

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

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

Заключение

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

Если вы хотите создать более надежную настройку HA, изучите использование https://www.digitalocean.com/community/tutorials/how-to-create-a-high-availability-setup-with-corosync-pacemaker-and -floating-ips-on-ubuntu-14-04 [Corosync and Pacemaker] или https://www.digitalocean.com/community/tutorials/how-to-set-up-highly-available-web-servers-with- keepalived-и-плавающей ИПС-на-убунту-14-04 [Keepalived].

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

Related