Балансировщик — это сервис, позволяющий автоматически выравнивать загрузку узлов кластера за счёт перераспределения виртуальных машин (ВМ) между узлами. Процедура распределения ВМ выполняется автоматически с периодичностью, заданной в настройках балансировщика.

Ограничения


Функция балансировщика доступна только:

  • в версии VMmanager Infrastructure;

  • в кластерах с типом виртуализации KVM;

  • в кластерах с типом настройки сети "Коммутация" и IP-fabric.

Логика работы


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

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

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

Балансировщик переносит ВМ между узлами с помощью механизма живой миграции. Условия, при которых живая миграция не может быть выполнена, указаны в статье Миграция виртуальных машин. Дополнительно накладываются следующие ограничения:

  • недоступна миграция между кластерами;
  • недоступна миграция на узлы, находящиеся в режиме обслуживания;
  • недоступна опция переназначения сетевых интерфейсов при их несовпадении.

Работа балансировщика состоит из итераций. В каждой итерации балансировщик:

  1. Запрашивает у сервиса статистики информацию по средней загрузке CPU и RAM за установленный период проверки баланса. Например, если администратор установил периодичность проверки в 10 минут, балансировщик запросит данные за последние 10 минут. 

    При большом количестве узлов в кластере возможна ситуация, когда сервис статистики не успеет собрать данные со всех узлов за период проверки баланса. В этом случае балансировщик будет принимать решения на основе частичных данных. Список узлов, статистика с которых не учитывалась, записывается в лог сервиса.

  2. Составляет список перегруженных узлов на основе данных статистики. Чем выше средняя загрузка CPU и RAM на узле, тем более перегруженным он считается. Если перегруженных узлов нет, перенос ВМ в текущей итерации не выполняется.
  3. Сортирует список в порядке от наиболее загруженного узла к наименее загруженному.
  4. Составляет список ВМ, которые можно перенести с первого узла в списке. Из кандидатов для переноса исключаются:
    • выключенные ВМ;
    • ВМ, для которых не применяются действия балансировщика;
    • ВМ, к которым подключён ISO-образ;
    • ВМ, для которых были созданы снимки;
    • ВМ, которые были созданы или перемещены на узел в течение пяти последних итераций.
  5. Сортирует список в порядке от наименее загруженной ВМ к наиболее загруженной. Если ВМ для переноса не найдена, поиск повторяется на следующем узле в списке. Если подходящая ВМ не найдена ни на одном узле, перенос выполняться не будет.
  6. Выбирает первую ВМ в списке для переноса.
  7. Определяет узел, на который можно перенести ВМ. При выборе узла учитывается:
    • возможность живой миграции ВМ;
    • станет ли узел перегруженным после переноса ВМ.
  8. Выполняет миграцию ВМ на выбранный узел. Если подходящий узел не найден, для переноса выбирается следующая ВМ в списке. Для этой ВМ повторяется процедура выбора узла. Если ни для одной ВМ не найден подходящий узел, перенос выполняться не будет.
  9. Дожидается окончания миграции ВМ и записывает её результат в таблицу истории.
  10. Планирует запуск следующей итерации через установленный период проверки баланса.

В текущей реализации балансировщик может перенести не более одной ВМ за итерацию.

Управление балансировщиком


Для корректной работы балансировщика включите сбор данных по CPU и RAM с узлов и ВМ в настройках сбора статистики. Подробнее см. в статье Управление статистикой.

Для управления балансировщиком в кластере перейдите в раздел Кластеры → выберите кластер → кнопка Параметры → раздел Балансировщик.

Интерфейс раздела

Включение и отключение

Чтобы включить балансировщик:

  1. Нажмите кнопку Включить балансировщик.

  2. Укажите Периодичность проверки баланса в минутах.

Кластер с включённым балансировщиком отображается в таблице кластеров со значком .

Чтобы отключить балансировщик в кластере, нажмите кнопку Отключить балансировщик.

Чтобы отключить балансировщик для определённой ВМ, перейдите в раздел Виртуальные машины → выберите ВМ → кнопка Параметрыраздел Балансировщик → переключатель Применять Балансировщик к данной VM. ВМ с отключённым балансировщиком отображаются в таблице ВМ со значком .

Изменение настроек

Чтобы изменить пороговые значения CPU и RAM, при превышении которых узел считается перегруженным:

  1. Подключитесь к серверу с платформой по SSH. Подробнее о подключении по SSH см. в статье Настройка рабочего места.

  2. Если на сервере не установлена утилита curl, установите её: 
    dnf install curl || apt install curl
    CODE
  3. Получите токен авторизации:

    curl -k -X POST -H "accept: application/json" -H "Content-Type: application/json" 'https://example.com/api/auth/v4/public/token' -d '{"email": "admin_email", "password": "admin_pass"}'
    CODE

    example.com — доменное имя или IP-адрес сервера с платформой

    admin_email — email администратора платформы

    admin_pass — пароль администратора платформы

    В ответ придёт сообщение вида:

    Пример ответа в JSON

    {
      "confirmed": true,
      "expires_at": null,
      "id": "6",
      "token": "4-e9726dd9-61d9-2940-add3-914851d2cb8a"
    }
    CODE

    Сохраните полученное значение параметра token — токен авторизации.

  4. Выполните API-запрос: 

    curl -k -H "x-xsrf-token: <token>" -X POST "https://domain.com/vm/v3/cluster/<cluster_id>/internal_edit" -d '{"balancer_config": {"high_threshold_cpu": <cpu_value>, "high_threshold_mem": <ram_value>}}'
    BASH

    <token> — токен авторизации

    domain.com — доменное имя или IP-адрес сервера с платформой

    <cluster_id> — id кластера

    <cpu_value> — пороговое значение CPU, %

    <ram_value> — пороговое значени RAM, %

Мониторинг

На вкладке Мониторинг отображаются линейки загрузки CPU и RAM на узлах кластера и индикатор сбалансированности. Чем ближе индикатор находится к центру линейки, тем лучше сбалансирован кластер по CPU или RAM.

Если индикатор находится:

  • в левой части линейки — кластер скорее недозагружен по данному ресурсу;

  • в правой части линейки — кластер скорее перегружен по данному ресурсу.

На величину отклонения индикатора от центра влияет количество перегруженных узлов кластера. Если нагрузка каждого узла кластера находится в пределах порога потребления, то величина отклонения будет минимальной.

Пример перегрузки кластера

Просмотр истории

На вкладке История отображаются действия балансировщика по переносу ВМ между узлами кластера.

Вкладка "История"

Лог-файлы


Действия балансировщика выполняет сервис balancer в контейнере balancer. Лог-файл сервиса — /var/log/balancer.log.

Для выявления проблем в работе балансировщика могут быть полезны логи связанных сервисов:

Сервис

Расположение логов

Назначение

vm_reader

файл /var/log/vm_1_reader.log в контейнере vm_box

получение данных о конфигурации кластеров, узлов и ВМ

statistic

контейнер statistic

получение данных статистики

notifier

контейнер notifier

получение уведомлений об обновлении конфигурации кластеров

отправка уведомлений другим сервисам

carbonapi

контейнер carbonapi

промежуточный сервис для получения статистики узлов и ВМ из сервиса clickhouse

clickhouse

контейнер clickhouse

хранилище собранной статистики