Алгоритм Raft#

Общие сведения#

Для обеспечения отказоустойчивости сервиса фронтальной машины в ПВ применяется технология Raft. Алгоритм Raft позволяет объединять несколько экземпляров фронтальной машины в зону, конфигурацию которой можно менять (добавлять и удалять экземпляры фронтальной машины), не прерывая работу ПВ. Для этой зоны выделяется плавающий (способный при необходимости переходить от одного экземпляра к другому) IP-адрес. Из доступных экземпляров выбирается лидер, которому присваивается ранее выделенный IP-адрес. Лидер обслуживает все входящие запросы. Все изменения на лидере синхронизируются с остальными экземплярами фронтальной машины в зоне. Если работа лидера прерывается на 100 миллисекунд, то выбирается новый лидер из числа исправных экземпляров. Выделенный для зоны IP-адрес присваивается новому лидеру. Таким образом обеспечивается высокая доступность фронтальной машины.

Для работы Raft должны быть соблюдены следующие требования:

  1. Настроено нечетное количество (рекомендуется 3 или 5) экземпляров фронтальной машины, при этом на всех экземплярах нужно указать одинаковое имя учетной записи администратора ПВ.

  2. Ни на одном из экземпляров не развернут сервис apache2 в режиме «AstraMode off».

  3. Выделен IP для настройки плавающего IP-адреса кластера.

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

  5. Настроено общее облачное хранилище для образов дисков и файлов.

Чтобы настроить беспарольный доступ для пользователя root необходимо выполнить следующие действия:

  1. На каждом экземпляре фронтальной машины создать ssh-ключ от имени пользователя root командой:

sudo ssh-keygen.

Для всех параметров оставлять значения по умолчанию (сразу нажимать клавишу Enter).

  1. На каждом экземпляре фронтальной машины выполнить обмен ключами командами:

KEY=$(sudo cat /root/.ssh/id_rsa.pub)
ssh <local-admin>@<front-1-hostname> "sudo bash -c \"echo $KEY >> /root/.ssh/authorized_keys\""
   ssh <local-admin>@<front-2-hostname> "sudo bash -c \"echo $KEY >> /root/.ssh/authorized_keys\""
   ssh <local-admin>@<front-N-hostname> "sudo bash -c \"echo $KEY >> /root/.ssh/authorized_keys\""

где:

  • <front-N-hostname> — имя (hostname) N-го экземпляра фронтальной машины. Допускается вместо имен указывать IP-адреса;

  • <local-admin> — имя локального администратора сервера, заданное при установке ОС.

При появлении приглашения для ввода вида:

Are you sure you want to continue connecting (yes/no)?

Ввести yes и нажать клавишу Enter`. Вести пароль локального администратора сервера, заданный при установке ОС.

  1. Проверить обмен ключами, для этого:

  1. в терминале первого экземпляра фронтальной машины выполнить вход по ssh на другой экземпляр командой:

sudo ssh <front-N-hostname>
  1. выполнить вход по ssh на первый экземпляр фронтальной машины командой:

sudo ssh <front-1-hostname>

где <front-N-hostname> — имя (hostname) N-го экземпляра фронтальной машины. Допускается вместо имен указывать IP-адреса.

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

  1. последовательно закрыть сессии ssh командами:

exit exit
  1. Аналогичным образом проверить беспарольный доступ на остальных экземплярах фронтальной машины.

Настройка зоны объединения экземпляров фронтальных машин#

Для автоматической настройки зоны, объединяющей несколько экземпляров фронтальной машины, можно воспользоваться скриптом brestcloud-raft-configure, который запускается на одной из фронтальных машин от имени администратора командой:

sudo brestcloud-raft-configure

В процессе работы мастера настройки объединения экземпляров фронтальных машин необходимо:

  1. Указать количество экземпляров фронтальных машин.

  2. Указать сетевой интерфейс, на который будет назначен плавающий IP-адрес (обычно указывается интерфейс, на котором настроен статический IP-адрес).

  3. Указать плавающий IP-адрес.

  4. Последовательно указать полные доменные имена экземпляров фронтальных машин.

  5. Указать короткое плавающее имя (эта A-запись будет зафиксирована в DNS FreeIPA).

После завершения работы мастера настройки объединения экземпляров фронтальных машин необходимо выполнить настройку браузера Mozilla Firefox для подключения к веб-интерфейсу ПВ.

Вывод из зоны объединения экземпляра фронтальной машины#

Для вывода из зоны объединения экземпляра фронтальной машины (ноды) необходимо на лидере выполнить команду:

sudo onezone server-del <идентификатор_зоны> <идентификатор_удаляемого_экземпляра>

Ввод экземпляра фронтальной машины в зону объединения#

Для ввода экземпляра фронтальной машины в зону объединения необходимо выполнить следующие действия: 1. На новом сервере установить и настроить сервис фронтальной машины, при этом нужно указать существующее имя учетной записи администратора ПВ, проверить, что сервер находится в одиночном режиме командой:

sudo onezone show 0

Пример вывода после выполнения команды:

*ZONE 0 INFORMATION *
ID : 0
NAME : OpenNebula

ZONE TEMPLATE
ENDPOINT="http://localhost:2633/RPC2"
  1. На новом сервере настроить беспарольный доступ для пользователя root на все и со всех экземпляров фронтальной машины.

  2. На лидере сделать бекап базы и скопировать на новый сервер командами:

sudo onedb backup /tmp/db.backup -f -t postgresql -S localhost -u oneadmin -p "<пароль_БД_лидера>" -d opennebula sudo scp /tmp/db.backup <new-front-hostname>:/tmp

где:

  • <пароль_БД_лидера> — взят из файла /etc/one/one.d/db.conf;

  • <new-front-hostname> — имя (hostname) нового сервера. Допускается вместо имен указывать IP-адреса.

  1. На новом сервере остановить службу Брест и восстановить БД командами:

sudo systemctl stop opennebula sudo onedb restore -f /tmp/db.backup -t postgresql -S localhost -u oneadmin -p "<пароль_БД_нового_сервера>" -d opennebula

где <пароль_БД_нового_сервера> — взят из файла /etc/one/one.d/db.conf.

  1. На лидере скопировать директорию .one на новый сервер командой:

sudo scp -r /var/lib/one/.one/ <new-front-hostname>:/var/lib/one/

где <new-front-hostname> — имя (hostname) нового сервера. Допускается вместо имен указывать IP-адреса.

  1. На лидере добавить новый сервер командой:

sudo onezone server-add <идентификатор_зоны> --name <полное_доменное_имя_нового_сервера> --rpc \ http://<полное_доменное_имя_нового_сервера>:2633/RPC2
  1. С лидера скопировать файл конфигурации raft на новый сервер командой:

sudo scp /etc/one/one.d/raft.conf <new-front-hostname>:/etc/one/one.d/

где <new-front-hostname> — имя (hostname) нового сервера. Допускается вместо имен указывать IP-адреса.

  1. На новом сервере скорректировать параметр FEDERATION[SERVER_ID] в файле /etc/one/one.d/raft.conf, указав <идентификатор_нового_сервера>. Значение параметра <идентификатор_нового_сервера> (ID) можно получить, выполнив команду:

sudo onezone show 0
  1. На новом сервере запустить службу Брест и перезапустить сервис веб-интерфейса командами:

sudo systemctl start opennebula sudo systemctl restart opennebula-sunstone
  1. С лидера скопировать сертификаты короткого плавающего имени командой:

sudo scp /etc/one/ssl/<короткое_плавающее_имя>.* <new-front-hostname>:/etc/one/ssl/

где <new-front-hostname> — имя (hostname) нового сервера. Допускается вместо имен указывать IP-адреса.

  1. С лидера скопировать файлы конфигурации apache на новый сервер командами:

sudo scp /etc/apache2/sites-available/ipa-one-apache2-float.conf <new-front-hostname>:/etc/apache2/sites-available/ sudo scp /etc/apache2/apache2.<короткое_плавающее_имя>.keytab <new-front-hostname>:/etc/apache2/

где <new-front-hostname> — имя (hostname) нового сервера. Допускается вместо имен указывать IP-адреса.

  1. На новом сервере применить файлы конфигурации apache командами:

sudo ktutil << EOF rkt /etc/apache2/apache2.<короткое плавающее имя>.keytab wkt /etc/apache2/apache2.keytab q EOF sudo a2ensite ipa-one-apache2-float.conf sudo systemctl restart apache2
  1. Проверить корректность новой конфигурации командой:

sudo onezone show 0