Глава 36. Настройка отказоустойчивого кластера (High Availability)
OpenNebula поддерживает отказоустойчивость (HA) для ключевых компонентов:
oned — ядро системы;
mm_sched — планировщик.
Для обеспечения согласованности состояния между узлами используется распределённый протокол Raft.
Состояние системы (пользователи, виртуальные машины, ACL и другие объекты) хранится в базе данных. Все изменения состояния сначала записываются в журнал (log) в виде последовательности SQL-операций.
В кластере OpenNebula один сервер выбирается лидером (Leader). Все операции записи выполняются только через него. Остальные серверы работают в режиме ведомых (Follower).
Принцип работы:
Leader принимает изменения состояния системы;
изменения записываются в журнал и реплицируются на большинство ведомых серверов;
после подтверждения большинством запись фиксируется в базе данных;
Leader регулярно отправляет Follower служебные сообщения (heartbeats) для поддержания своего статуса.
Если Leader становится недоступен, ведомые серверы автоматически инициируют выборы нового Leader. После этого кластер продолжает работу без потери согласованности данных.
Операции чтения могут выполняться на любом узле. Операции записи, отправленные на Follower, автоматически перенаправляются на Leader.
Для настройки HA требуется:
нечётное количество серверов (рекомендуемый размер развёртывания — 3 или 5 серверов, что обеспечивает отказоустойчивость при отказе 1 или 2 серверов соответственно);
рекомендуется идентичная аппаратная конфигурация серверов;
идентичная программная конфигурация серверов (за исключением SERVER_ID в /etc/one/oned.conf);
рекомендуется использовать единый тип СУБД (например, MySQL) на всех узлах;
серверы должны иметь беспарольный SSH-доступ для связи друг с другом;
плавающий IP-адрес, который будет автоматически назначаться Leader;
общая файловая система;
общие хранилища данных должны быть смонтированы на всех узлах.
Добавлять дополнительные серверы или удалять старые можно после запуска кластера.
В данном примере показана настройка HA-кластера из трёх узлов:
36.1. Настройка первого узла (Leader)
Настройка первого узла:
Запустите OpenNebula и добавьте локальный сервер в зону (в примере зона с ID 0):
$ onezone list
C ID NAME ENDPOINT FED_INDEX
* 0 OpenNebula http://localhost:2633/RPC2 -1
$ onezone server-add 0 \
--name opennebula \
--rpc http://192.168.0.185:2633/RPC2
$ onezone show 0
ZONE 0 INFORMATION
ID : 0
NAME : OpenNebula
STATE : ENABLED
ZONE SERVERS
ID NAME ENDPOINT
0 opennebula http://192.168.0.185:2633/RPC2
HA & FEDERATION SYNC STATUS
ID NAME STATE TERM INDEX COMMIT VOTE FED_INDEX
0 opennebula solo 0 -1 0 -1 -1
ZONE TEMPLATE
ENDPOINT="http://localhost:2633/RPC2"
Остановите службу и настройте
SERVER_ID в файле
/etc/one/oned.conf:
FEDERATION = [
MODE = "STANDALONE",
ZONE_ID = 0,
SERVER_ID = 0, # измените с -1 на 0 (0 — это ID сервера)
MASTER_ONED = ""
]
Включите Raft-обработчики, чтобы добавить плавающий IP-адрес в кластер (файл
/etc/one/oned.conf):
RAFT_LEADER_HOOK = [
COMMAND = "raft/vip.sh",
ARGUMENTS = "leader enp0s3 192.168.0.200/24"
]
# Executed when a server transits from leader->follower
RAFT_FOLLOWER_HOOK = [
COMMAND = "raft/vip.sh",
ARGUMENTS = "follower enp0s3 192.168.0.200/24"
]
Имя сетевого интерфейса должно соответствовать фактическому интерфейсу на узле.
Запустите OpenNebula и проверьте зону:
$ onezone show 0
ZONE 0 INFORMATION
ID : 0
NAME : OpenNebula
STATE : ENABLED
ZONE SERVERS
ID NAME ENDPOINT
0 opennebula http://192.168.0.185:2633/RPC2
HA & FEDERATION SYNC STATUS
ID NAME STATE TERM INDEX COMMIT VOTE FED_INDEX
0 opennebula leader 1 5 5 0 -1
ZONE TEMPLATE
ENDPOINT="http://localhost:2633/RPC2"
Сервер opennebula стал Leader-сервером.
Убедитесь, что плавающий IP назначен:
$ ip -o a sh enp0s3
2: enp0s3 inet 192.168.0.185/24 brd 192.168.0.255 scope global enp0s3\ valid_lft forever preferred_lft forever
2: enp0s3 inet 192.168.0.200/24 scope global secondary enp0s3\ valid_lft forever preferred_lft forever
2: enp0s3 inet6 fe80::a00:27ff:fe6f:f3cb/64 scope link \ valid_lft forever preferred_lft forever
Плавающий IP-адрес (192.168.0.200) следует использовать в: