Внешнее хранение двоичных данных 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

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

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

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

rbytea.databases_for_vacuuming = 'qhb'

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

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

rbytea.filesystem_qss_mode = 0

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

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

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

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