Поиск по сайту:

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


Введение

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

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

Цель

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

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

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

  • Создайте 2 капли, которые будут получать трафик.
  • Создайте зарезервированный IP-адрес и назначьте его одному из дроплетов.
  • Создайте запись DNS A, указывающую на зарезервированный IP-адрес (необязательно)
  • Установить Heartbeat на Droplets
  • Настройка Heartbeat для запуска службы переназначения зарезервированных IP-адресов
  • Создать службу переназначения зарезервированного IP-адреса.
  • Тестировать отказоустойчивость

Предпосылки

Чтобы автоматизировать переназначение зарезервированного IP-адреса, мы должны использовать API DigitalOcean. Это означает, что вам необходимо сгенерировать токен личного доступа (PAT), который представляет собой токен API, который можно использовать для аутентификации в вашей учетной записи DigitalOcean с доступом чтение и запись. следуя разделу «Как создать токен личного доступа» руководства по API. Ваш PAT будет использоваться в сценарии, который будет добавлен на оба сервера в вашем кластере, поэтому обязательно сохраните его в безопасном месте, поскольку он обеспечивает полный доступ к вашей учетной записи DigitalOcean, для справки.

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

  • Зарезервированные IP-адреса
  • Метаданные
  • Данные пользователя (сценарии Cloud-Config)

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

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

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

Создайте две капли Ubuntu 14.04, основную и дополнительную, с этим скриптом 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-адресом дроплета (со ссылкой на службу метаданных). Доступ к любой капле через ее общедоступный IP-адрес покажет базовую веб-страницу с именем хоста и IP-адресом капли, что будет полезно для проверки того, на какую каплю указывает зарезервированный IP-адрес в любой момент.

Создать зарезервированный IP-адрес

В панели управления DigitalOcean нажмите «Сеть» в верхнем меню, затем «Зарезервированные IP-адреса» в боковом меню.

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

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

http://your_reserved_ip

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

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

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

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

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

Следующим шагом будет установка 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-адреса в случае изменения доступности основного дроплета.

Соберите информацию об узле

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

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

  1. uname -n

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

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

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

  1. 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 104.236.6.11/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:

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

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

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

node primary
ucast eth0 104.236.6.11
node secondary
ucast eth0 104.236.6.22

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

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

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

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

  1. sudo cat /etc/ha.d/authkeys

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

/etc/ha.d/authkeys example:
auth1 1 sha1 d1e6557e2fcb30ff8d4d3ae65b50345fa46a2faa

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

  1. sudo chmod 600 /etc/ha.d/authkeys

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

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

  1. sudo chmod 600 /etc/ha.d/authkeys

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

Создать файл ресурсов

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

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

  1. sudo vi /etc/ha.d/haresources

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

  1. primary floatip

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

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

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

Создать сценарий назначения IP-адреса

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

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

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

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

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

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

  • Зарезервированный IP-адрес: первый аргумент скрипта, зарезервированный IP-адрес, который назначается
  • Идентификатор дроплета: второй аргумент скрипта, идентификатор дроплета, которому должен быть назначен зарезервированный IP-адрес.
  • DigitalOcean PAT (токен API): передается как переменная среды DO_TOKEN, ваш PAT для чтения/записи DigitalOcean

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

Теперь мы готовы создать службу floatip.

Создать службу floatip

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

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

  1. sudo vi /etc/init.d/floatip

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

  1. #!/bin/bash
  2. param=$1
  3. export DO_TOKEN='b7d03a6947b217efb6f3ec3bd3504582'
  4. IP='45.55.96.8'
  5. ID=$(curl -s http://169.254.169.254/metadata/v1/id)
  6. if [ "start" == "$param" ] ; then
  7. python /usr/local/bin/assign-ip $IP $ID
  8. exit 0
  9. elif [ "stop" == "$param" ] ; then
  10. exit 0;
  11. elif [ "status" == "$param" ] ; then
  12. exit 0;
  13. else
  14. echo "no such command $param"
  15. exit 1;
  16. fi

Сохранить и выйти.

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

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

Когда эта служба floatip запущена, она просто вызовет скрипт Python assign-ip и назначит указанный зарезервированный IP-адрес дроплету, который выполнил скрипт. Это сценарий, который будет вызываться вторичным сервером для переназначения зарезервированного IP-адреса самому себе в случае сбоя основного сервера. Аналогичным образом тот же сценарий будет использоваться основным сервером для восстановления зарезервированного IP-адреса после его повторного присоединения к кластеру.

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

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

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

  1. sudo service heartbeat start

Вы должны увидеть такой вывод:

Heartbeat output:
Starting High-Availability services: Done.

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

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

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

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

Reserved IP is pointing to primary server
Droplet: primary, IP Address: 104.236.6.11

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

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

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

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

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

  1. sudo poweroff

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

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

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

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

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

Заключение

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

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

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