Динамические таблицы
Динамические таблицы — это вид таблиц в 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
может использоваться для оценки размера таблицы, но оценка является приближённой по следующим причинам:
- в оценке не учтены строки, находящиеся в памяти узлов кластера;
- строки могут быть учтены несколько раз, пока не произошло объединение чанков;
- строки могут быть не удалены, но помечены как удалённые или устаревшие.
Отдельные атрибуты динамической таблицы влияют на её поведение. В частности, с помощью отдельных атрибутов можно:
- настраивать фоновую компактификацию;
- устанавливать TTL — время жизни отдельных значений;
- управлять автоматическим шардированием.
Ограничения
На строки и схему динамической таблицы наложен ряд ограничений по размеру и типу содержимого:
- количество колонок в динамической таблице не может быть больше 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
на данный бандл. То же правило требуется для того, чтобы изменить бандл у таблицы.
Полезные материалы
Вебинары:
Параметр встречается в ответе несколько раз.