Внешнее хранение двоичных данных Rbytea
- Тип данных rbytea
- Установка расширения
- Функции для работы с типом 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.