Динамические таблицы

Динамические таблицы — это вид таблиц в YTsaurus, реализующих интерфейс точечного чтения и записи данных по ключу. Они поддерживают транзакции и собственный диалект SQL.

Наличие динамических таблиц добавляет системе YTsaurus возможности типичного key-value storage. Элементарными действиями с такими таблицами являются запись, удаление и чтение строки по ключу. Также возможно выполнение SQL-запросов — для работы с диапазонами строк.

Динамические таблицы поддерживают транзакционность по модели MVCC. Работа с ними не требует общения с мастер-сервером YTsaurus, что даёт дополнительные возможности для масштабирования.

Ближайшими аналогами динамических таблиц можно назвать:

  • Apache HBase — с точки зрения организации хранения данных;
  • Spanner — с точки зрения реализации транзакций;
  • Impala — с точки зрения модели вычисления запросов.

Сходства с перечисленными системами будут описаны далее.

Виды динамических таблиц

Динамические таблицы бывают сортированные и упорядоченные. Помимо этого, для каждого вида таблиц реализован механизм репликации. Подробнее о репликации можно узнать в разделе реплицированные динамические таблицы.

Архитектура

Архитектурно способ хранения динамических таблиц в YTsaurus использует идею Log-structured merge tree. Это делает её похожей на системы BigTable и HBase. Для обеспечения отказоустойчивости и консистентности используется библиотека репликации состояний Hydra (аналог Raft), а для поддержки распределённых транзакций — двухфазный коммит, аналогично системе Google Spanner.

Более подробное описание архитектуры и модели данных приведено в отдельных разделах, посвящённых сортированным и упорядоченным динамическим таблицам.

Атрибуты

Помимо атрибутов, присущих всем таблицам, динамические таблицы имеют ряд уникальных атрибутов. Некоторые из них представлены в таблице:

Имя Тип Описание
chunk_row_count Int Общее количество необъединённых строк во всех чанках таблицы.
tablets* TabletInfo Описание таблетов.
atomicity Atomicity Режим атомарности. По умолчанию full.
in_memory_mode InMemoryMode In-memory-режим для таблиц. По умолчанию none.

Атрибут chunk_row_count может использоваться для оценки размера таблицы, но оценка является приближённой по следующим причинам:

  • в оценке не учтены строки, находящиеся в памяти узлов кластера;
  • строки могут быть учтены несколько раз, пока не произошло объединение чанков;
  • строки могут быть не удалены, но помечены как удалённые или устаревшие.

Отдельные атрибуты динамической таблицы влияют на её поведение. В частности, с помощью отдельных атрибутов можно:

Ограничения

На строки и схему динамической таблицы наложен ряд ограничений по размеру и типу содержимого:

  • количество колонок в динамической таблице не может быть больше 1024, из них не более 32 могут быть ключевыми;
  • максимальная длина значения типа String в динамической таблице — 16 мегабайт.

Кроме того, динамические таблицы наследуют ограничения статических таблиц.

Таблицы, находящиеся в памяти (in-memory)

Доступ к данным, находящимся в оперативной памяти, на порядки быстрее, чем к данным на диске. В системе YTsaurus существует возможность настроить таблицу так, чтобы её данные постоянно находились в памяти. Подобная настройка радикально повышает скорость операций с таблицей. У такого способа имеются ограничения:

  • Объём оперативной памяти на всех узлах кластера ограничен, поэтому рассматриваемой возможностью стоит пользоваться только тогда, когда это действительно необходимо.

  • Любая динамическая сортированная таблица может быть переведена в in-memory режим, а также выведена из данного режима. Для вступления изменений в силу необходимо выполнять remount_table.

  • Использование динамических таблиц, находящихся в памяти, никак не отражается на уровнях изоляции, консистентности, а также отказоустойчивости. Данные таких таблиц в том числе по-прежнему хранятся в чанках распределённого хранилища, in-memory режим лишь означает, что помимо диска данные таблицы также находятся в оперативной памяти.

  • При включении in-memory режима происходит загрузка данных в память узлов кластера. Это может занимать некоторое время.

In-memory режим настраивается с помощью атрибута in_memory_mode для таблицы. Возможные значения атрибута:

Режим In-memory режим Описание
None Отключен Данные таблицы записываются в чанки, а их блоки, сжатые и несжатые, кешируются на общих основаниях. Такой режим подходит для больших таблиц, которые нет возможности зафиксировать в памяти.
Compressed Включен Сжатые данные таблицы — содержимое блоков чанков — постоянно присутствует в памяти, но для обращений на чтение необходимо выполнять распаковку блоков данных. Распакованные блоки кешируются на общих основаниях. Такой режим является хорошим сочетанием по соотношению скорость-объём памяти.
Uncompressed Включен Несжатые данные таблицы постоянно присутствует в памяти, для обращений на чтение нет необходимости ни в дисковых обращениях, ни в распаковке данных. Данный режим дает максимальную производительность ценой оперативной памяти.

Хеш-таблицы для чтения по ключу

Операция чтения по ключу ищет ключи данных таблицы с помощью двоичного поиска. Можно добиться некоторого ускорения, построив предварительно хеш-таблицы для ключей. Для этого необходимо задать атрибут enable_lookup_hash_table = %true для таблицы.

Хеш-таблицы имеет смысл использовать только в режиме uncompressed, в остальных режимах их использование запрещено.

Форматы хранения таблиц

В системе YTsaurus реализовано несколько способов физического хранения данных таблиц в чанках. Выбор между ними управляется атрибутом optimize_for на таблице. Данный атрибут можно изменить на уже существующей таблице, но эффект будет заметен лишь для вновь создаваемых чанков. С учётом компактификации, старые данные тоже могут быть повторно сжаты в фоновом режиме.

Если таблица уже смонтирована, то для донесения до таблетов информации про изменение формата необходимо выполнить команду remount_table.

Возможные значения атрибута optimize_for:

  • lookup — формат, который даёт возможность эффективно читать из таблицы строки по отдельным ключам;
  • scan — формат scan использует поколоночное хранение, а также адаптивные поколоночные алгоритмы сжатия. Вертикальный способ разделения данных хуже подходит для случайных чтений по ключам, так как потребуется читать больше блоков и тратить больше CPU.

Права доступа

На динамические таблицы распространяется система управления доступом:

  • Чтобы читать из динамической таблицы (запросами select_rows, lookup_rows), пользователь должен иметь право read на таблицу.
  • Чтобы писать в динамическую таблицу (командами insert_rows, delete_rows), пользователь должен иметь право write на таблицу.
  • Чтобы выполнять команды mount_table, unmount_table, remount_table и reshard_table, пользователь должен иметь право mountна таблицу.
  • По аналогии с аккаунтами для того чтобы создавать таблицы, привязанные к бандлу, у пользователя должно быть право use на данный бандл. То же правило требуется для того, чтобы изменить бандл у таблицы.

Вебинары:

Предыдущая