Двигатель хранения и решение для хранения

MatrixDB поддерживает различные движки хранения и решения для хранения, из которых пользователи могут выбирать.

1. Двигатель хранения

1.1 Введение в двигатель хранения

MatrixDB поддерживает следующие движки хранения:

Тип Описание
Heap Heap-таблица — это тип хранения, предоставляемый традиционными базами данных PostgreSQL, также известный как кучные таблицы.
Этот тип таблиц поддерживает большое количество одновременных операций чтения и записи, транзакции, индексы и другие функции.
Mars1 Mars1-таблица — это собственный тип хранения MatrixDB.
Поддерживает сжатие, колоночное хранение и предварительную агрегацию, обеспечивая чрезвычайно высокую производительность в аналитических сценариях.
Однако данные должны вставляться по порядку, обновления и удаления пока не поддерживаются.
Mars2 Mars2-таблица — это движок хранения, разработанный на основе Mars1.
Поддерживает сжатие, колоночное хранение и автоматическое архивирование без ручного перевода «горячих» данных в «холодные».
Производительность при поступлении данных во времени выше, оптимизация сценариев upsert наиболее заметна.

1.2 Создание таблицы

Выше были представлены характеристики нескольких движков хранения. Теперь рассмотрим, как создавать таблицы с использованием различных движков хранения:

1.2.1 Создание Heap-таблицы

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

CREATE TABLE disk(
    time timestamp with time zone,
    tag_id int,
    read float,
    write float
)
Distributed by (tag_id);

1.2.2 Создание таблицы Mars1

Таблица Mars1 зависит от расширений matrixts и mars, поэтому перед созданием таблицы необходимо сначала создать расширение в библиотеке, использующей этот движок хранения:

CREATE EXTENSION matrixts;
CREATE EXTENSION mars;

При создании таблицы используйте USING Mars, чтобы указать движок хранения:

CREATE TABLE disk_mars(
    time timestamp with time zone,
    tag_id int,
    read float,
    write float
)
USING Mars
WITH (tagkey="tag_id", timekey="time", timebucket="8 hours")
Distributed by (tag_id);

Метаданные таблицы Mars задаются в ключевом слове WITH, включая:

  1. tag_id: поле идентификатора устройства
  2. timekey: поле временной метки
  3. timebucket: временной интервал каждой группы строк (Row Group)

Таблица Mars поддерживает колоночное сжатие. Сжатие позволяет не только уменьшить объем хранилища, но и снизить затраты на выполнение запросов.

Таблица Mars поддерживает 4 типа сжатия:

  1. rle_type
  2. zstd
  3. zlib
  4. lz4

При создании таблицы Mars тип сжатия столбца указывается через параметр compressiontype. Одновременно необходимо указать уровень сжатия (от 0 до 9) через compresslevel. Чем выше уровень, тем выше степень сжатия, меньше занимаемое пространство, но выше нагрузка на вычислительные ресурсы.

Ниже приведён пример создания таблицы Mars с помощью SQL, где для разных столбцов указаны разные типы сжатия:

CREATE TABLE disk_mars (
    time timestamp with time zone ENCODING (compresstype=rle_type, compresslevel=1),
    tag_id int ENCODING (compresstype=zstd, compresslevel=1),
    read float ENCODING (compresstype=zlib, compresslevel=1),
    write float ENCODING (compresstype=lz4, compresslevel=1)
)
USING Mars
WITH (tagkey="tag_id", timekey="time", timebucket="8 hours")
Distributed by (tag_id);

1.2.3 Создание таблицы Mars2

Таблица Mars2 зависит от расширения matrixts, поэтому перед созданием таблицы необходимо сначала создать расширение в базе данных, использующей данный движок хранения:

CREATE EXTENSION matrixts;

При создании таблицы используйте USING mars2, чтобы указать движок хранения:

CREATE TABLE metrics(
    time timestamp,
    tag_id int,
    sensor float4
)
USING mars2
Distributed by(tag_id);

Таблица Mars2 содержит следующие необязательные параметры:

Имя параметра Значение по умолчанию Минимальное значение Максимальное значение Описание
compress_threshold 1200 1 8000 Верхний предел количества кортежей для сжатия в одной группе
compressiontype lz4 -- -- Алгоритм сжатия, поддерживаемые:
1. zstd
2. zlib
3. lz4
compresslevel 1 1 -- Уровень сжатия. Чем меньше значение, тем быстрее сжатие, но хуже степень сжатия; чем больше значение, тем медленнее сжатие, но лучше степень сжатия. Разные алгоритмы имеют разные диапазоны допустимых значений:
zstd: 1–19
zlib: 1–9
lz4: 1–20

Как указано выше, эти параметры можно добавить с помощью ключевого слова WITH при создании таблицы, например:

CREATE TABLE metrics(
    time timestamp,
    tag_id int,
    sensor float4
) using mars2
WITH(compress_threshold=1200, compresstype='lz4', compresslevel=1)
Distributed by(tag_id);

После создания таблицы Mars2 необходимо дополнительно создать индекс типа mars2_btree, чтобы обеспечить нормальное чтение и запись данных. Индекс выполняет несколько основных функций:

  1. Сама функция индекса используется для быстрого поиска.
  2. Указание ключа сортировки для внутренней динамической сортировки Mars2.
    CREATE INDEX idx_metrics ON metrics USING mars2_btree(tag_id, time);

    Когда данные с одного и того же временного момента с одного устройства поступают пакетно, Mars2 может объединять данные с одного устройства за одно и то же время. Для использования функции объединения при создании индекса необходимо добавить опцию uniquemode=true:

    CREATE INDEX idx_metrics ON metrics USING mars2_btree(tag_id, time) WITH (uniquemode=true);

    2. Решение для хранения

    Выше были описаны несколько движков хранения, поддерживаемых MatrixDB в сценариях временных рядов. Ниже описывается использование различных движков хранения в рамках различных решений для хранения.

В настоящее время MatrixDB поддерживает два решения для хранения:

  1. Heap+Mars1
  2. Mars2

2.1 Heap+Mars1

В этом решении «горячие» и «холодные» данные хранятся с использованием разных движков хранения.

  1. Heap-таблицы используются для хранения «горячих» данных, поскольку «горячие» данные могут требовать обновления, что позволяет в полной мере использовать преимущества высокой производительности обновления в Heap.
  2. Таблица Mars1 хранит исторические «холодные» данные. «Холодные» данные не изменяются, после применения сжатия Mars1 они занимают меньше места и обеспечивают более высокую производительность агрегированных запросов.
  3. Необходимо явно выполнять операцию перевода «горячих» данных в «холодные», и накладные расходы этого процесса нельзя игнорировать.

Применимые сценарии: много агрегирующих запросов, бизнес имеет период низкой нагрузки для перевода «горячих» данных в «холодные»

Для подробного использования этого решения см. Практика решения хранения Heap+Mars1

2.2 Mars2

Решение Mars2 использует только один движок хранения. По сравнению с Heap+Mars1, Mars2 автоматически выполняет сжатие «холодных» данных, исключая необходимость ручного перевода «горячих» данных в «холодные».

Применимые сценарии: бизнес не имеет периода низкой нагрузки для перевода «горячих» данных в «холодные», и часто выполняются операции upsert.