Модель данных | Tcs

Версия:

0.x

Модель данных

Tarantool Column Store использует табличную модель данных, характерную для большинства СУБД, использующих SQL:

  • Данные хранятся в таблицах;

  • Один хранимый объект формирует одну строку таблицы;

  • Структура таблицы определяется набором ее столбцов – колонок;

  • Каждая колонка содержит данные одного типа.

Список поддерживаемых типов данных приведен в разделе Типы данных.

Для логической организации таблиц в TCS используется понятие схемы (schema) – именованного пространства хранения таблиц. Каждая таблица может содержаться только в одной схеме. Имена таблиц в разных схемах могут повторяться. Схемы агрегируются в каталоги – аналоги баз данных.

Таким образом, полная иерархия хранения данных в TCS выглядит так:

каталог.схема.таблица

По умолчанию используется каталог tcs и схема public. При модификации или чтении данных из этой схемы можно использовать только имя таблицы без указания каталога и схемы. В других случаях для работы с данными нужно указывать полный путь к таблице в формате <КАТАЛОГ>.<СХЕМА>.<ТАБЛИЦА>.

SELECT * FROM customers -- tcs.public.customers
SELECT * FROM mydb.public.customers -- mydb.public.customers

Описание модели данных

Модель данных TCS описывается декларативно в файле формата YAML и является частью конфигурации всего TCS.

Описание модели данных содержит список каталогов, схем, таблиц и колонок, а также ряд параметров хранения.

Модель данных описывается следующей схемой:

tcs:
  schema:
    <CATALOG_NAME>:
      <SCHEMA_NAME>:
        <TABLE_NAME>:
          ...

Здесь tcs и schema – зарезервированные названия блоков, обязательные для использования.

Внутри блока schema описываются в порядке вложенности каталоги, схемы и таблицы. Их имена могут быть произвольными, например:

tcs:
  schema:
    db:
      public:
        ...

где:

  • db – название каталога;

  • public – название схемы.

Для использования схемы по умолчанию (tcs.public), в модели данных укажите эти названия каталога и схемы:

tcs:
  schema:
    tcs:
      public:
        ...

Внутри блока tcs также можно указать общие параметры хранения для модели данных:

  • block_size – размер блока хранения значений колонок. Значение применяется ко всем колонкам. Значение по умолчанию: 8192.

    Примечание

    В настоящее время изменение значения block_size не реализовано.

  • default_column_values_limit – максимальное количество хранимых одновременно значений каждой колонки. Более старые значения удаляются автоматически при достижении указанного количества. Это значение может быть переопределено для каждой колонки в отдельности через ее атрибут column_values_limit. По умолчанию ограничение не установлено.

tcs:
  block_size: 8192
  default_column_values_limit: 200000
  schema:
    ...

Описание таблицы

Описание таблицы состоит из двух частей:

  • настроек таблицы;

  • описаний колонок таблицы.

Настройки таблицы

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

engine: memcs

где:

  • engine – вид буферизации, строчная (движок обработки данных memtx) или колоночная (движок обработки данных memcs). По умолчанию для таблиц используется строчная буферизация (engine: memtx).

Описания колонок

Описания колонок вложены в элемент columns. Для каждой колонки можно задать следующие параметры:

columns:
  - name: id
    data_type: utf8
    column_values_limit: 100000
    indexed: true
    index_depth: 1000

где:

  • name (обязательный) - название колонки;

  • data_type (обязательный) – тип данных колонки. Возможные значения приведены в Типы данных.

  • column_values_limit – максимальное количество хранимых одновременно значений колонки. При вставке значений выше указанного предела последние по порядку вставки значения выселяются (удаляются из базы данных).

    Если атрибут указан, его значение переопределяет default_column_values_limit для конкретной колонки.

    Колонки могут быть разной длины. Допустим, есть колонки:

    • Attribute0 с column_values_limit = 10000

    • Attribute1 с column_values_limit = 1000

    Если сделать вставку из 20 тысяч строк:

    • В колонке Attribute0 будет 10000 значений из последних 10000 вставленных строк.

    • В колонке Attribute1 будет 1000 значений из последних 1000 вставленных строк.

    То есть полностью прочитать можно только последнюю 1000 строк.

    Важно

    При изменении значения column_values_limit в меньшую сторону может потребоваться удаление большого количества данных. Такое удаление приводит к выделению значительного количества оперативной памяти под временное хранение данных, что негативно сказывается на производительности. Для того чтобы не загружать оперативную память, рекомендуется запускать скрипт evict_overflowing_blocks.lua, который корректно удаляет лишние записи и не требует много памяти для временного хранения данных.

  • indexed – наличие индекса key-value по колонке. Значение по умолчанию: false.

  • index_depth – глубина индекса, то есть предельное количество проиндексированных записей, по которым может быть выполнен быстрый поиск. Значение null (как и не указанный параметр index_depth) означает, что размер индекса не ограничен.

    Важно

    • Нельзя указывать значение index_depth равное 0: это приведет к ошибке при загрузке конфигурации.

    • Для неиндексируемых колонок параметр index_depth не имеет смысла, его можно не указывать. Но если он указан, то его значение также не должно быть равным 0 (допустимо значение null или больше нуля).

    Примечание

    При необходимости в SELECT-запросе с выборкой по индексу можно использовать функцию not_indexed() и таким образом получить даже те данные, которые вышли за глубину индексации.

Пример модели данных

Ниже приведен пример модели данных, где:

  • db – каталог;

  • public – схема;

  • users– таблица с колонками id, username, is_deleted, created_at.

# tcs.yml
tcs:
  block_size: 1024
  default_column_values_limit: 20000
  schema:
    db:
      public:
        users:
          engine: memcs
          columns:
            - data_type: utf8
              index_depth: 10000
              column_values_limit: 10000
              name: id
              indexed: true
            - data_type: utf8
              column_values_limit: 1000
              name: username
            - data_type: bool
              name: is_deleted
            - data_type: ts
              name: created_at

Типы данных

В TCS используются примитивные типы данных Apache Arrow. Поддерживаются следующие типы:

Тип

Описание

i8

8-битное знаковое целое

i16

16-битное знаковое целое

i32

32-битное знаковое целое

i64

64-битное знаковое целое

u8

8-битное беззнаковое целое

u16

16-битное беззнаковое целое

u32

32-битное беззнаковое целое

u64

64-битное беззнаковое целое

f32

32-битное с плавающей точкой

f64

64-битное с плавающей точкой

decimal128

128-битное десятичное число с фиксированной точкой (до 38 значащих цифр)

decimal256

256-битное десятичное число с фиксированной точкой (до 76 значащих цифр)

bool

логический: true или false

ts

UNIX timestamp в миллисекундах

utf8

строка UTF-8

Десятичное число с фиксированной точкой

Типы данных decimal128 и decimal256 имеют обязательный параметр scale (масштаб), определяющий количество цифр после десятичной точки. При создании таблиц TCS автоматически приводит указанную точность (precision) к одному из двух поддерживаемых вариантов:

  • Любая точность в диапазоне [1, 38] будет приведена к 38 (decimal128).

  • Любая точность в диапазоне [39, 76] будет приведена к 76 (decimal256).

Установлены следующие ограничения к масштабу и точности:

  • Масштаб (scale) должен быть неотрицательным числом и не может превышать точность (precision).

  • Точность (precision) должна быть в диапазоне [1, 76].

  • Если у значения дробная часть длиннее масштаба колонки, лишние цифры просто отбрасываются (без округления).

При выполнении инструкции CREATE TABLE для указания типа данных decimal можно использовать псевдонимы. Псевдоним decimal128(scale) эквивалентен decimal(38, scale). Псевдоним decimal256(scale) эквивалентен decimal(76, scale). Однако в других контекстах, например, для приведения типов, используйте полное определение decimal(precision, scale).

При использовании подготовленных выражений явное приведение типов не требуется:

CREATE TABLE table3 (a decimal128(4));

PREPARE filter_le(decimal(38, 4)) AS SELECT * FROM table3 WHERE a <= $1;

EXECUTE filter_le('3.1415');

Загрузка модели

Модель данных является частью конфигурации TCS, которая хранится и обновляется посредством etcd.

Загружать конфигурацию в etcd следует с помощью Ansible Tarantool Enterprise.

  1. Задайте новую схему в инвентаре с конфигурацией системы (например, по ключу all:children:tcs_storages_r01:vars:tarantool_config_group:roles_cfg:app/aggregator_role:tcs:schema).

  2. Вызовите метод etcd_3_0, чтобы перезагрузить конфигурацию и применить новую схему. При необходимости задайте параметр limit:

     docker run --network host -it --rm \
     -v ${PATH_TO_PRIVATE_KEY}:/ansible/.ssh/id_private_key:Z \
     -v ${PATH_TO_INVENTORY}:/ansible/inventories/hosts.yml:Z \
     ansible-tarantool-enterprise:${DEPLOY_TOOL_VERSION_TAG} \
     ansible-playbook -i /ansible/inventories/hosts.yml \
     playbooks/etcd_3_0.yml --limit ${HOSTS}
    

Примечание

Данная процедура аналогична той, что приведена в разделе Tarantool 3.0: Отправка конфигурации в etcd в документации по инсталлятору Ansible Tarantool Enterprise.

Изменение модели

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

Важно

Не поддерживаются следующие действия:

  • Изменение типа данных в колонках и индексах. Система позволяет загружать схемы с подобными изменениями, но реально они не применяются.

  • Переименование таблиц, колонок и индексов. Вместо этого можно удалить объект и создать новый с нужным названием. Изменение названия объекта ведет к добавлению нового объекта с указанным именем.

При удалении данных о колонке из схемы таблицы, данные этой колонки удаляются из хранилища.

Нашли ответ на свой вопрос?
Обратная связь