Product SiteDocumentation Site

Глава 36. Настройка отказоустойчивого кластера (High Availability)

36.1. Настройка первого узла (Leader)
36.2. Добавление дополнительных серверов
36.3. Управление серверами кластера
36.4. Восстановление отказавшего сервера
36.5. Включение/отключение зоны
36.6. Sunstone
36.7. Настройка параметров Raft
36.8. Синхронизация конфигурации между узлами
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-кластера из трёх узлов:
  • 192.168.0.185 — opennebula (будущий Leader)
  • 192.168.0.184 — one-02
  • 192.168.0.183 — one-03
  • 192.168.0.200 — плавающий IP

36.1. Настройка первого узла (Leader)

Настройка первого узла:
  1. Запустите 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"
    
  2. Остановите службу и настройте SERVER_ID в файле /etc/one/oned.conf:
    FEDERATION = [
        MODE          = "STANDALONE",
        ZONE_ID       = 0,
        SERVER_ID     = 0, # измените с -1 на 0 (0 — это ID сервера)
        MASTER_ONED   = ""
    ]
    
  3. Включите 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"
    ]
    

    Примечание

    Имя сетевого интерфейса должно соответствовать фактическому интерфейсу на узле.
  4. Запустите 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-сервером.
  5. Убедитесь, что плавающий 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) следует использовать в:
  • ENDPOINT зоны;
  • параметре MONITOR_ADDRESS в /etc/one/monitord.conf.