|
| 1 | +# Управление группами хранения в Hive |
| 2 | + |
| 3 | +В данной статье описывается процесс выдачи [таблеткам](../concepts/glossary.md#tablet) [групп хранения](../concepts/glossary.md#storage-group) со стороны [Hive](../concepts/glossary.md#hive). При создании таблетки Hive назначает ей группы и в дальнейшем может их изменить: |
| 4 | + |
| 5 | +* Если в группе заканчивается место, таблетки получают об этом сигнал от [прокси](../concepts/glossary.md#ds-proxy) и передают в Hive запрос выдать им другую группу. |
| 6 | +* При [ручном перераспределении групп](../reference/embedded-ui/hive.md#reassign-groups). |
| 7 | +* При автоматическом перераспределении групп (отключёно по умолчанию в [конфигурации Hive](../reference/configuration/hive.md#storage)). |
| 8 | + |
| 9 | +## Выбор группы {#pick-group} |
| 10 | + |
| 11 | +Для каждого из [каналов](../concepts/glossary.md#channel) таблетки группа выбирается независимо. Разные каналы одной и той же таблетки могут писать в одну и ту же группу. Группы могут быть выбраны только из закреплённого за каналом [пула хранения](../concepts/glossary.md#storage-pool). Пулы хранения не пересекаются между разными базами данных на одном кластере, при этом у одной базы может быть больше одного пула. |
| 12 | + |
| 13 | +Выбор группы внутри пула делается на основе метрик потребления, принцип работы которых описан в [следующем разделе](#allocation-units). С их помощью для каждой группы-кандидата $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 | +где: |
| 27 | + |
| 28 | +* $\mathrm{free}(g)$ — реальное свободное место в группе $g$; |
| 29 | +* $\alpha, \beta$ — константы. По умолчанию $\alpha = 0.2, \beta = 1.1$. Значения можно настроить в [конфигурации Hive](../reference/configuration/hive.md#storage) как `space_usage_penalty` и `space_usage_penalty_threshold` соответственно. |
| 30 | + |
| 31 | +## Единицы аллокации {#allocation-units} |
| 32 | + |
| 33 | +Как и для [выбора узла](hive-booting.md#findbestnode) для запуска таблеток, для выбора групп в Hive предусмотрен учёт различных ресурсов. Однако, смена группы — более редкая операция, поэтому мгновенные значения потребления для неё бы не подошли. Необходимо ещё на этапе создания таблеток предсказать их потребление в долгосрочной перспективе. Для этого используются фиксированные значения: [SchemeShard](../concepts/glossary.md#scheme-shard) выставляет для каждого из каналов [единицу аллокации](../concepts/glossary.md#allocation-unit) — ожидаемое потребление ресурсов этим каналом, и Hive в дальнейшем использует эти значения. Единицами аллокации для различных таблеток можно управлять при помощи секции `channel_profile_config` в конфигурации кластера. Используются метрики: |
| 34 | + |
| 35 | +* IOPS; |
| 36 | +* скорость записи данных; |
| 37 | +* потребление дискового пространства. |
| 38 | + |
| 39 | +В конфигурации Hive можно настроить учёт какой-либо одной из них или сразу всех. |
| 40 | + |
| 41 | + |
| 42 | +## Процесс переназначения групп {#reassign} |
| 43 | + |
| 44 | +Для безопасной смены группы Hive: |
| 45 | + |
| 46 | +* Осуществляет блокировку записи в текущем [поколении](../concepts/glossary.md#tablet-generation) в системном канале таблетки. |
| 47 | +* Запускает новое поколение таблетки с новой записью в [истории](general-schema.md#history). |
0 commit comments