Вступление
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-адрес самому себе).
[.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 в подменю.
Назначьте плавающий 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
обоих серверов:
-
ha.cf
- Глобальная конфигурация кластера Heartbeat, включая его узлы-члены -
authkeys
- содержит ключ безопасности, который предоставляет узлам способ аутентификации в кластере. -
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-адрес каждого сервера).