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

ОграниченияLink to Ограничения


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

  • в версии VMmanager Infrastructure;

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

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

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


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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

Чтобы изменить пороговые значения 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, %

МониторингLink to Мониторинг

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

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

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

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

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

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

Просмотр историиLink to Просмотр истории

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

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

Лог-файлыLink to Лог-файлы


Действия балансировщика выполняет сервис 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

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