Rbytea

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


Тип данных rbytea

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

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

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

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


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

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

CREATE EXTENSION rbytea CASCADE;

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

shared_preload_libraries = 'librbytea'

Описание параметров расширения приведено ниже.


Конфигурация

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

rbytea.filesystem_storage_path (string)

Определение каталога (точки монтирования файловой системы/тома) для сохранения образов данных.
Двоичные данные будут сохраняться в данном каталоге сервера. Для каждой базы будет создаваться свой подкаталог (по OID базы), а внутри него, во множестве подкаталогов, — собственно файлы с данными.
Имена вложенных каталогов от каталога базы данных до файла будут составлять uuid типа rbytea, а расширение файла — номер транзакции, в которой данные впервые появились в системе.
Каталог должен быть доступен на чтение и запись в него для пользователя, от имени которого запускается сервер баз данных.
По умолчанию, если параметр опущен или пуст, каталогом для сохранения двоичных данных назначается '<каталог_базы_данных>'.

shared_preload_libraries (string)

Загрузка разделяемой библиотеки при старте QHB.
Данный параметр обеспечивает загрузку разделяемой библиотеки при старте QHB и инициализацию фонового процесса для очистки устаревших образов. В противном случае автоочистка устаревших образов производится не будет.
Необходимо добавить значение 'librbytea'.

Примечание
Если параметр shared_preload_libraries уже содержит указание на загрузку других библиотек, нужно не перезаписать его значение, а добавить через разделитель librbytea.

rbytea.worker_restart_time (integer)

Интервал запуска фонового процесса очистки.
Фоновый процесс не работает постоянно. Поскольку данные достаточно статичны, не требуется запускать процесс очистки слишком часто. Задержка от окончания предыдущего запуска до следующего запуска задается в данном параметре. Значение указывается в секундах. Значение по умолчанию — 86400 секунд (сутки).

rbytea.databases_for_vacuuming (string)

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

rbytea.filesystem_qss_mode (integer)

Данным параметром регулируется шифрование всех столбцов типа rbytea, а не по отдельности для каждой таблицы. Однако допускается иметь одновременно шифрованные и не шифрованные значения rbytea. Каждое отдельное значение шифруется (или не шифруется) в зависимости от значения параметра в конкретный момент времени. Значение по умолчанию — 0 (шифрование отключено). Для запуска шифрования в параметре необходимо установить значение 2. Таким образом, возможно включать и отключать шифрование rbytea. Но включение не зашифрует старые значения rbytea.

ВНИМАНИЕ!
При шифровании rbytea невозможен такой режим эксплуатации значений этого типа, когда данные типа rbytea хранятся в единственном экземпляре для нескольких узлов кластера на сетевом хранилище, т. к. разные узлы будут использовать разные ключи QSS.

Примечание
При qss_mode = 0 значение параметра rbytea.filesystem_qss_mode игнорируется, см. подраздел Параметры конфигурации QSS.


Функции для работы с типом 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 (см. параграф Конфигурация), может:

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

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

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


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

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

ALTER EXTENSION rbytea UPDATE TO '1.2';

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

CREATE EXTENSION rbytea CASCADE;

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

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

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

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

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