From f1402406d9c1c32a39d53ced13c0064155db471c Mon Sep 17 00:00:00 2001 From: Alexander Zalyalov Date: Fri, 2 Aug 2024 07:56:52 +0000 Subject: [PATCH 1/5] dirty commit --- .../ru/core/contributor/general-schema.md | 6 ++-- ydb/docs/ru/core/contributor/hive.md | 36 +++++++++++++++++++ ydb/docs/ru/core/contributor/toc_i.yaml | 2 ++ 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 ydb/docs/ru/core/contributor/hive.md diff --git a/ydb/docs/ru/core/contributor/general-schema.md b/ydb/docs/ru/core/contributor/general-schema.md index 3a20140e9d01..2bd49086f3de 100644 --- a/ydb/docs/ru/core/contributor/general-schema.md +++ b/ydb/docs/ru/core/contributor/general-schema.md @@ -21,6 +21,8 @@ На каждом узле выполняются специальные микросервисы, которые называются *таблетками*. Каждая таблетка имеет определённый тип и идентификатор и является singleton'ом, что означает, что в каждый момент времени во всём кластере может работать только одна таблетка с конкретным идентификатором. Таблетка может запускаться на любом из подходящих для неё узлов. Важной характеристикой таблетки является её поколение — *Generation* — которое увеличивается при каждом следующем запуске. Стоит отметить, что в силу распределённости системы и наличия различного рода проблем, например, сетевого партиционирования, может сложиться ситуация, когда одна и та же таблетка будет фактически выполняться на двух разных узлах одновременно. Однако distributed storage гарантирует, что только одна из них сможет успешно завершить операции, изменяющие её состояние, и при этом поколение, в котором выполнена каждая успешная операция, не будет убывать со временем. +Для системных таблеток кластера узел, на котором запускается таблетка, выбирается с помощью механизма Bootstrapper, реализующего [распределённый консенсус](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%81%D0%B5%D0%BD%D1%81%D1%83%D1%81_%D0%B2_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D1%85_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%D1%85). Пользовательскими таблетками управляет специальная таблетка [Hive](../../hive.md). Hive следит за тем, что акутальное поколение каждой таблетки запущено ровно на одном узле, распределяет таблетки между узлами и каналы таблеток между группами хранения. + Узнать, на каком узле выполняется таблетка в актуальном поколении, можно через сервис *StateStorage*. Для отправки сообщений в таблетку существует специальный набор библиотек, который называется *tablet pipe*. С его помощью, зная идентификатор целевой таблетки, можно легко послать ей нужное сообщение. Таблетку можно условно разделить на две части: базовая таблетка и пользовательская логика. @@ -45,7 +47,7 @@ ### История каналов в таблетке {#history} -Как уже говорилось, каждая группа имеет фиксированный объём данных, которые в неё могут помещаться, а также делит полосу пропускания и число операций в секунду между всеми потребителями. Нагрузка на таблетки может меняться, и в результате может сложиться так, что группа станет перегруженной. Для этого вводится понятие истории, которое позволяет для каждой таблетки, зная Channel и Generation блоба, определить, в какую группу записан данный блоб. +Как уже говорилось, каждая группа имеет фиксированный объём данных, которые в неё могут помещаться, а также делит полосу пропускания и число операций в секунду между всеми потребителями. Нагрузка на таблетки может меняться, и в результате может сложиться так, что группа станет перегруженной и возникнет необходимость использовать для записи другую группу. Для этого вводится понятие истории, которое позволяет для каждой таблетки, зная Channel и Generation блоба, определить, в какую группу записан данный блоб. Иллюстрация работы этого механизма приведена ниже: @@ -53,4 +55,4 @@ Для каждого канала в структуре TTabletStorageInfo содержится подструктура TTabletChannelInfo, которая содержит диапазоны поколений и номер группы, соответствующий каждому диапазону. Диапазоны строго примыкают друг к другу, последний диапазон открыт. Номера групп могут пересекаться в разных диапазонах и даже между разными каналами — это не запрещено и достаточно часто встречается. -При выполнении записи блоба таблетка выбирает самый последний диапазон для соответствующего канала, так как запись всегда идёт от имени текущего поколения таблетки. При выполнении чтения номер группы извлекается исходя из BlobId.Generation читаемого блоба. \ No newline at end of file +При выполнении записи блоба таблетка выбирает самый последний диапазон для соответствующего канала, так как запись всегда идёт от имени текущего поколения таблетки. При выполнении чтения номер группы извлекается исходя из BlobId.Generation читаемого блоба. diff --git a/ydb/docs/ru/core/contributor/hive.md b/ydb/docs/ru/core/contributor/hive.md new file mode 100644 index 000000000000..0d7b13ec222b --- /dev/null +++ b/ydb/docs/ru/core/contributor/hive.md @@ -0,0 +1,36 @@ +# Hive + +Hive — таблетка, отвечающая за управление другими таблетками. В кластере {{ ydb-short-name }} есть корневой Hive, который отвечает за системные таблетки всех баз данных кластера. Hive конкретной базы данных в свою очередь отвечает за таблетки, обслуживающие пользовательскую нагрузку этой базы данных. Все узлы кластера регистрируются в корневом Hive, а в Hive конкретной базы регистрируются только вычислительные узлы этой базы. При регистрации узел сообщает в Hive, таблетки каких типов и в каких количествах могут быть на нём запущены. + +Создание и удаление таблеток инициируется таблеткой SchemeShard. При создании таблетки Hive присваивает ей уникальный TabletId, заполняет [TabletStorageInfo](../../common_scheme_ydb.md#history), выбирает наиболее подходящий узел и отправляет на него команду поднять таблетку. В некоторых нестандартных ситуациях отдельная таблетка может прервать работу, тогда узел, на котором она была запущена, отправляет сообщение в Hive. Также Hive предполагает, что если связь с некоторым узлом потеряна, то запущенные на нём таблетки прекратили работу. В таких ситуациях Hive запускает таблетки на других узалах с увеличением поколения. + +## Метрики потребления ресурсов + +Для распределения таблеток по узлам Hive учитывает потребление ресурсов. Для каждой таблетки учитываются потребления 4 ресурсов: + +1. *CPU* — потребление процессора, считается как число микросекунд, потраченных на работу таблетки за последнюю секунду и для визуализации переводится в проценты ядра. +1. *Memory* — потребление таблеткой оперативной памяти. +1. *Network* — генерируемый таблеткой объём траффика. Подсчёт этого ресурса поддержан не во всех типах таблеток. +1. *Counter* — фиктивный ресурс, используемый для реализации равномерного распределения в штуках. Применяется для любых таблеток, для которых нет данных по трём другим ресурсам, а также для таблеток колоночных таблиц. Если у таблетки есть этот ресурс, то его значение всегда равно 1. + +Дополнительно для определения перегруженных узлов используются метрики потребления ресурсов узла целиком: потребление оперативной памяти, и ресурсов процессора в пулах акторной системы. Эти значения переводятся в относительную величину (число от 0 до 1), и их максимум используется как значение общего потребления ресурсов узла *Node usage*. Также для всех метрик на стороне Hive используется аггрегация на окне, чтобы учитывать всплески нагрузки. + +## Автобалансировка + +В определённые моменты Hive может запустить процесс автобалансировки, перемещающий таблетки между узлами для улучшения распределения нагрузки. Далее перечислены ситуации, в которых это происходит. + +### Дисбаланс потребления ресурсов + +Для оценки сбалансированности потребления используется метрика *Scatter*, вычисляемая отдельно для каждого ресурса по формуле + +$$\mathrm{Scatter} = \frac{\mathrm{MaxUsage} - \mathrm{MinUsage}}{\mathrm{MaxUsage}},$$ + +где $\mathrm{MaxUsage}$ и $\mathrm{MinUsage}$ — соответственно максимум и минимум по потреблению данного ресурса среди всех узлов. Для нормировки потребления на каждом узле используется число доступных ресурсов на узле, которое может различаться между узлами. При низких нагрузках эта величина может сильно колебаться. Чтобы этого избежать, при вычислении $\mathrm{Scatter}$ считается, что потребление ресурса не может быть ниже 30%. Если Scatter превышает порог, запускается балансировка. + +### Перегруженность узла + +Наличие сильно загруженного узла может негативно сказываться на работе {{ ydb-short-name }}: загруженность по CPU приводит к голоданию и увеличению задержки, а загруженность по памяти может привести к падению узла по out-of-memory. Балансировка запускается, если самый загруженный узел имеет загрузку больше 90%, а наименее загруженный — меньше 70%. + +### Равномерное распределение конкретного объекта + +Для таблеток, которые используют ресурс Counter, также отслеживается равномерность распределения таблеток каждого объекта (каждой таблицы), с помощью метрики *ObjectImbalance*, аналогичной описанной выше Scatter. При рестартах узлов равномерность может нарушаться, и тогда запускается балансировка. diff --git a/ydb/docs/ru/core/contributor/toc_i.yaml b/ydb/docs/ru/core/contributor/toc_i.yaml index 91c72cb3dd1f..bc77449a6a6f 100644 --- a/ydb/docs/ru/core/contributor/toc_i.yaml +++ b/ydb/docs/ru/core/contributor/toc_i.yaml @@ -15,6 +15,8 @@ items: items: - name: Персистентные незакомиченные изменения href: localdb-uncommitted-txs.md + - name: Hive + href: hive.md - name: DataShard items: - name: Локи и видимость изменений в транзакциях From bcb346571f2e077b3f4e5200ef0cd092b1e3507e Mon Sep 17 00:00:00 2001 From: Alexander Zalyalov Date: Fri, 29 Nov 2024 08:44:03 +0000 Subject: [PATCH 2/5] fix links --- ydb/docs/ru/core/contributor/general-schema.md | 2 +- ydb/docs/ru/core/contributor/hive.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ydb/docs/ru/core/contributor/general-schema.md b/ydb/docs/ru/core/contributor/general-schema.md index 2bd49086f3de..7d805ed491b1 100644 --- a/ydb/docs/ru/core/contributor/general-schema.md +++ b/ydb/docs/ru/core/contributor/general-schema.md @@ -21,7 +21,7 @@ На каждом узле выполняются специальные микросервисы, которые называются *таблетками*. Каждая таблетка имеет определённый тип и идентификатор и является singleton'ом, что означает, что в каждый момент времени во всём кластере может работать только одна таблетка с конкретным идентификатором. Таблетка может запускаться на любом из подходящих для неё узлов. Важной характеристикой таблетки является её поколение — *Generation* — которое увеличивается при каждом следующем запуске. Стоит отметить, что в силу распределённости системы и наличия различного рода проблем, например, сетевого партиционирования, может сложиться ситуация, когда одна и та же таблетка будет фактически выполняться на двух разных узлах одновременно. Однако distributed storage гарантирует, что только одна из них сможет успешно завершить операции, изменяющие её состояние, и при этом поколение, в котором выполнена каждая успешная операция, не будет убывать со временем. -Для системных таблеток кластера узел, на котором запускается таблетка, выбирается с помощью механизма Bootstrapper, реализующего [распределённый консенсус](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%81%D0%B5%D0%BD%D1%81%D1%83%D1%81_%D0%B2_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D1%85_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%D1%85). Пользовательскими таблетками управляет специальная таблетка [Hive](../../hive.md). Hive следит за тем, что акутальное поколение каждой таблетки запущено ровно на одном узле, распределяет таблетки между узлами и каналы таблеток между группами хранения. +Для системных таблеток кластера узел, на котором запускается таблетка, выбирается с помощью механизма Bootstrapper, реализующего [распределённый консенсус](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%81%D0%B5%D0%BD%D1%81%D1%83%D1%81_%D0%B2_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D1%85_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%D1%85). Пользовательскими таблетками управляет специальная таблетка [Hive](hive.md). Hive следит за тем, что акутальное поколение каждой таблетки запущено ровно на одном узле, распределяет таблетки между узлами и каналы таблеток между группами хранения. Узнать, на каком узле выполняется таблетка в актуальном поколении, можно через сервис *StateStorage*. Для отправки сообщений в таблетку существует специальный набор библиотек, который называется *tablet pipe*. С его помощью, зная идентификатор целевой таблетки, можно легко послать ей нужное сообщение. diff --git a/ydb/docs/ru/core/contributor/hive.md b/ydb/docs/ru/core/contributor/hive.md index 0d7b13ec222b..0682b6278010 100644 --- a/ydb/docs/ru/core/contributor/hive.md +++ b/ydb/docs/ru/core/contributor/hive.md @@ -2,7 +2,7 @@ Hive — таблетка, отвечающая за управление другими таблетками. В кластере {{ ydb-short-name }} есть корневой Hive, который отвечает за системные таблетки всех баз данных кластера. Hive конкретной базы данных в свою очередь отвечает за таблетки, обслуживающие пользовательскую нагрузку этой базы данных. Все узлы кластера регистрируются в корневом Hive, а в Hive конкретной базы регистрируются только вычислительные узлы этой базы. При регистрации узел сообщает в Hive, таблетки каких типов и в каких количествах могут быть на нём запущены. -Создание и удаление таблеток инициируется таблеткой SchemeShard. При создании таблетки Hive присваивает ей уникальный TabletId, заполняет [TabletStorageInfo](../../common_scheme_ydb.md#history), выбирает наиболее подходящий узел и отправляет на него команду поднять таблетку. В некоторых нестандартных ситуациях отдельная таблетка может прервать работу, тогда узел, на котором она была запущена, отправляет сообщение в Hive. Также Hive предполагает, что если связь с некоторым узлом потеряна, то запущенные на нём таблетки прекратили работу. В таких ситуациях Hive запускает таблетки на других узалах с увеличением поколения. +Создание и удаление таблеток инициируется таблеткой SchemeShard. При создании таблетки Hive присваивает ей уникальный TabletId, заполняет [TabletStorageInfo](general-schema.md#history), выбирает наиболее подходящий узел и отправляет на него команду поднять таблетку. В некоторых нестандартных ситуациях отдельная таблетка может прервать работу, тогда узел, на котором она была запущена, отправляет сообщение в Hive. Также Hive предполагает, что если связь с некоторым узлом потеряна, то запущенные на нём таблетки прекратили работу. В таких ситуациях Hive запускает таблетки на других узалах с увеличением поколения. ## Метрики потребления ресурсов From 08c99a8029019ba839b5b53f9189f7756525b8f5 Mon Sep 17 00:00:00 2001 From: Alexander Zalyalov Date: Thu, 26 Dec 2024 11:21:33 +0000 Subject: [PATCH 3/5] review --- ydb/docs/ru/core/concepts/glossary.md | 6 +++--- ydb/docs/ru/core/contributor/general-schema.md | 4 ++-- ydb/docs/ru/core/contributor/hive.md | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ydb/docs/ru/core/concepts/glossary.md b/ydb/docs/ru/core/concepts/glossary.md index 9b5a12385ff6..ce95d966ccba 100644 --- a/ydb/docs/ru/core/concepts/glossary.md +++ b/ydb/docs/ru/core/concepts/glossary.md @@ -355,11 +355,11 @@ ### Типы таблеток {#tablet-types} -[Таблетки](#tablet) можно рассматривать как фреймворк для создания надёжных компонентов, работающих в распределённой системе. Многие компоненты {{ ydb-short-name }} реализованы с использованием этого фреймворка, они перечислены ниже. +[Таблетки](#tablet) можно рассматривать как фреймворк для создания надёжных компонентов, работающих в распределённой системе. Многие компоненты {{ ydb-short-name }} — как системные, так и работающие с пользовательскими данными — реализованы с использованием этого фреймворка, основные из них перечислены ниже. #### Scheme shard {#scheme-shard} -**Scheme shard** или **SchemeShard** — это таблетка, которая хранит схему базы данных, включая метаданные пользовательских [таблиц](#table), [топиков](#topic) и т.д. +**Scheme shard** или **SchemeShard** — это системная таблетка, которая хранит схему базы данных, включая метаданные пользовательских [таблиц](#table), [топиков](#topic) и т.д. Кроме того, существует **корневой scheme shard**, который хранит информацию о базах данных, созданных в кластере. @@ -589,4 +589,4 @@ MiniKQL — это язык низкого уровня. Конечные пол ### KiKiMR {#kikimr} -**KiKiMR** — это устаревшее название {{ ydb-short-name }}, использовавшееся до того, как он стал [продуктом с открытым исходным кодом](https://github.com/ydb-platform/ydb) (open source). Оно всё ещё может встречаться в исходном коде, старых статьях и видео и т.д. \ No newline at end of file +**KiKiMR** — это устаревшее название {{ ydb-short-name }}, использовавшееся до того, как он стал [продуктом с открытым исходным кодом](https://github.com/ydb-platform/ydb) (open source). Оно всё ещё может встречаться в исходном коде, старых статьях и видео и т.д. diff --git a/ydb/docs/ru/core/contributor/general-schema.md b/ydb/docs/ru/core/contributor/general-schema.md index 7d805ed491b1..36a888b749ba 100644 --- a/ydb/docs/ru/core/contributor/general-schema.md +++ b/ydb/docs/ru/core/contributor/general-schema.md @@ -19,9 +19,9 @@ ## Таблетки {#tablets} -На каждом узле выполняются специальные микросервисы, которые называются *таблетками*. Каждая таблетка имеет определённый тип и идентификатор и является singleton'ом, что означает, что в каждый момент времени во всём кластере может работать только одна таблетка с конкретным идентификатором. Таблетка может запускаться на любом из подходящих для неё узлов. Важной характеристикой таблетки является её поколение — *Generation* — которое увеличивается при каждом следующем запуске. Стоит отметить, что в силу распределённости системы и наличия различного рода проблем, например, сетевого партиционирования, может сложиться ситуация, когда одна и та же таблетка будет фактически выполняться на двух разных узлах одновременно. Однако distributed storage гарантирует, что только одна из них сможет успешно завершить операции, изменяющие её состояние, и при этом поколение, в котором выполнена каждая успешная операция, не будет убывать со временем. +На каждом узле выполняются специальные микросервисы, которые называются [таблетками](../concepts/glossary.md#tablet). Каждая таблетка имеет определённый тип и идентификатор и является singleton'ом, что означает, что в каждый момент времени во всём кластере может работать только одна таблетка с конкретным идентификатором. Таблетка может запускаться на любом из подходящих для неё узлов. Важной характеристикой таблетки является её поколение — [Generation](../concepts/glossary.md#tablet-generation) — которое увеличивается при каждом следующем запуске. Стоит отметить, что в силу распределённости системы и наличия различного рода проблем, например, сетевого партиционирования, может сложиться ситуация, когда одна и та же таблетка будет фактически выполняться на двух разных узлах одновременно. Однако distributed storage гарантирует, что только одна из них сможет успешно завершить операции, изменяющие её состояние, и при этом поколение, в котором выполнена каждая успешная операция, не будет убывать со временем. -Для системных таблеток кластера узел, на котором запускается таблетка, выбирается с помощью механизма Bootstrapper, реализующего [распределённый консенсус](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%81%D0%B5%D0%BD%D1%81%D1%83%D1%81_%D0%B2_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D1%85_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%D1%85). Пользовательскими таблетками управляет специальная таблетка [Hive](hive.md). Hive следит за тем, что акутальное поколение каждой таблетки запущено ровно на одном узле, распределяет таблетки между узлами и каналы таблеток между группами хранения. +Для [системных таблеток](../concepts/glossary.md#tablet-types) кластера узел, на котором запускается таблетка, выбирается с помощью механизма Bootstrapper, реализующего [распределённый консенсус](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%81%D0%B5%D0%BD%D1%81%D1%83%D1%81_%D0%B2_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D1%85_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%D1%85). Пользовательскими таблетками управляет специальная таблетка [Hive](hive.md). Hive следит за тем, что акутальное поколение каждой таблетки запущено ровно на одном узле, распределяет таблетки между узлами и [каналы](../concepts/glossary.md#channel) таблеток между группами хранения. Узнать, на каком узле выполняется таблетка в актуальном поколении, можно через сервис *StateStorage*. Для отправки сообщений в таблетку существует специальный набор библиотек, который называется *tablet pipe*. С его помощью, зная идентификатор целевой таблетки, можно легко послать ей нужное сообщение. diff --git a/ydb/docs/ru/core/contributor/hive.md b/ydb/docs/ru/core/contributor/hive.md index 0682b6278010..8f886e18dd74 100644 --- a/ydb/docs/ru/core/contributor/hive.md +++ b/ydb/docs/ru/core/contributor/hive.md @@ -1,8 +1,8 @@ # Hive -Hive — таблетка, отвечающая за управление другими таблетками. В кластере {{ ydb-short-name }} есть корневой Hive, который отвечает за системные таблетки всех баз данных кластера. Hive конкретной базы данных в свою очередь отвечает за таблетки, обслуживающие пользовательскую нагрузку этой базы данных. Все узлы кластера регистрируются в корневом Hive, а в Hive конкретной базы регистрируются только вычислительные узлы этой базы. При регистрации узел сообщает в Hive, таблетки каких типов и в каких количествах могут быть на нём запущены. +Hive — таблетка, отвечающая за управление другими таблетками. В кластере {{ ydb-short-name }} есть корневой Hive, который отвечает за [системные таблетки](../concepts/glossary.md#tablet-types) всех баз данных кластера. Hive конкретной базы данных в свою очередь отвечает за таблетки, обслуживающие пользовательскую нагрузку этой базы данных. Все узлы кластера регистрируются в корневом Hive, а в Hive конкретной базы регистрируются только вычислительные узлы этой базы. При регистрации узел сообщает в Hive, таблетки каких типов и в каких количествах могут быть на нём запущены. -Создание и удаление таблеток инициируется таблеткой SchemeShard. При создании таблетки Hive присваивает ей уникальный TabletId, заполняет [TabletStorageInfo](general-schema.md#history), выбирает наиболее подходящий узел и отправляет на него команду поднять таблетку. В некоторых нестандартных ситуациях отдельная таблетка может прервать работу, тогда узел, на котором она была запущена, отправляет сообщение в Hive. Также Hive предполагает, что если связь с некоторым узлом потеряна, то запущенные на нём таблетки прекратили работу. В таких ситуациях Hive запускает таблетки на других узалах с увеличением поколения. +Создание и удаление таблеток инициируется таблеткой [SchemeShard](../concepts/glossary.md#scheme-shard). При создании таблетки Hive присваивает ей уникальный TabletId, заполняет [TabletStorageInfo](general-schema.md#history), выбирает наиболее подходящий узел и отправляет на него команду поднять таблетку. В некоторых нестандартных ситуациях отдельная таблетка может прервать работу, тогда узел, на котором она была запущена, отправляет сообщение в Hive. Также Hive предполагает, что если связь с некоторым узлом потеряна, то запущенные на нём таблетки прекратили работу. В таких ситуациях Hive запускает таблетки на других узалах с увеличением поколения. ## Метрики потребления ресурсов @@ -10,7 +10,7 @@ Hive — таблетка, отвечающая за управление дру 1. *CPU* — потребление процессора, считается как число микросекунд, потраченных на работу таблетки за последнюю секунду и для визуализации переводится в проценты ядра. 1. *Memory* — потребление таблеткой оперативной памяти. -1. *Network* — генерируемый таблеткой объём траффика. Подсчёт этого ресурса поддержан не во всех типах таблеток. +1. *Network* — генерируемый таблеткой объём трафика. 1. *Counter* — фиктивный ресурс, используемый для реализации равномерного распределения в штуках. Применяется для любых таблеток, для которых нет данных по трём другим ресурсам, а также для таблеток колоночных таблиц. Если у таблетки есть этот ресурс, то его значение всегда равно 1. Дополнительно для определения перегруженных узлов используются метрики потребления ресурсов узла целиком: потребление оперативной памяти, и ресурсов процессора в пулах акторной системы. Эти значения переводятся в относительную величину (число от 0 до 1), и их максимум используется как значение общего потребления ресурсов узла *Node usage*. Также для всех метрик на стороне Hive используется аггрегация на окне, чтобы учитывать всплески нагрузки. @@ -21,7 +21,7 @@ Hive — таблетка, отвечающая за управление дру ### Дисбаланс потребления ресурсов -Для оценки сбалансированности потребления используется метрика *Scatter*, вычисляемая отдельно для каждого ресурса по формуле +Для оценки сбалансированности потребления используется метрика *Scatter*, вычисляемая отдельно для каждого ресурса по формуле: $$\mathrm{Scatter} = \frac{\mathrm{MaxUsage} - \mathrm{MinUsage}}{\mathrm{MaxUsage}},$$ From 9a30689a27d19f4e47ee0acec761853142299527 Mon Sep 17 00:00:00 2001 From: Alexander Zalyalov Date: Thu, 9 Jan 2025 12:00:04 +0000 Subject: [PATCH 4/5] review --- ydb/docs/ru/core/contributor/general-schema.md | 2 +- ydb/docs/ru/core/contributor/hive.md | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ydb/docs/ru/core/contributor/general-schema.md b/ydb/docs/ru/core/contributor/general-schema.md index 36a888b749ba..7214b6a1f963 100644 --- a/ydb/docs/ru/core/contributor/general-schema.md +++ b/ydb/docs/ru/core/contributor/general-schema.md @@ -21,7 +21,7 @@ На каждом узле выполняются специальные микросервисы, которые называются [таблетками](../concepts/glossary.md#tablet). Каждая таблетка имеет определённый тип и идентификатор и является singleton'ом, что означает, что в каждый момент времени во всём кластере может работать только одна таблетка с конкретным идентификатором. Таблетка может запускаться на любом из подходящих для неё узлов. Важной характеристикой таблетки является её поколение — [Generation](../concepts/glossary.md#tablet-generation) — которое увеличивается при каждом следующем запуске. Стоит отметить, что в силу распределённости системы и наличия различного рода проблем, например, сетевого партиционирования, может сложиться ситуация, когда одна и та же таблетка будет фактически выполняться на двух разных узлах одновременно. Однако distributed storage гарантирует, что только одна из них сможет успешно завершить операции, изменяющие её состояние, и при этом поколение, в котором выполнена каждая успешная операция, не будет убывать со временем. -Для [системных таблеток](../concepts/glossary.md#tablet-types) кластера узел, на котором запускается таблетка, выбирается с помощью механизма Bootstrapper, реализующего [распределённый консенсус](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%81%D0%B5%D0%BD%D1%81%D1%83%D1%81_%D0%B2_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D1%85_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%D1%85). Пользовательскими таблетками управляет специальная таблетка [Hive](hive.md). Hive следит за тем, что акутальное поколение каждой таблетки запущено ровно на одном узле, распределяет таблетки между узлами и [каналы](../concepts/glossary.md#channel) таблеток между группами хранения. +Для [системных таблеток](../concepts/glossary.md#tablet-types) кластера узел, на котором запускается таблетка, выбирается с помощью механизма Bootstrapper, реализующего [распределённый консенсус](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%81%D0%B5%D0%BD%D1%81%D1%83%D1%81_%D0%B2_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D1%85_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%D1%85). Пользовательскими таблетками управляет специальная таблетка [Hive](hive.md). Hive следит за тем, что все таблетки запущены, распределяет таблетки между узлами и [каналы](../concepts/glossary.md#channel) таблеток между группами хранения. Узнать, на каком узле выполняется таблетка в актуальном поколении, можно через сервис *StateStorage*. Для отправки сообщений в таблетку существует специальный набор библиотек, который называется *tablet pipe*. С его помощью, зная идентификатор целевой таблетки, можно легко послать ей нужное сообщение. diff --git a/ydb/docs/ru/core/contributor/hive.md b/ydb/docs/ru/core/contributor/hive.md index 8f886e18dd74..d632eb1e5b28 100644 --- a/ydb/docs/ru/core/contributor/hive.md +++ b/ydb/docs/ru/core/contributor/hive.md @@ -6,14 +6,14 @@ Hive — таблетка, отвечающая за управление дру ## Метрики потребления ресурсов -Для распределения таблеток по узлам Hive учитывает потребление ресурсов. Для каждой таблетки учитываются потребления 4 ресурсов: +Для распределения таблеток по узлам Hive учитывает потребление ресурсов. Для каждой таблетки учитывается потребление 4 типов ресурсов: 1. *CPU* — потребление процессора, считается как число микросекунд, потраченных на работу таблетки за последнюю секунду и для визуализации переводится в проценты ядра. 1. *Memory* — потребление таблеткой оперативной памяти. 1. *Network* — генерируемый таблеткой объём трафика. -1. *Counter* — фиктивный ресурс, используемый для реализации равномерного распределения в штуках. Применяется для любых таблеток, для которых нет данных по трём другим ресурсам, а также для таблеток колоночных таблиц. Если у таблетки есть этот ресурс, то его значение всегда равно 1. +1. *Counter* — фиктивный ресурс, используемый для реализации равномерного распределения в штуках. Применяется для любых таблеток, для которых нет данных по трём другим ресурсам, а также для таблеток [колоночных таблиц](../concepts/datamodel/table.md#column-oriented-tables). Если у таблетки есть этот ресурс, то его значение всегда равно 1. -Дополнительно для определения перегруженных узлов используются метрики потребления ресурсов узла целиком: потребление оперативной памяти, и ресурсов процессора в пулах акторной системы. Эти значения переводятся в относительную величину (число от 0 до 1), и их максимум используется как значение общего потребления ресурсов узла *Node usage*. Также для всех метрик на стороне Hive используется аггрегация на окне, чтобы учитывать всплески нагрузки. +Дополнительно для определения перегруженных узлов используются метрики потребления ресурсов узла целиком: потребление оперативной памяти, и ресурсов процессора в пулах акторной системы. Эти значения переводятся в относительную величину (число от 0 до 1), и их максимум используется как значение общего потребления ресурсов узла — *Node usage*. Также для всех метрик на стороне Hive используется аггрегация на окне, чтобы учитывать всплески нагрузки. ## Автобалансировка @@ -33,4 +33,4 @@ $$\mathrm{Scatter} = \frac{\mathrm{MaxUsage} - \mathrm{MinUsage}}{\mathrm{MaxUsa ### Равномерное распределение конкретного объекта -Для таблеток, которые используют ресурс Counter, также отслеживается равномерность распределения таблеток каждого объекта (каждой таблицы), с помощью метрики *ObjectImbalance*, аналогичной описанной выше Scatter. При рестартах узлов равномерность может нарушаться, и тогда запускается балансировка. +Для таблеток, которые используют ресурс Counter, также отслеживается равномерность распределения таблеток каждого объекта (каждой таблицы) с помощью метрики *ObjectImbalance*, аналогичной описанной выше Scatter. При рестартах узлов равномерность может нарушаться, и тогда запускается балансировка. From 6d5c75725ad969a0a4bd9bb5ec864c72dc21a200 Mon Sep 17 00:00:00 2001 From: Alexander Zalyalov Date: Mon, 13 Jan 2025 23:32:39 +0000 Subject: [PATCH 5/5] add link to glossary --- ydb/docs/ru/core/concepts/glossary.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ydb/docs/ru/core/concepts/glossary.md b/ydb/docs/ru/core/concepts/glossary.md index ce95d966ccba..963899da2892 100644 --- a/ydb/docs/ru/core/concepts/glossary.md +++ b/ydb/docs/ru/core/concepts/glossary.md @@ -393,7 +393,7 @@ #### Hive {#hive} -**Hive** — это системная таблетка, отвечающая за запуск и управление другими таблетками. Её обязанности включают перемещение таблеток между узлами в случае отказа или перегрузки [узла](#node). +**Hive** — это системная таблетка, отвечающая за запуск и управление другими таблетками. Её обязанности включают перемещение таблеток между узлами в случае отказа или перегрузки [узла](#node). Подробнее о Hive можно узнать в [отдельной статье](../contributor/hive.md). #### Система управления кластером {#cms}