Page tree
Skip to end of metadata
Go to start of metadata

Введение

Облачные сервисы ПК СВ Брест имеют встроенный механизм обеспечения отказоустойчивости высокой доступности. Для его задействования разворачивается нечетное количество экземпляров Front-end, которые взаимодействуя между собой по алгоритму RAFT обеспечивают доступность сервисов управления облаком при отказе менее половины узлов.

При настройке высокой доступности front-end по данной статье будут развернуты несколько экземпляров Front-end объединенных в зону. Узлы, взаимодействуя по алгоритму RAFT, определяют лидера, который обслуживает все входящие запросы, для чего выделяется "плавающий" (переходящий от узла к узлу) IP-адрес. Каждый узел имеет свой экземпляр базы данных, который реплицируется обслуживающими облако сервисами.

Требования

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

  • настроен по крайней мере один контроллер домена FreeIPA;
  • настроен Front-end облака (далее - Первый узел);
  • имеется дополнительно 2N узлов, настроенных в соответствии с Установка ОС (далее - Второй и последующие узлы);
  • ни на одном узле не развернут сервис apache2 в режиме "AstraMode off";
  • выделен IP-адрес для настройки плавающего адреса.

Подготовка узлов

Все действия в инструкции выполняются от имени суперпользователя (в Astra Linux Special Edition с включенным МКЦ - суперпользователя с высокой целостностью). Действия данного раздела необходимо выполнить на Втором и последующих узлах.

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

ssh-keygen
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\""
Перейдите на каждый уже настроенный узел и выполнить на нем:
KEY=$(sudo cat /root/.ssh/id_rsa.pub)
ssh <local-admin>@<hostname> "sudo bash -c \"echo $KEY >> /root/.ssh/authorized_keys\""
Здесь <hostname> - имя текущего узла, на котором выполняется эта инструкция.

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

Настройка RAFT

Далее выполняется настройка отказоустойчивости облачных сервисов.

Создание зоны

На Первом узле выполнить:

onezone server-add 0 --name <front-1-hostname>.<domain> --rpc http://<front-1-ip>:2633/RPC2
Проверить добавление узла в зону:
onezone show 0

Включение RAFT

Остановить сервисы на Первом узле:

systemctl stop opennebula unicorn-opennebula
Указать идентификатор сервера в зоне в файле на Первом узле:

/etc/one/oned.conf
FEDERATION = [
	MODE = "STANDALONE",
	ZONE_ID = 0,
	SERVER_ID = 0, # измените параметр с -1 to 0, где 0 - это ID сервера
	MASTER_ONED = ""
]

В этом же файле активировать Raft-хуки для того, чтобы добавить плавающий адрес в кластер на Первом узле:

/etc/one/oned.conf
# Executed when a server transits from follower->leader
RAFT_LEADER_HOOK = [
	COMMAND = "raft/vip.sh",
	ARGUMENTS = "leader <interface> <floating-ip>/<netmask>"
]

# Executed when a server transits from leader->follower
RAFT_FOLLOWER_HOOK = [
	COMMAND = "raft/vip.sh",
	ARGUMENTS = "follower <interface> <floating-ip>/<netmask>"
]

здесь:

  • <interface> - имя интерфейса, на котором будет активироваться плавающий IP-адрес;
  • <floating-ip> - плавающий IP-адрес;
  • <netmask> - маска сети, заданная числом от 0 до 32.

Запустить сервисы:

systemctl start opennebula unicorn-opennebula
Проверить зону и наличие плавающего адреса:

onezone show 0

ip a

Перенос данных на Второй и последующие узлы

На Первом узле сохранить БД:

sudo -u postgres /usr/bin/pg_dump --dbname=onedb  --format=plain --blobs --verbose --clean --create --file="/tmp/leader_db.backup"
Скопировать БД на Второй и последующие узлы:

scp /tmp/leader_db.backup <front-2-hostname>.<domain>:/tmp/

scp /tmp/leader_db.backup <front-3-hostname>.<domain>:/tmp/

...

scp /tmp/leader_db.backup <front-N-hostname>.<domain>:/tmp/

Остановить службы на Втором и последующих узлах:

ssh <front-2-hostname>.<domain> systemctl stop opennebula unicorn-opennebula
ssh <front-3-hostname>.<domain> systemctl stop opennebula unicorn-opennebula
...

ssh <front-N-hostname>.<domain> systemctl stop opennebula unicorn-opennebula

Заменить аутентификационные файлы:

ssh <front-2-hostname>.<domain> rm -rf /var/lib/one/.one
ssh <front-3-hostname>.<domain> rm -rf /var/lib/one/.one

...

ssh <front-N-hostname>.<domain> rm -rf /var/lib/one/.one

scp -r /var/lib/one/.one/ <front-2-hostname>.<domain>:/var/lib/one/
scp -r /var/lib/one/.one/ <front-3-hostname>.<domain>:/var/lib/one/

...

scp -r /var/lib/one/.one/ <front-N-hostname>.<domain>:/var/lib/one/

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

Если в команде pg_restore не используется ключ --if-exists, то могут появиться предупреждения об отсутствии некоторых объектов в целевой базе данных. Эти предупреждения можно игнорировать.


ssh <front-2-hostname>.<domain> sudo -u postgres /usr/bin/psql --file="/tmp/leader_db.backup"
ssh <front-3-hostname>.<domain> sudo -u postgres /usr/bin/psql --file="/tmp/leader_db.backup"

...
ssh <front-N-hostname>.<domain> sudo -u postgres /usr/bin/psql --file="/tmp/leader_db.backup"

Добавление Второго и последующих узлов

Рекомендуется добавлять новые узлы в зону по одному. Для этого на Первом узле выполнить:

onezone server-add 0 --name <front-N-hostname>.<domain> --rpc http://<front-N-ip>:2633/RPC2
Проверить назначенный узлу идентификатор ID:

# onezone show 0
ZONE 0 INFORMATION                                                              
ID                : 0                   
NAME              : OpenNebula          


ZONE SERVERS                                                                    
ID NAME                        ENDPOINT                                                       
 0 <front-1-hostname>.<domain> http://xx.xx.xx.xx:2633/RPC2
 1 <front-2-hostname>.<domain> http://xx.xx.xx.xx:2633/RPC2

HA & FEDERATION SYNC STATUS                                                     
ID NAME                        STATE      TERM       INDEX      COMMIT     VOTE  FED_INDEX 
 0 <front-1-hostname>.<domain> leader     5          3162       3162       0     -1
 1 <front-2-hostname>.<domain> error                


ZONE TEMPLATE                                                                   
ENDPOINT="http://localhost:2633/RPC2"

В данном примере узлу <front-2-hostname>.<domain> был назначен ID=1.

Перейти на добавляемый узел и обновить конфигурацию:

/etc/one/oned.conf
FEDERATION = [
	MODE = "STANDALONE",
	ZONE_ID = 0,
	SERVER_ID = 1, # измените параметр с -1 на ID узла
	MASTER_ONED = ""
]

Включить хуки:

/etc/one/oned.conf
# Executed when a server transits from follower->leader
RAFT_LEADER_HOOK = [
	COMMAND = "raft/vip.sh",
	ARGUMENTS = "leader <interface> <floating-ip>/<netmask>"
]

# Executed when a server transits from leader->follower
RAFT_FOLLOWER_HOOK = [
	COMMAND = "raft/vip.sh",
	ARGUMENTS = "follower <interface> <floating-ip>/<netmask>"
]

Здесь:

  • <interface> - имя интерфейса, на котором будет активироваться плавающий адрес;
  • <floating-ip> - плавающий IP адрес;
  • <netmask> - маска сети, заданная числом от 0 до 32.

Запустить сервисы:

systemctl start opennebula unicorn-opennebula
Вернуться на Первый узел и проверить статус зоны:

# onezone show 0
ZONE 0 INFORMATION                                                              
ID                : 0                   
NAME              : OpenNebula          


ZONE SERVERS                                                                    
ID NAME                        ENDPOINT                                                       
 0 <front-1-hostname>.<domain> http://xx.xx.xx.xx:2633/RPC2
 1 <front-2-hostname>.<domain> http://xx.xx.xx.xx:2633/RPC2

HA & FEDERATION SYNC STATUS                                                     
ID NAME                        STATE      TERM       INDEX      COMMIT     VOTE  FED_INDEX 
 0 <front-1-hostname>.<domain> leader     5          3162       3162       0     -1
 1 <front-2-hostname>.<domain> follower   5          3162       3162       0     -1                


ZONE TEMPLATE                                                                   
ENDPOINT="http://localhost:2633/RPC2"

Повторить данный раздел (Добавление Второго и последующих узлов) для следующего узла.

Настройка веб-сервисов

Далее необходимо настроить на первом узле RAFT веб-серверы для корректной работы с плавающим IP-адресом.

Создать самоподписанный сертификат для плавающего адреса (<floating-name>.<domain>). Команда:

openssl req -x509 -nodes -newkey rsa:2048 -days 3650 -keyout /etc/apache2/ssl/<floating-name>.key -out /etc/apache2/ssl/<floating-name>.crt
- Предлагается ввести: 
Country Name (2 letter code) [AU]: — страна/регион (не обязательно)
State or Province Name (full name) [Some-State]: — штат (не обязательно)
Locality Name (eg, city) []: — город (не обязательно)
Organization Name (eg, company) [Internet Widgits Pty Ltd]: — имя организации (не обязательно)
Organizational Unit Name (eg, section) []: — подразделение организации, пропускаем.(не обязательно)
Common Name (e.g. server FQDN or YOUR name) []: — Обязательное поле, это имя, по которому к серверу будут обращаться <floating-name>.<domain>
Email Address []: — адрес электронной почты (не обязательно)
Чтобы просмотреть сертификат выполнить команду: 
openssl x509 -noout -text -in /etc/apache2/ssl/<floating-name>.crt
Скопировать сертификат и ключ  для плавающего имени с первого узла на все остальные узлы RAFT:
scp /etc/apache2/ssl/<floating-name>.crt <front-2-name>:/etc/apache2/ssl/<floating-name>.crt
scp /etc/apache2/ssl/<floating-name>.crt <front-3-name>:/etc/apache2/ssl/<floating-name>.crt
...
scp /etc/apache2/ssl/<floating-name>.crt <front-N-name>:/etc/apache2/ssl/<floating-name>.crt
scp /etc/apache2/ssl/<floating-name>.key <front-2-name>:/etc/apache2/ssl/<floating-name>.key
scp /etc/apache2/ssl/<floating-name>.key <front-3-name>:/etc/apache2/ssl/<floating-name>.key
...
scp /etc/apache2/ssl/<floating-name>.key <front-N-name>:/etc/apache2/ssl/<floating-name>.key

Настройка Apache2

На каждом узле RAFT  создать дополнительный конфигурационный файл веб-сервера Apache2 для использования плавающего имени. Для этого скопировать файл /etc/apache2/sites-available/000-default.conf в тот же каталог с именем 001-default.conf , его содержимое отредактировать, заменив FQDN на плавающий, а также расположение сертификата для плавающего имени.  Ниже приведен пример настройки файла:

/etc/apache2/sites-available/001-default.conf
<VirtualHost *:80>
        ServerName <floating-name>.<domain>
        Redirect permanent / https://<floating-name>.<domain>
</VirtualHost>
<VirtualHost _default_:443>
        ServerName <floating-name>.<domain>
        ServerAdmin webmaster@localhost
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
 
        DocumentRoot /usr/lib/one/sunstone/public
 
        SSLEngine on
        SSLCertificateFile /etc/apache2/ssl/<floating-name>.crt
        SSLCertificateKeyFile /etc/apache2/ssl/<floating-name>.key
 
        <Proxy balancer://unicornservers>
                BalancerMember http://127.0.0.1:9869
        </Proxy>
 
        ProxyPass /brestcloud !
        ProxyPass / balancer://unicornservers/
        ProxyPassReverse / balancer://unicornservers/
        ProxyPreserveHost on
 
        <Proxy *>
                AuthType Kerberos
                KrbAuthRealms <DOMAIN>
                KrbServiceName HTTP/<floating-name>.<domain>
                Krb5Keytab /etc/apache2/apache2.keytab
                KrbMethodNegotiate on
                KrbMethodK5Passwd off
                KrbSaveCredentials on
                require valid-user
                AllowOverride all
 
                RewriteEngine On
                RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
                RewriteRule ^/(.*)$ balancer://unicornservers%{REQUEST_URI} [P,QSA,L]
                RewriteCond %{LA-U:REMOTE_USER} (.+)
                RewriteRule . - [E=RU:%1]
                RequestHeader add X-Forwarded_Remote-User %{RU}e
        </Proxy>
 
 
        ScriptAlias /brestcloud/ /usr/lib/one/brestcloud/
        <Directory /usr/lib/one/brestcloud/>
                Options +ExecCGI
                AddHandler cgi-script .cgi
                AuthType Kerberos
                KrbAuthRealms <DOMAIN>
                KrbServiceName HTTP/<floating-name>.<domain>
                Krb5Keytab /etc/apache2/apache2.keytab
                KrbMethodNegotiate on
                KrbMethodK5Passwd off
                KrbSaveCredentials on
                require valid-user
                AllowOverride all
        </Directory>
 
        ErrorLog ${APACHE_LOG_DIR}/error.log
 
        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn
 
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

 - Далее добавить созданную конфигурацию в действующие конфигурации командой:   

a2ensite 001-default.conf                      #(этой командой будет добавлена ссылка в каталог /etc/apache2/sites-enabled/)

- Сохранить изменения и протестировать конфигурацию Apache. Лучше всего заранее протестировать конфигурацию на наличие различных синтаксических ошибок, иначе web-сервер не запустится. Для тестирования выполнить следующую команду:

apachectl configtest
 - Перезапустить apache2.service:
 systemctl restart apache2
Повторить раздел "Настройка Apache2" для следующих узлов RAFT.

Получение билетов

Получить необходимые kerberos-билеты (см. Настройки для FreeIPA). После получения билетов на каждом из участников RAFT по очереди выполнить команду:

ktutil
и объединить с ее помощью билеты:
rkt /etc/apache2/apache2.<floating-name>.keytab
wkt /etc/apache2/apache2.keytab
q
Установить дискреционные права доступа к полученному файлу:
chown www-data:www-data /etc/apache2/apache2.keytab
chmod 440 /etc/apache2/apache2.keytab
Перезапустить сервис:
systemctl restart apache2
Узел настроен. Далее повторить данный раздел для следующего узла.

Проверка

Для проверки работы отказоустойчивости выполнить следующие шаги:

ДействиеОжидаемый результат
1Войти в доменную машину с учетной записью brestadminПользователь авторизован в ОС
2Перейти по адресу http://<floating-ip>.<domain>Отображается окно входа в систему управления облаком
3Нажать кнопку LoginПользователь авторизован
4Подключиться по ssh к любому узлу кластера и проверить, какой узел является лидером с помощью команды
sudo onezone show 0
Отображается информация о зоне. Имеется один узел в состоянии leader, остальные узлы в состоянии follower
5Физически выключить узел, являющийся leader-
6

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

sudo onezone show 0

Отображается информация о зоне. Имеется один узел в состоянии leader, один узел в состоянии error, остальные узлы в состоянии follower. При отключении узла (leader), состояние других узлов (follower) будет: candidate. Спустя некоторое время определяется leader, остальные переходят в статус follower.
7Перейти по ssh на узел, являющийся leader-
8

Проверить наличие плавающего IP-адреса командой

ip a

в информации об интерфейсах присутствует плавающий IP
9Вернуться в браузер и обновить страницуОтображается окно входа в систему управления облаком
10Нажать кнопку LoginПользователь авторизован
11Включить отключенный узел-
12

Убедиться, что узел вернулся в кластер командной

sudo onezone show 0

Отображается информация о зоне. Имеется один узел в состоянии leader, остальные узлы в состоянии follower


Важно

После выполнения инструкций данного раздела вернитесь на предыдущую статью

  • No labels