Как создать установку высокой доступности с Pacemaker, Corosync и плавающими IP на CentOS 7

Вступление

Corosync - это кластерный движок с открытым исходным кодом, используемый для обеспечения высокой доступности приложений. Corosync, обычно называемыйmessaging layer, обеспечивает членство в кластере и модель закрытого взаимодействия для создания реплицированных конечных автоматов, поверх которых могут работать диспетчеры ресурсов кластера, такие как Pacemaker. Corosync можно рассматривать как базовую систему, которая соединяет узлы кластера вместе, в то время как Pacemaker контролирует кластер и предпринимает действия в случае сбоя.

В этом руководстве показано, как использовать Corosync и Pacemaker для создания инфраструктуры высокой доступности (HA) в DigitalOcean с серверами CentOS 7 и плавающими IP-адресами. Чтобы упростить процесс настройки и управления узлами кластера, мы будем использовать PCS, интерфейс командной строки, который взаимодействует как с Corosync, так и с Pacemaker.

Предпосылки

Чтобы следовать этому руководству, вам потребуется:

  • Две капли CentOS 7, расположенные в одном центре обработки данных, с включеннымPrivate Network

  • Пользователь sudo без полномочий root, которого вы можете настроить, следуя руководствуInitial Server Setup

  • Токен персонального доступа к API DigitalOcean, который вы можете создать, следуя руководствуHow to Use the DigitalOcean API V2

При создании этих капель используйте описательные имена хостов, чтобы однозначно идентифицировать их. В этом руководстве мы будем называть эти каплиprimary иsecondary.

Когда вы будете готовы двигаться дальше, убедитесь, что вы вошли на оба своих сервера под своим пользователемsudo.

[[step-1 -—- set-up-nginx]] == Шаг 1. Настройте Nginx

Чтобы ускорить процесс, мы собираемся использовать простойshell script, который устанавливает Nginx и настраивает базовую веб-страницу, содержащую информацию об этом конкретном сервере. Таким образом, мы можем легко определить, какой сервер в данный момент активен в нашей настройке плавающего IP. Сценарий используетMetadata service DigitalOcean для получения IP-адреса и имени хоста Droplet.

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

sudo curl -L -o install.sh http://do.co/nginx-centos
sudo chmod +x install.sh
sudo ./install.sh

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

Чтобы упростить это руководство, мы будем использовать простые веб-серверы в качестве узлов кластера. В производственной среде узлы обычно настраиваются для работы в качестве резервных балансировщиков нагрузки. Для получения дополнительной информации о балансировщиках нагрузки ознакомьтесь с нашим руководствомIntroduction to HAProxy and Load Balancing Concepts.

[[step-2 -—- create-and-assign-Floating-ip]] == Шаг 2 - Создание и назначение плавающего IP-адреса

Первый шаг - создать плавающий IP-адрес и назначить его серверуprimary. На панели управления DigitalOcean щелкнитеNetworking в верхнем меню, затемFloating IPs в боковом меню.

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

Floating IPs Control Panel

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

http://your_floating_ip

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

[[step-3 -—- create-ip-reassignment-script]] == Шаг 3 - Создайте скрипт переназначения IP

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

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

Давайте начнем с загрузки скриптаassign-ip и сделаем его исполняемым. Не стесняйтесь просматривать содержимое скрипта перед его загрузкой.

Следующие две команды должны выполняться наboth servers (первичной и вторичной):

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

Скриптуassign-ip для выполнения требуется следующая информация:

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

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

  • DigitalOcean API Token: передается как переменная среды DO_TOKEN, ваш токен персонального доступа DigitalOcean для чтения / записи.

Тестирование сценария переназначения IP

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

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

while true; do curl floating_IP_address; sleep 1; done

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

OutputDroplet: primary, IP Address: primary_IP_address
Droplet: primary, IP Address: primary_IP_address
Droplet: primary, IP Address: primary_IP_address
...

Теперь давайте запустим сценарийassign-ip, чтобы переназначить плавающий IP-адрес каплеsecondary. Мы будем использовать сервис метаданных DigitalOcean для получения текущего идентификатора дроплета и использования его в качестве аргумента сценария. Извлечение идентификатора капли из службы метаданных можно выполнить с помощью:

curl -s http://169.254.169.254/metadata/v1/id

Где169.254.169.254 - статический IP-адрес, используемый службой метаданных, и поэтому его не следует изменять. Эта информация доступна только из самой капли.

Прежде чем мы сможем выполнить скрипт, нам нужно установить переменную средыDO_TOKEN, содержащую токен DigitalOcean API. Выполните следующую команду с сервераsecondary и не забудьте заменитьyour_api_token своим токеном личного доступа для чтения / записи в DigitalOcean API:

export DO_TOKEN=your_api_token

По-прежнему на сервереsecondary запустите сценарийassign-ip, заменивfloating_IP_address своим плавающим IP-адресом:

assign-ip floating_IP_address `curl -s http://169.254.169.254/metadata/v1/id`
OutputMoving IP address: in-progress

Наблюдая за выводом командыcurl на локальном терминале, вы заметите, что плавающий IP-адрес изменит назначенный ему IP-адрес и через несколько секунд начнет указывать на каплюsecondary:

OutputDroplet: primary, IP Address: primary_IP_address
Droplet: primary, IP Address: primary_IP_address
Droplet: secondary, IP Address: secondary_IP_address

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

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

export DO_TOKEN=your_api_token
assign-ip floating_IP_address `curl -s http://169.254.169.254/metadata/v1/id`

Через несколько секунд плавающий IP-адрес должен снова указывать на ваш основной дроплет.

[[step-4 -—- install-corosync-pacemaker-and-pcs]] == Шаг 4. Установите Corosync, Pacemaker и PCS

Следующим шагом будет установка Corosync, Pacemaker и PCS на ваши капли. Поскольку Corosync является зависимостью от Pacemaker, обычно лучше просто установить Pacemaker и позволить системе решить, какую версию Corosync следует установить.

Установите пакеты программного обеспечения наboth servers:

sudo yum install pacemaker pcs

Утилита PCS создает во время установки нового системного пользователя с именемhacluster с отключенным паролем. Нам нужно определить пароль для этого пользователя на обоих серверах. Это позволит PCS выполнять такие задачи, как синхронизация конфигурации Corosync на нескольких узлах, а также запуск и остановка кластера.

Наboth servers запустите:

passwd hacluster

Вы должны использоватьsame password на обоих серверах. Мы собираемся использовать этот пароль для настройки кластера на следующем шаге.

[.note] # Пользовательhacluster не имеет интерактивной оболочки или домашнего каталога, связанного с его учетной записью, что означает, что невозможно войти на сервер, используя его учетные данные.
#

[[step-5 -—- set-up-the-cluster]] == Шаг 5. Настройте кластер

Теперь, когда на обоих серверах установлены Corosync, Pacemaker и PCS, мы можем настроить кластер.

Включение и запуск PCS

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

sudo systemctl enable pcsd.service
sudo systemctl start pcsd.service

Получение IP-адреса частной сети для каждого узла

Для повышения производительности и безопасности сети узлы должны быть подключены с помощьюprivate network. Самый простой способ получить IP-адрес частной сети Droplet - через службу метаданных. На каждом сервере выполните следующую команду:

curl http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address && echo

Эта команда просто выведет IP-адрес частной сети для капли, в которую вы вошли. Вы также можете найти эту информацию на странице своей капли на панели управления DigitalOcean (на вкладкеSettings).

Соберите IP-адрес частной сети из обеих капель для следующих шагов.

Аутентификация узлов кластера

Аутентифицируйте узлы кластера, используя имя пользователяhacluster и тот же пароль, который вы определили на шаге 3. Вам необходимо указать IP-адрес частной сети для каждого узла. С сервераprimary запустите:

sudo pcs cluster auth primary_private_IP_address secondary_private_IP_address

Вы должны получить вывод, как это:

OutputUsername: hacluster
Password:
primary_private_IP_address: Authorized
secondary_private_IP_address: Authorized

Генерация конфигурации Corosync

Все еще на сервереprimary, сгенерируйте файл конфигурации Corosync с помощью следующей команды:

sudo pcs cluster setup --name webcluster \
primary_private_IP_address secondary_private_IP_address

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

OutputShutting down pacemaker/corosync services...
Redirecting to /bin/systemctl stop  pacemaker.service
Redirecting to /bin/systemctl stop  corosync.service
Killing any remaining services...
Removing all cluster configuration files...
primary_private_IP_address: Succeeded
secondary_private_IP_address: Succeeded
Synchronizing pcsd certificates on nodes primary_private_IP_address, secondary_private_IP_address...
primary_private_IP_address: Success
secondary_private_IP_address: Success

Restaring pcsd on the nodes in order to reload the certificates...
primary_private_IP_address: Success
secondary_private_IP_address: Success

Это создаст новый файл конфигурации, расположенный в/etc/corosync/corosync.conf, на основе параметров, предоставленных командеpcs cluster setup. В этом примере мы использовалиwebcluster в качестве имени кластера, но вы можете использовать любое имя по вашему выбору.

Запуск кластера

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

sudo pcs cluster start --all
Outputprimary_private_IP_address: Starting Cluster...
secondary_private_IP_address: Starting Cluster...

Теперь вы можете подтвердить, что оба узла присоединились к кластеру, выполнив следующую команду на любом из серверов:

sudo pcs status corosync
OutputMembership information
----------------------
    Nodeid      Votes Name
         2          1 secondary_private_IP_address
         1          1 primary_private_IP_address (local)

Чтобы получить больше информации о текущем состоянии кластера, вы можете запустить:

sudo pcs cluster status

Вывод должен быть похож на это:

OutputCluster Status:
 Last updated: Fri Dec 11 11:59:09 2015     Last change: Fri Dec 11 11:59:00 2015 by hacluster via crmd on secondary
 Stack: corosync
 Current DC: secondary (version 1.1.13-a14efad) - partition with quorum
 2 nodes and 0 resources configured
 Online: [ primary secondary ]

PCSD Status:
  primary (primary_private_IP_address): Online
  secondary (secondary_private_IP_address): Online

Теперь вы можете включить службыcorosync иpacemaker, чтобы убедиться, что они запускаются при загрузке системы. Выполните следующее наboth servers:

sudo systemctl enable corosync.service
sudo systemctl enable pacemaker.service

Отключение STONITH

STONITH (Shoot The Other Node In The Head) - это метод ограждения, предназначенный для предотвращения повреждения данных, вызванного неисправными узлами в кластере, которые не отвечают, но все еще обращаются к данным приложения. Поскольку его конфигурация зависит от ряда факторов, которые выходят за рамки данного руководства, мы собираемся отключить STONITH в нашей настройке кластера.

Чтобы отключить STONITH, выполните следующую команду на одной из капель, основной или дополнительной:

sudo pcs property set stonith-enabled=false

[[step-6 -—- create-float-ip-reassignment-resource-agent]] == Шаг 6. Создание агента ресурса переназначения плавающего IP-адреса

Осталось только настроить агент ресурса, который будет выполнять сценарий переназначения IP-адресов при обнаружении сбоя в одном из узлов кластера. Агент ресурса отвечает за создание интерфейса между кластером и самим ресурсом. В нашем случае ресурсом является скрипт assign-ip. Кластер полагается на то, что агент ресурса выполняет правильные процедуры, когда ему дают команду запуска, остановки или мониторинга. Существуют разные типы агентов ресурсов, но наиболее распространенным является стандарт OCF (Open Cluster Framework).

Мы создадим новый агент ресурсов OCF для управления службойassign-ip на обоих серверах.

Сначала создайте каталог, который будет содержать агент ресурса. Имя каталога будет использоваться Pacemaker в качестве идентификатора для этого пользовательского агента. Выполните следующее наboth servers:

sudo mkdir /usr/lib/ocf/resource.d/digitalocean

Затем загрузите сценарий агента ресурсов FloatIP и поместите его во вновь созданный каталог наboth servers:

sudo curl -L -o /usr/lib/ocf/resource.d/digitalocean/floatip http://do.co/ocf-floatip

Теперь сделайте скрипт исполняемым с помощью следующей команды наboth servers:

sudo chmod +x /usr/lib/ocf/resource.d/digitalocean/floatip

Нам все еще нужно зарегистрировать агент ресурса в кластере, используя утилиту PCS. Следующая команда должна быть выполнена изone узлов (не забудьте заменитьyour_api_token на свой токен API DigitalOcean, аfloating_IP_address на ваш фактический плавающий IP-адрес):

sudo pcs resource create FloatIP ocf:digitalocean:floatip \
    params do_token=your_api_token \
    floating_ip=floating_IP_address

Теперь ресурс должен быть зарегистрирован и активен в кластере. Вы можете проверить зарегистрированные ресурсы с любого из узлов с помощью командыpcs status:

sudo pcs status
Output...
2 nodes and 1 resource configured

Online: [ primary secondary ]

Full list of resources:

 FloatIP    (ocf::digitalocean:floatip):    Started primary

...

[[step-7 -—- test-failover]] == Шаг 7 - Тестирование аварийного переключения

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

Опять же, давайте проследим за переназначением IP, используя командуcurl в цикле. Из локального терминала запустите:

while true; do curl floating_IP_address; sleep 1; done

С сервераprimary выполните команду перезагрузки:

sudo reboot

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

Output...
Droplet: primary, IP Address: primary_IP_address
Droplet: primary, IP Address: primary_IP_address
curl: (7) Failed connect to floating_IP_address; Connection refused
Droplet: secondary, IP Address: secondary_IP_address
Droplet: secondary, IP Address: secondary_IP_address
…

[.note] # Ошибка «Соединение отклонено» возникает, когда запрос делается непосредственно перед или в то же время, когда происходит переназначение IP. Это может или не может отображаться в выводе.
#

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

sudo reboot

Заключение

В этом руководстве мы увидели, как плавающие IP-адреса можно использовать вместе с Corosync, Pacemaker и PCS для создания высокодоступной среды веб-серверов на серверах CentOS 7. Мы использовали довольно простую инфраструктуру для демонстрации использования плавающих IP-адресов, но эту настройку можно масштабировать для обеспечения высокой доступности на любом уровне стека ваших приложений.

Related