Hive

Hive — таблетка, отвечающая за управление другими таблетками, а именно за выбор узлов базы для их запуска, принятие решений о необходимости перебалансировки таблеток и т.п.

Создание и удаление таблеток инициируется таблеткой SchemeShard. При создании таблетки Hive присваивает ей уникальный TabletId, заполняет TabletStorageInfo, выбирает наиболее подходящий узел и отправляет на него команду на запуск таблетки. В некоторых нестандартных ситуациях отдельная таблетка может прервать работу, тогда узел, на котором она была запущена, отправляет сообщение в Hive. Также Hive предполагает, что если связь с некоторым узлом потеряна, то запущенные на нём таблетки прекратили работу. В таких случаях Hive перезапускает таблетки на других узлах с увеличением поколения.

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

Метрики потребления ресурсов

Для распределения таблеток по узлам Hive учитывает потребление ресурсов. Для каждой таблетки отслеживается потребление четырёх типов ресурсов:

  1. CPU — потребление процессора, рассчитывается как число микросекунд, затраченных на работу таблетки за последнюю секунду, и для визуализации переводится в проценты ядра.
  2. Memory — потребление таблеткой оперативной памяти.
  3. Network — генерируемый таблеткой объём трафика.
  4. Counter — фиктивный ресурс, используемый для реализации равномерного распределения в штуках. Если у таблетки ненулевое значение потребления любого другого ресурса, то её значение Counter равно 0, иначе оно равно 1. Таким образом, Counter применяется для любых таблеток, для которых нет данных о реальном потреблении, а также для таблеток, для которых учёт реального потребления отключён: по умолчанию это только таблетки колоночных таблиц.

Дополнительно для определения перегруженных узлов используются метрики потребления ресурсов узла целиком: потребление оперативной памяти и ресурсов процессора в пулах акторной системы. Эти значения переводятся в относительную величину (число от 0 до 1), и их максимум используется как значение общего потребления ресурсов узла — Node usage. Также для всех метрик на стороне Hive применяется агрегация по окну, чтобы учитывать всплески нагрузки.

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

Автобалансировка

В определённые моменты Hive может запустить процесс автобалансировки, перемещающий таблетки между узлами для улучшения распределения нагрузки. Ситуации, в которых это происходит, перечислены ниже. Автобалансировщик работает итеративо, принимая решения о перевозе таблеток последовательно и по одной. Он выбирает самый загруженный узел, взвешенно-случайным образом выбирает на нём таблетку и находит для неё более подходящий узел. Этот процесс повторяется, пока сбалансированность не будет восстановлена. То, как именно определяется загруженность узла, зависит от типа балансировки: например, при дисбалансе потребления CPU учитывается потребление CPU, а при неравномерном распределении колоночной таблицы — количество таблеток.

Дисбаланс потребления ресурсов

Для оценки сбалансированности потребления используется метрика Scatter, вычисляемая отдельно для каждого ресурса по формуле:

Scatter=MaxUsageMinUsageMaxUsage\mathrm{Scatter} = \frac{\mathrm{MaxUsage} - \mathrm{MinUsage}}{\mathrm{MaxUsage}}

MaxUsage\mathrm{MaxUsage} и MinUsage\mathrm{MinUsage} — максимум и минимум потребления данного ресурса среди всех узлов, соответственно. Для нормировки потребления на каждом узле используется число доступных ресурсов на узле, которое может различаться между узлами. При низких нагрузках эта величина может сильно колебаться. Чтобы этого избежать, при вычислении Scatter\mathrm{Scatter} считается, что потребление ресурса не может быть ниже 30%. Если ScatterScatter превышает порог, запускается балансировка.

Максимальное из значений ScatterScatter по разным ресурсам доступно в виде сенсора Hive/MAX(BalanceScatter) в подгруппе tablets.

Перегруженность узла

Наличие сильно загруженного узла может негативно сказываться на работе YDB: загруженность по CPU приводит к голоданию и увеличению задержки, а загруженность по памяти может привести к падению узла по out-of-memory. Балансировка запускается, если загрузка самого загруженного узла превышает 90%, а наименее загруженного — ниже 70%.

Максимальное потребление на узле доступно в виде сенсора Hive/MAX(BalanceScatter) в подгруппе tablets.

Равномерное распределение конкретного объекта

Для таблеток, которые используют ресурс Counter, также отслеживается равномерность распределения таблеток каждого объекта (каждой таблицы) с помощью метрики ObjectImbalance, аналогичной описанной выше ScatterScatter. При рестартах узлов равномерность может нарушаться, и тогда запускается балансировка.

Максимальное из значений ObjectImbalance по разным объектам доступно в виде сенсора Hive/MAX(BalanceObjectImbalance) в подгруппе tablets.