Основные понятия

Таблеты

Для каждой таблицы пространство ключей делится набором граничных ключей на непересекающиеся диапазоны — таблеты. Таблеты таблицы перечислены в атрибуте 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.

Предыдущая
Следующая