Rbytea

Rbytea — внешнее хранение двоичных данных.


Тип данных rbytea

Тип данных rbytea предназначен для хранения двоичных данных. Он аналогичен типу bytea, с той лишь разницей, что сами данные хранятся не в табличном пространстве базы, а во внешнем хранилище. В качестве внешнего хранилища в текущей версии QHB выступает файловая система. Это может быть смонтированный в определенную точку файловой системы сервера внешний том или символическая ссылка.

Основной целью расширения является вынос двоичных данных из таблиц базы данных в нетранзакционное хранилище, тем самым разгрузив базу данных (зачастую двоичные данные имеют большой объем, который занимает значительный процент от общего размера базы, усложняя администрирование и обслуживание).

Тип данных rbytea в записи базы данных оставляет только небольшой заголовок, в котором содержатся служебные поля и ссылка на файл во внешнем хранилище. В качестве ссылки используется тип данных uuid, а генерация случайных идентификаторов использует возможности модуля pgcrypto.

Данные во внешнем хранилище могут быть зашифрованы алгоритмом Кузнечик.


Установка расширения

Установка расширения производится командой CREATE EXTENSION:

CREATE EXTENSION rbytea CASCADE;

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

shared_preload_libraries = 'librbytea'

Описание параметров расширения приведены ниже в параграфе Параметры конфигурации расширения.


Функции для работы с типом rbytea

ИмяТип результатаОписание
uuid(rbytea)uuidВозвращает идентификатор данных
len(rbytea)bigintВозвращает длину данных в байтах
qss_mode(rbytea)bigintВозвращает признак зашифрования данных или его отсутствия
md5(rbytea)textВозвращает md5 сумму данных
sha256(rbytea)textВозвращает sha256 сумму данных
ext_file_dir(rbytea)textВозвращает каталог хранения данных
(абсолютный или от $PGDATA)
ext_file_path(rbytea)textВозвращает полное имя файла хранения данных
(путь абсолютный или от $PGDATA)
trash_file_dir(rbytea)textВозвращает каталог хранения удалённых данных
(абсолютный или от $PGDATA)
trash_file_path(rbytea)textВозвращает полное имя файла хранения удалённых данных
(путь абсолютный или от $PGDATA)
txid_created(rbytea)bigintВозвращает идентификатор транзакции, во время которой были созданы данные
rvacuum()bigintВыполняет очистку устаревших данных в хранилище

Фоновый процесс очистки устаревших копий

Поскольку на файловую систему не распространяется транзакционность базы данных, во внешнем хранилище могут оставаться данные полей таблиц типа rbytea, которые были удалены или сохранены в незаконченных, отмененных транзакциях. Поэтому периодически запускается фоновый процесс очистки, который проходит по некоторому диапазону транзакций, очищая данные. При этом файлы перемещаются в каталог TRASH, который создается для каждой базы данных, указанной в параметре rbytea.databases_for_vacuuming.

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

Параметры запуска указаны в параграфе ниже.


Особенности функционирования расширения rbytea

Rbytea в кластере и при использовании шифрования

При работе расширения в кластере существуют некоторые ограничения.

Каталог (точки монтирования файловой системы/тома) для сохранения образов данных, задаваемый в параметре rbytea.filesystem_storage_path, см. Параметры конфигурации расширения Rbytea, может:

  • указывать на каталог в рамках одного локального хоста и использоваться исключительно этим одним хостом кластера,
  • или на некоторый каталог сетевого файлового хранилища, используемого сразу всеми хостами кластера.

В первом случае, образы данных будут доступны только на данном конкретном хосте, где они и были созданы, и обращение к данным на других хостах кластера будет приводить к ошибке. Но, в данном случае, возможно использование шифрование данных с использованием QSS.

Во втором случае, образы данных будут доступны на всех хостах кластера, но использование шифрования в текущей версии QHB и расширения rbytea запрещено, поскольку каждый хост кластера обязан использовать свои рабочие ключи QSS, и зашифрованные одним ключом данные будут недоступны на других хостах (попытка чтения будет приводить к ошибке).

Обновление расширения с предыдущих версий

Версия расширения rbytea версии 1.2 существенно отличается от предыдущих версий расширения. Из-за этого нет возможности провести обновление расширения с ранних версий на текущую с использованием команды

ALTER EXTENSION rbytea UPDATE TO '1.2';

Возможно только удаление расширения предыдущей версии и создание уже с текущей версией командой

CREATE EXTENSION rbytea CASCADE;

При этом необходимо позаботиться о сохранении образов данных, если нет цели их полного пересоздания с потерей.

Это можно сделать миграцией

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

Подробные шаги такой миграции остаются на усмотрение администратора БД.

Разработчики QHB планируют разработку инструментария поддержки таких миграций в одном их следующих релизов.


Параметры конфигурации расширения

Для работы расширения нужно установить несколько параметров в конфигурационном файле (подробную информацию см. в подразделе Параметры конфигурации расширения Rbytea).