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

Тип данных rbytea

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

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

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

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

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

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

create extension rbytea cascade;

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

shared_preload_libraries = 'librbytea'

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

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

ИмяТип результатаОписание
uuid(col rbytea)uuidПолучить идентификатор данных
len(col rbytea)bigintПолучить длину данных в байтах
len_full(col rbytea)bigintПолучить длину в байтах данных с учетом выравнивания для шифрования
qss_mode(col rbytea)bigintВозвращает признак шифрования данных (1) или его отсутствия (0)
md5sum(col rbytea)textВозвращает md5 сумму данных
sha256sum(col rbytea)textВозвращает sha256 сумму данных
md5store(col rbytea)textВозвращает md5 сумму зашифрованных данных во внешнем хранилище
sha256store(col rbytea)textВозвращает sha256 сумму зашифрованных данных во внешнем хранилище
rvacuum()bigintВыполняет очистку устаревших данных в хранилище

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

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

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

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

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

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

Определение каталога (точки монтирования файловой системы / тома) для сохранения образов данных

rbytea.filesystem_storage_path = '/mnt/fs'

Двоичные данные будут сохранятся в данном каталоге сервера. Для каждой базы будет создаваться свой подкаталог (по oid базы), а внутри него, во множестве подкаталогов - собственно файлы с данными.

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

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

По-умолчанию, если параметр опущен или пуст, каталогом для сохранения двоичных данных назначается <каталог базы данных>/rbytea.

Загрузка разделяемой библиотеки при старте QHB:

shared_preload_libraries = 'librbytea'

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

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

Интервал запуска фонового процесса очистки

rbytea.worker_restart_time = 86400

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

Значение указано в секундах. По умолчанию, параметр устанавливается в значение 86400 секунд (сутки).

Задание баз данных для фонового процесса очистки

rbytea.databases_for_vacuuming = 'qhb'

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

Включение фонового шифрования

rbytea.filesystem_qss_mode = 0

Если в системе доступно фоновое шифрование при записи на диск, данный параметр позволяет зашифровывать также и двоичные данные rbytea. Для шифрования параметр необходимо установить в значение 1.

При шифровании данных, данные дополняются (выравниваются) до границы 16-байтных блоков. Поэтому функции len(rbytea) и len_full(rbytea) для одних и тех же данных могут возвращать разное значение. А функции md5store(rbytea) и sha256store(rbytea) подсчитывают контрольные суммы для зашифрованных данных, дополненных до границы 16-байтного блока.

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

По-умолчанию, параметр устанавливается в значение 0.