Основные понятия
Таблеты
Для каждой таблицы пространство ключей делится набором граничных ключей на непересекающиеся диапазоны — таблеты. Таблеты таблицы перечислены в атрибуте tablets
. Каждый таблет описывается структурой TabletInfo
:
Имя | Тип | Описание | Обязательный |
---|---|---|---|
tablet_id | Guid | Id таблета | Да |
statistics | TabletStatistics | Статистика по таблету | Да |
state | String | Состояние (mounted/unmounted/frozen/mounting/unmounting/freezing/unfreezing/frozen_mounting) | Да |
pivot_key | List | Граничный ключ, с которого начинается таблет (только для сортированных таблиц) | Да |
cell_id | Guid | ID селла, к которому примонтирован таблет | Нет |
Пример статистики по таблету
{
"chunk_count" = 1;
"compressed_data_size" = 324;
"disk_space" = 2502;
"disk_space_per_medium" = {
"default" = 2502;
};
"dynamic_memory_pool_size" = 0;
"hunk_compressed_data_size" = 0;
"hunk_uncompressed_data_size" = 0;
"memory_size" = 0;
"overlapping_store_count" = 1;
"partition_count" = 1;
"preload_completed_store_count" = 0;
"preload_failed_store_count" = 0;
"preload_pending_store_count" = 0;
"store_count" = 1;
"tablet_count" = 1;
"tablet_count_per_memory_mode" = {
"none" = 1;
"compressed" = 0;
"uncompressed" = 0;
};
"uncompressed_data_size" = 538;
"unmerged_row_count" = 2;
}
Каждый таблет логически состоит из набора отсортированных чанков с данными и специальной области в памяти, называемой dynamic store
. Чанки хранятся реплицированным образом в blob-хранилище ^[хранилище больших объемов неструктурированных данных] и пересекаются по диапазонам ключей. При записи данные попадают в dynamic store
и накапливаются в нём. При достижении заданных в конфигурации размеров данные записываются на диск в виде чанка. Когда чанков в пределах таблетов становится достаточно много, часть из них объединяется — происходит компактификация. В этот момент может происходить удаление старых и неактуальных данных. Подробнее можно прочитать в разделе Компактификация.
Список всех таблетов всех динамических таблиц системы доступен по пути //sys/tablets
.
Граничные ключи
Для изменения набора таблетов таблицы используется команда reshard_table
. При изменении числа таблетов сортированных динамических таблиц необходимо указывать граничные ключи. Граничные ключи таблетов представляют собой произвольные последовательности значений, не обязательно совпадающие по длине с ключевыми колонками.
В качестве одного из вариантов можно взять хеш некоторых последующих компонент ключа, чтобы равномерно распределить данные по пространству ключей. Тогда в качестве граничных ключей можно взять последовательности длины 1, состоящие из чисел, равномерно разбивающих весь интервал значений хеш-функции.
Граничный ключ первого таблета таблицы всегда равен пустой последовательности — эффективная минус бесконечность — и не может быть изменен.
Партиции
Таблеты в динамических таблицах делятся на партиции для обеспечения параллельности обработки запросов внутри узла кластера. Типичный размер партиции составляет несколько сотен мегабайт. В том случае, если чанки становятся больше, чем размер партиции, запускается фоновый процесс, принудительно разбивающий чанки на более мелкие.
Таблет-селлы
Обслуживание таблетов производится сущностями, называемыми таблет-селлами. Каждый селл — сложный автомат, состояние которого реплицируется с помощью подсистемы Hydra
. На каждом узле кластера имеются так называемые таблет-слоты — виртуальные позиции, на которые могут попадать селлы.
Селлы в кластере создаются администратором при первичной настройке. Суммарное количество селлов должно быть близко к общему числу таблет-слотов на узлах кластера, но с определённым запасом для того, чтобы учесть возможность выхода из строя некоторого числа узлов кластера.
Каждый таблет-селл принадлежит некоторому бандлу. Имя бандла, в котором создается селл, указано в атрибуте tablet_cell_bundle
конкретной таблицы или одной из родительских директорий. По умолчанию таблет-селлы создаются в бандле default
.
Список всех селлов доступен по пути //sys/tablet_cells
. Каждый селл ведет журналы изменений (мутаций), а также периодически записывает снапшоты состояния. Журналы попадают в директорию //sys/tablet_cells/<cell_id>/changelogs
, а снапшоты — в директорию //sys/tablet_cells/<cell_id>/snapshots
в виде файлов.
Выбор конкретного узла кластера и свободного таблет-слота на этом узле для обслуживания таблет-селла производится мастер-сервером автоматически. Если узел кластера, обслуживающий селл, выходит из строя, через некоторое время мастер-сервер выберет свободный слот на другом узле и запустит селл на нём.
Таблет-селлы обладают атрибутами, представленными в таблице:
Имя | Тип | Описание |
---|---|---|
id | Guid | Id селла. |
peers | Dict | Словарь, содержащий имя узла кластера, обслуживающего селл, а также статус селла. |
tablet_cell_bundle | String | Имя таблет-селл бандла, которому принадлежит селл. |
status | Dict | Состояние селла, флаг декомиссии. |
total_statistics | Dict | Различные статистики по таблет-селлу. |
Пример состояния селла
{
"health" = "good";
"decommissioned" = %false;
}
Таблет-селл бандлы
Как правило, селлы создаются группами, имеющими одинаковые настройки. Бандлы необходимы, чтобы объединять селлы по общности настроек. В текущей реализации бандлы представляют собой единственный надежный способ изоляции нагрузки при условии, что бандлы правильным образом разнесены по узлам кластера.
Бандлы идентифицируются строковыми именами. Множество имеющихся в системе бандлов доступно по пути //sys/tablet_cell_bundles
. В системе всегда существует встроенный и неудаляемый бандл с именем default
. Настройки бандла указываются в атрибуте options
при создании, а также могут быть изменены позднее. Изменение настроек в атрибуте options
требует отмонтирования всех таблиц бандла и повторного создания всех селлов.
У каждой таблицы, в том числе статической, есть атрибут tablet_cell_bundle
, где хранится имя бандла, в селлы которого будет смонтирована данная таблица. Подробнее о монтировании можно прочитать в разделе Монтирование таблиц.
У каждого бандла есть атрибут node_tag_filter
, который используется для выбора узлов кластера под таблет-селлы из данного бандла. Фильтр представляет собой логическое выражение с операторами &
— логическое "и", |
— логическое "или", !
— логическое "не" и круглыми скобками.
Например, foo | (bar & !baz)
.
Переменными в выражении являются возможные значения тегов. Если у узла кластера есть указанный тег, то переменная в формуле принимает значение истина
, если нет — ложь
. Таблет-селлы будут попадать только на те узлы кластера, для которых выражение целиком принимает значение истина
.
Таблет-селл бандлы обладают атрибутами, представленными в таблице:
Имя | Тип | Описание |
---|---|---|
name | String | Имя бандла. |
options | TabletCellOptions | Настройки всех таблетов данного бандла. |
tablet_cell_count | Int | Число селлов в бандле. |
tablet_cell_ids* | Guid | Идентификаторы селлов в бандле. |
Состояние бандла, состояние таблет-селлов и список узлов кластера, входящих в бандл отображается на вкладке Tablet cells.
Параметр встречается в ответе несколько раз.