Перейти к основному содержимому

OrioleDB: Движок хранения нового поколения для PostgreSQL

примечание

Эта страница переведена при помощи нейросети GigaChat.

OrioleDB — это расширение для хранения данных в PostgreSQL, использующее систему подключаемых движков хранения PostgreSQL.

Разработан как прямая замена существующего движка хранения PostgreSQL. OrioleDB создан с использованием преимуществ современного оборудования и облачной инфраструктуры, обеспечивая более высокую производительность и масштабируемость для рабочих нагрузок PostgreSQL.

Пример

OrioleDB использует механизм доступа к таблицам PostgreSQL (TAM) для предоставления подключаемого движка хранения для PostgreSQL. Ниже приведен пример создания таблицы с использованием OrioleDB:

-- Включение расширения OrioleDB
CREATE EXTENSION orioledb;

CREATE TABLE blog_post
(
id int8 NOT NULL,
title text NOT NULL,
body text NOT NULL,
PRIMARY KEY(id)
) USING orioledb; -- Использование движка хранения OrioleDB

Подключаемое хранение в PostgreSQL

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

Примеры:

create table analytics_data
(
id int8,
created_at timestamptz,
event text
) using parquet; -- Хранение данных в движке, оптимизированном для аналитики

create table timeseries_data
(
id int8,
created_at timestamptz,
event text
) using timeseries; -- Хранение данных в движке, оптимизированном для временных рядов

Аналогичная возможность уже реализована в MySQL, где начиная с версии 5.5 в качестве движка хранения по умолчанию используется InnoDB (вместо MyISAM). Подробнее об истории подключаемого хранения читайте по ссылке.

Использование OrioleDB с существующими установками PostgreSQL

В настоящее время OrioleDB требует набора патчей для PostgreSQL, расширяющих API подключаемого хранения и другие подсистемы PostgreSQL. Все эти патчи отправлены в сообщество PostgreSQL и находятся на рассмотрении.

Важным свойством данного набора патчей является сохранение бинарной совместимости. То есть, можно перейти на патченную бинарную версию PostgreSQL, сохранив тот же каталог данных. Существующие таблицы продолжат работу с движком heap по умолчанию, пока их не перевести на использование orioledb. Кроме того, возможен обратный переход к использованию оригинальных (непатченных) бинарных версий PostgreSQL. Для этого необходимо предварительно преобразовать таблицы orioledb обратно в кучу.

Цель — перевести все в основной репозиторий (upstream): после принятия данных патчей OrioleDB сможет работать на любой установке PostgreSQL без каких-либо модификаций. Это также позволит всему сообществу PostgreSQL создавать собственные подключаемые движки хранения.

До этого момента можно воспользоваться готовым образом Docker для тестирования OrioleDB. Образ Docker содержит патченную версию PostgreSQL с предварительно установленным OrioleDB. Для начала работы следуйте руководству «Быстрый старт».

Набор патчей

Полный набор патчей доступен по ссылке.

Следующие патчи отправлены в сообщество PostgreSQL для расширения интерфейса TAM и других подсистем:

НазваниеСсылкаВерсия
Добавление недостающих поисков неравенства в rbtreeСсылкаPostgreSQL 16
Документирование возможности указания TableAM для pgbenchСсылкаPostgreSQL 16
Удаление функции Tuplesortstate.copytupСсылкаPostgreSQL 16
Добавление новой функции Tuplesortstate.removeabbrevСсылкаPostgreSQL 16
Перенос логики аббревиатур в puttuple_common()СсылкаPostgreSQL 16
Перенос управления памятью из writetup() и tuplesort_put*()СсылкаPostgreSQL 16
Разделение TuplesortPublic и TuplesortstateСсылкаPostgreSQL 16
Разделение tuplesortvariants.c и tuplesort.cСсылкаPostgreSQL 16
Исправление опечатки в комментарии к функции writetuple()СсылкаPostgreSQL 16
Поддержка пользовательских слотов в пользовательских узлах исполнителяСсылкаPostgreSQL 16
✉️Разрешить table AM хранить сложные структуры данных в rd_amcacheСсылкаPostgreSQL 18
✉️Разрешить методу tuple_insert() table AM возвращать другой слотСсылкаPostgreSQL 18
✉️Добавление метода TupleTableSlotOps.is_current_xact_tuple()СсылкаPostgreSQL 18
✉️Разрешить блокировку обновленных кортежей в tuple_update() и tuple_delete()СсылкаPostgreSQL 18
✉️Добавление теста изоляции delete returning EvalPlanQualСсылкаPostgreSQL 18
✉️Обобщение анализа отношений в интерфейсе table AMСсылкаPostgreSQL 18
✉️Пользовательские reloptions для table AMСсылкаPostgreSQL 18
✉️Разрешить методам вставки table AM управлять вставкой индексовСсылкаPostgreSQL 18

✅ — Патч принят.

✉️ — Патч отправлен и находится на рассмотрении сообществом PostgreSQL.

Возможности

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

Открытый исходный код

OrioleDB распространяется под стандартной лицензией PostgreSQL. Цель — перевести все патчи, необходимые для работы OrioleDB, в основной репозиторий PostgreSQL, чтобы расширение могло работать на любой установке PostgreSQL без каких-либо модификаций.

Создан для современного оборудования

Архитектура OrioleDB избегает узких мест устаревших процессоров на современных серверах с десятками и сотнями ядер CPU, обеспечивая оптимизированное использование современных технологий хранения, таких как SSD и NVRAM.

Снижение требований к обслуживанию

OrioleDB реализует концепции журнала отката (undo) и page-mergins, что исключает необходимость в специализированных процессах сборки мусора. Кроме того, OrioleDB реализует 64-битные идентификаторы транзакций по умолчанию, тем самым устранив широко известную проблему переполнения (wraparound).

Создан для распределенной работы

OrioleDB реализует WAL на уровне строк с поддержкой параллельного применения. Данная архитектура журнала оптимизирована для репликации на основе протокола консенсуса RAFT, что позволяет реализовать активную мультимастер-репликацию (active-active multimaster).

Отличительные особенности

Ключевые технические отличия OrioleDB.

Отсутствие маппинга буферов и бесстопорное чтение страниц

In-memory страницы в OrioleDB связаны прямыми ссылками со страницами хранения. Это исключает необходимость маппинга в буфере и связанных с этим узких мест. Кроме того, в OrioleDB чтение in-memory страниц не включает атомарные операции. В совокупности данные архитектурные решения поднимают вертикальную масштабируемость PostgreSQL на совершенно новый уровень.

MVCC на основе концепции журнала отката (undo)

В OrioleDB старые версии кортежей не вызывают разрастание (bloat) в основной системе хранения, а вытесняются в журнал отката (undo), образуя цепи отката. Записи отката на уровне страниц позволяют системе быстро освобождать пространство, занимаемое удаленными кортежами. В совокупности с page-mergins данные механизмы устраняют разрастание в большинстве случаев. Специализированная очистка таблиц с помощью VACUUM также не требуется, что устраняет значимую и распространенную причину деградации производительности системы и отказов баз данных.

Контрольные точки copy-on-write и WAL на уровне строк

OrioleDB использует контрольные точки copy-on-write, что обеспечивает структурно согласованный снимок данных в любой момент времени. Данный подход оптимален для современных SSD и позволяет вести журнал WAL на уровне строк. В свою очередь, логирование WAL на уровне строк легко параллелизуется (реализовано), компактно и подходит для активной мультимастер-репликации (планируется).