|
| 1 | +# Управление группами хранения в Hive |
| 2 | + |
| 3 | +В данной статье описывается процесс того, как [Hive](../concepts/glossary.md#hive) управляет выдачей [таблеткам](../concepts/glossary.md#tablet) [групп хранения](../concepts/glossary.md#storage-group). При создании таблетки Hive назначает ей группы, и в дальнейшем может их изменить: |
| 4 | + |
| 5 | +* В случае если в группе заканчивается место, таблетки получают об этом сигнал от [прокси](../concpets/glossary.md#ds-proxy) и передают в Hive запрос выдать им другую группу. |
| 6 | +* Перераспределение групп может быть запущено вручную с помощью [Hive web-viewer](../reference/embedded-ui/hive.md#reassign-groups). |
| 7 | +* Автоматический запуск перебалансировки отключён по умолчанию, но может быть настроен при помощи [конфигурации Hive](../reference/configuration/hive.md#storage). |
| 8 | + |
| 9 | +## Выбор группы {#pick-group} |
| 10 | + |
| 11 | +Для каждого из [каналов](../concepts/glossary.md#tablet-channel) таблетки группа выбирается независимо, вполне возможно, что разные каналы одной и той же таблетки пишут в одну и ту же группу. За каждым каналом закреплён [пул хранения](../concepts/glossary.md#storage-pool) и для этого канала могут быть выбраны только группы из этого пула. Пулы хранения не пересекаются между разными базами данных на одном кластере, при этом у одной базы может быть больше одного пула. |
| 12 | + |
| 13 | +Выбор группы внутри пула делается на основе метрик потребления, принцип работы которых описан в следующем разделе. С их помощью для каждой группы-кандидата $i$ определяется значение потребления $0 < \mathrm{usage}_i < 1$. Затем группа выбирается при помощи взвешенной случайности с весами $w_i = \max_j (\mathrm{usage}_j) - \mathrm{usage}_i$. |
| 14 | + |
| 15 | +В случае кончающегося места важно избежать ситуации, при которой таблетки будут постоянно перемещаться между разными группами, в которых не хватает свободного места. Для того, чтобы избежать этого, в этой версии веса дополнительно модифицируются, чтобы пессимизировать группы, где тоже кончается место. А именно если таблетка перевозится с группы $j$, в которой кончается место, то для группы $i$ модифицированный вес вычисляется по формуле: |
| 16 | + |
| 17 | +$$ |
| 18 | +\hat{w_i} = |
| 19 | +\begin{cases} |
| 20 | + 0, & \mathrm{free}_i < \mathrm{free}_j \\ |
| 21 | + \alpha \cdot w_i, & \mathrm{free}_j \le \mathrm{free_i} < \beta \cdot \mathrm{free}_j \\ |
| 22 | + w_i, & \mathrm{free}_i \ge \beta \cdot \mathrm{free}_j |
| 23 | +\end{cases} |
| 24 | +$$ |
| 25 | + |
| 26 | +где $free_g$ — реальное свободное место в группе $g$, $\alpha, \beta$ — константы. По умолчанию $\alpha = 0.2, \beta = 1.1$, эти значения можно настроить как `space_usage_penalty` и `space_usage_penalty_threshold` в [конфигурации Hive](../reference/configuration/hive.md#storage). |
| 27 | + |
| 28 | +## Allocation Units {#allocation-units} |
| 29 | + |
| 30 | +Как и для выбора узла для запуска таблеток, для выбора групп в Hive предусмотрен учёт потребления таблетками ресурсов. Однако поскольку смена группы происходит не бесследно и делается гораздо реже, чем смена вычислительного узла, использовать мгновенные значения потребления было бы нерационально. Вместо этого используется механизм allocation units: при создании таблетки [SchemeShard](../concepts/glossary.md#scheme-shard) выставляет для каждого из каналов ожидаемое потребление ресурсов этим каналом, и Hive в дальнейшем использует эти значения. Allocation unit'ами для различных таблеток можно управлять при помощи секции `channel_profile_config` в конфигурации кластера. Используются три метрики: IOPS, потребление пропускной способности, и потребление дискового пространства. В конфигурации Hive можно настроить учёт какой-либо одной из них или сразу всех. |
| 31 | + |
| 32 | + |
| 33 | +## Процесс переназначения групп {#reassign} |
| 34 | + |
| 35 | +Для безопасной смены группы Hive сначала осуществляет блокировку записи в текущем поколении в системном канале таблетки, и только после этого запускает новое поколение таблетки с новой записью в [истории](general-schema.md#history). |
0 commit comments