Квотирование межкластерной сетевой полосы
Cluster throttlers — это механизм квотирования входящего межкластерного трафика на MR-кластерах YTsaurus. Квотирование затрагивает операции RemoteCopy и операции MapReduce с удалённым чтением входных таблиц.
Подробнее о том, как квотирование влияет на операции пользователей, см. в разделе Квотирование межкластерной сетевой полосы.
Механизм распределённого тротлера
На каждой exec-ноде кластера работает фабрика распределённых тротлеров. Каждый тротлер ограничивает входящий поток данных с конкретного удалённого кластера. Например, тротлер bandwidth_remote на кластере local ограничивает входящий поток с кластера remote.
Среди всех exec-нод gossip-подобным способом выбирается лидер. Лидер:
- Собирает состояние тротлеров со всех
exec-нод. - Ведёт учёт суммарного использования межкластерной полосы.
- Раздаёт
exec-нодам их индивидуальные ограничения. - Отправляет контроллер-агентам информацию о доступности межкластерных полос.
Если лидер недоступен, gossip-подобным способом выбирается новый лидер.
Конфигурация
Конфигурация cluster throttlers хранится в узле //sys/cluster_throttlers дерева метаинформации кластера. Если нужно ограничивать скорость удалённого чтения с внешнего кластера, нужно добавить его в эту конфигурацию.
Поля конфигурации
enabled— включить/выключить квотирование. При значении%falseтротлеры не применяются.update_period— интервал (в мс) опроса узла//sys/cluster_throttlersдля обновления конфигурации.distributed_throttler— настройки распределённого тротлера:limit_update_period— как часто (в мс)exec-нода отправляет своё состояние лидеру и получает от него локальную квоту.leader_update_period— как часто (в мс)exec-нода обновляет информацию о текущем лидере.local_throttlers_attribute_update_period— как часто (в мс) обновляется атрибутlocal_throttlersв сервисе discovery (используется для интроспекции).throttler_expiration_time— время (в мс), после которого лидер считает тротлер неактивным, если от него не поступало обновлений.
cluster_limits— квоты для каждого удалённого кластера (ключ — имя кластера):bandwidth— ограничение на входящую пропускную способность:limit— максимальный поток в байтах в секунду.
rps— ограничение на количество запросов на чтение в секунду:limit— максимальное число запросов в секунду.
Пример конфигурации
{
"enabled" = %true;
"update_period" = 5000;
"distributed_throttler" = {
"leader_update_period" = 5000;
"throttler_expiration_time" = 60000;
"limit_update_period" = 1000;
"local_throttlers_attribute_update_period" = 5000;
};
"cluster_limits" = {
"remote_1" = {
"bandwidth" = {
"limit" = 549755813888; // 512 GB/s
};
};
"remote_2" = {
"bandwidth" = {
"limit" = 4294967296; // 4 GB/s
};
};
};
}
Управление конфигурацией с помощью CLI
Для управления конфигурацией cluster throttlers через CLI выполните следующие шаги:
- Создайте файл конфигурации с нужными настройками (см. пример выше).
- Создайте узел
//sys/cluster_throttlersв дереве метаинформации кластера:yt create document //sys/cluster_throttlers - Запишите конфигурацию в созданный узел:
yt set //sys/cluster_throttlers < config_file
Интроспекция
Состояние тротлеров на нодах
Состояние тротлеров на exec-нодах хранится в группе remote_cluster_throttlers_group сервиса discovery. Каждая нода публикует атрибут local_throttlers со следующими полями:
rate— текущий поток в байтах в секунду.limit— квота в байтах в секунду, выданная лидером данной ноде.queue_byte_size— размер очереди в байтах.quota_exceeded— превышена ли квота.period— период обновления лимитов в миллисекундах.
Чтобы посмотреть состояние тротлеров на кластере local с помощью CLI, можно выполнить следующую команду на кластере local:
yt --proxy local list \
"//sys/discovery_servers/<discovery-server>/orchid/discovery_server/remote_cluster_throttlers_group/@members" \
--attribute local_throttlers --format json | jq -r '.[] | .["$attributes"]["local_throttlers"]'
Команда выведет состояние тротлеров для всех exec-нод кластера в виде:
{
"bandwidth_remote_1": {
"rate": 19324406.5,
"limit": 21496801.3,
"queue_byte_size": 0,
"quota_exceeded": false,
"period": 1000
},
"bandwidth_remote_2": {
"rate": 1832910.1,
"limit": 1935680.6,
"queue_byte_size": 0,
"quota_exceeded": false,
"period": 1000
}
}
Чтобы посмотреть утилизацию сетевого канала на кластере local с кластера remote с помощью CLI, можно выполнить следующую команду на кластере local:
yt --proxy local list \
"//sys/discovery_servers/<discovery-server>/orchid/discovery_server/remote_cluster_throttlers_group/@members" \
--attribute local_throttlers --format json | jq '[.[] | ."$attributes"."local_throttlers"."bandwidth_remote"."rate"] | add'
Проверка лидера
Чтобы убедиться, что в группе тротлинга выбран единственный лидер, выполните команду:
yt list \
"//sys/discovery_servers/<discovery-server>/orchid/discovery_server/remote_cluster_throttlers_group/@members" \
--attribute leader_id --attribute address --format json \
| jq -r '.[] | [.["$attributes"]["leader_id"], .["$attributes"]["address"]] | @tsv' \
| cut -f 1 | sort -u
Если команда выводит более одного уникального leader_id, это означает split-brain — нужно разобраться с причиной (например, сетевая изоляция части нод).